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 core 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>
バージョン管理は赤いニシンであり、はるかに単純な問題であることが判明しました。私のテストは非同期コントローラーメソッドをテストしており、非非同期テストは次のことを行っていました。
var result = controller.PostAsync(request).Result;
非同期/待機パターンを使用するようにテスト自体を変更するとすぐに、正常に機能しました。
var result = await controller.PostAsync(request);
問題の診断に役立ったのは、dotnet test --verbosity d
引数を使用することでした。これを使用すると、「テストの実行を開始します。しばらくお待ちください」ではなく、合格したいくつかのテストが出力されていました。興味深いことに、コマンドを実行するたびに、スタックしているように見える前に、異なる数のテストが実行されます。これは、おそらく何らかのスレッドデッドロックの問題があり、それが私を解決に導いたことを示唆していました。コマンドがローカルマシンで正常に実行されたのに、Jenkinsスレーブでは実行されなかった理由はまだわかりません。
テストランナーパイプラインが並列スレッドを処理できないため、xUnit
テストが永久にハングすることがあります。
それが問題であるかどうかを確認するには、テストプロジェクトのルートにxunit.runner.json
ファイルを追加してみてください
<ItemGroup>
<None Update="xunit.runner.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>
そして、1つのスレッド構成の中に入れます。
{
"parallelizeTestCollections": true,
"maxParallelThreads": -1
}
私のために働いた解決策は、次の内容のAssemblyInfo.cs
ファイルを追加することでした。
using Xunit;
[Assembly: CollectionBehavior(DisableTestParallelization = true)]
これを実行すると、CIビルド(私の場合はAzure Pipelines)でテストの実行が再開されました。
Microsoft.NET.Test.Sdkを15.9から16.3に更新すると、csprojファイルに役立ちました。