jenkins 如何解决.net测试在“正在启动测试执行,请稍候...”时挂起的问题

thigvfpy  于 2022-11-02  发布在  Jenkins
关注(0)|答案(6)|浏览(200)

我尝试在Jenkins构建服务器上从命令行执行dotnet test,但它挂起在:
Starting test execution, please wait...
在本地运行此命令时,它可以正常工作
如果我切换到使用dotnet xunit,则会失败,并显示以下内容:

15:42:57 Locating binaries for framework netcoreapp2.1...
15:42:58 Running .NET Core 2.1 tests for framework netcoreapp2.1...
15:42:58 The specified framework version '2.1' could not be parsed
15:42:58 The specified framework 'Microsoft.NETCore.App', version '2.1' was not found.
15:42:58   - Check application dependencies and target a framework version installed at:
15:42:58       C:\Program Files\dotnet\
15:42:58   - Installing .NET Core prerequisites might help resolve this problem:
15:42:58       http://go.microsoft.com/fwlink/?LinkID=798306&clcid=0x409
15:42:58   - The .NET Core framework and SDK can be installed from:
15:42:58       https://aka.ms/dotnet-download
15:42:58   - The following versions are installed:
15:42:58       2.0.6 at [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
15:42:58       2.0.9 at [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
15:42:58       2.1.2 at [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
15:42:58       2.1.3 at [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
15:42:58       2.1.4 at [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]

根据错误消息,我们已经在服务器上安装了dotnet核心SDK,但我们似乎遗漏了一些东西。
我的测试项目如下所示:

<Project Sdk="Microsoft.NET.Sdk">    
  <PropertyGroup>
    <TargetFramework>netcoreapp2.1</TargetFramework>    
    <IsPackable>false</IsPackable>
  </PropertyGroup>    
  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.App" Version="2.1.1" />
    <PackageReference Include="Microsoft.AspNetCore.Mvc.Core" Version="2.1.1" />
    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.7.0" />
    <PackageReference Include="Moq" Version="4.10.0" />
    <PackageReference Include="RichardSzalay.MockHttp" Version="5.0.0" />
    <PackageReference Include="xunit" Version="2.3.1" />
    <PackageReference Include="xunit.runner.console" Version="2.4.0" />
    <PackageReference Include="xunit.runner.visualstudio" Version="2.3.1" />
    <DotNetCliToolReference Include="dotnet-xunit" Version="2.3.1" />
  </ItemGroup>        
</Project>
szqfcxe2

szqfcxe21#

版本控制是一个红鲱鱼,它被证明是一个简单得多的问题。我的测试是测试异步控制器方法,我的非异步测试做:
var result = await controller.PostAsync(request);
当我将测试本身更改为使用async/await模式时,它们运行得很好:
var result = await controller.PostAsync(request);
使用dotnet test --verbosity d参数可以帮助我诊断这个问题,请等待”。有趣的是,每次我运行该命令时,它都会在出现卡住之前执行不同数量的测试。这表明可能存在某种线程死锁问题,这使我找到了解决方案。我“我仍然不确定为什么该命令在我的本地计算机上运行良好,但在我们的Jenkins代理上却不行。

wztqucjr

wztqucjr2#

有时候,xUnit测试会永远挂起,因为测试运行器管道无法处理并行线程。
要检查这是否是问题所在,请尝试将xunit.runner.json文件添加到测试项目根目录

<ItemGroup>
    <None Update="xunit.runner.json">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
  </ItemGroup>

并放入1个线程配置。

{
  "parallelizeTestCollections": true,
  "maxParallelThreads": -1
}
goucqfw6

goucqfw63#

对我有效的解决方案是添加一个包含以下内容的AssemblyInfo.cs文件:

using Xunit;

[assembly: CollectionBehavior(DisableTestParallelization = true)]

一旦我这样做了,测试就再次开始在我的CI构建中运行(在我的例子中,是Azure管道)。

56lgkhnf

56lgkhnf4#

我的问题是构造函数中的一个异步方法:

MyAsyncMethod().GetAwaiter().GetResult();

我通过将async方法移出构造函数并实现xunits IAsyncLifetime接口(Await Tasks in Test Setup Code in xUnit.net?)修复了这个问题

public async Task InitializeAsync()
{
    await MyAsyncMethod();
}
gmxoilav

gmxoilav5#

将Microsoft.NET.Test.Sdk从15.9版更新到16.3版有助于csproj文件的执行。

20jt8wwn

20jt8wwn6#

以防万一这能帮到某人,在一个随机的时间,这行开始随机挂起我们的测试

_task = Task.Factory.StartNew(async () =>
  {
    await Task.Delay((int)cleanInterval.TotalMilliseconds, _cancellationTokenSource.Token);
-->     while (!_cancellationTokenSource.Token.IsCancellationRequested)

相关问题