web-dev-qa-db-ja.com

.netテストを解決する方法が「テストの実行を開始しています。しばらくお待ちください...」でハングします。

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>
8
David Masters

バージョン管理は赤いニシンであり、はるかに単純な問題であることが判明しました。私のテストは非同期コントローラーメソッドをテストしており、非非同期テストは次のことを行っていました。

var result = controller.PostAsync(request).Result;

非同期/待機パターンを使用するようにテスト自体を変更するとすぐに、正常に機能しました。

var result = await controller.PostAsync(request);

問題の診断に役立ったのは、dotnet test --verbosity d引数を使用することでした。これを使用すると、「テストの実行を開始します。しばらくお待ちください」ではなく、合格したいくつかのテストが出力されていました。興味深いことに、コマンドを実行するたびに、スタックしているように見える前に、異なる数のテストが実行されます。これは、おそらく何らかのスレッドデッドロックの問題があり、それが私を解決に導いたことを示唆していました。コマンドがローカルマシンで正常に実行されたのに、Jenkinsスレーブでは実行されなかった理由はまだわかりません。

7
David Masters

テストランナーパイプラインが並列スレッドを処理できないため、xUnitテストが永久にハングすることがあります。

それが問題であるかどうかを確認するには、テストプロジェクトのルートにxunit.runner.jsonファイルを追加してみてください

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

そして、1つのスレッド構成の中に入れます。

{
  "parallelizeTestCollections": true,
  "maxParallelThreads": -1
}
9
Dmitry Pavlov

私のために働いた解決策は、次の内容のAssemblyInfo.csファイルを追加することでした。

using Xunit;

[Assembly: CollectionBehavior(DisableTestParallelization = true)]

これを実行すると、CIビルド(私の場合はAzure Pipelines)でテストの実行が再開されました。

1
Andrew Backes

Microsoft.NET.Test.Sdkを15.9から16.3に更新すると、csprojファイルに役立ちました。