Как устранить зависание теста .net при запуске теста, подождите

Я пытаюсь выполнить dotnet test из командной строки на нашем сервере сборки Jenkins, но он просто зависает:

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]

Судя по сообщению об ошибке, мы установили пакет SDK dotnet core на сервер, но, похоже, что-то упустили.

Мой тестовый проект выглядит так:

<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>

person David Masters    schedule 18.09.2018    source источник
comment
имейте в виду, что когда вы добавляете версию = 2.1.1 в свой проект, вам потребуется установить среду выполнения 2.1.1 на ваших серверах развертывания, чтобы ваше приложение работало. - github.com/aspnet/Home/issues/3250#issuecomment-403872208   -  person MUG4N    schedule 18.09.2018


Ответы (5)


Управление версиями было отвлекающим маневром, и оказалось, что это гораздо более простая проблема. Мои тесты проверяли методы асинхронного контроллера, а мои неасинхронные тесты выполняли:

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

как только я изменил сами тесты, чтобы использовать шаблон async/await, они заработали нормально:

var result = await controller.PostAsync(request);

Что-то, что помогло мне диагностировать проблему, заключалось в использовании аргумента dotnet test --verbosity d. При использовании этого он выводил некоторые проходящие тесты, а не просто запускал выполнение теста, подождите. Интересно, что каждый раз, когда я запускаю команду, она выполняет разное количество тестов, прежде чем застревает. Это предположило, что, возможно, возникла какая-то проблема с тупиковой блокировкой потока, которая привела меня к решению. Я до сих пор не понимаю, почему команда работала нормально на моей локальной машине, но не на нашем агенте Jenkins.

person David Masters    schedule 21.09.2018
comment
В моем случае это был .Wait() . Спасибо за совет. - person Romesh D. Niriella; 22.08.2019

Иногда xUnit тесты зависают навсегда, потому что конвейер запуска тестов не может обрабатывать параллельные потоки.

Чтобы проверить, не в этом ли проблема, попробуйте добавить файл xunit.runner.json в корень тестового проекта.

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

И положить внутрь 1 потока конфиг.

{
  "parallelizeTestCollections": true,
  "maxParallelThreads": -1
}
person Dmitry Pavlov    schedule 03.06.2019
comment
Я использовал `parallizeTestCollections: false`, чтобы не запускать тесты параллельно, что было моей проблемой. - person worldwildwebdev; 08.07.2020
comment
Как можно подойти к решению этой проблемы, чтобы запускать тесты параллельно? Это именно то, что я наблюдал как локально при выполнении тестов xUnit в Rider, так и в конвейере выпуска Azure. - person Vladyslav Babych; 11.06.2021

Решение, которое сработало для меня, состояло в том, чтобы добавить файл AssemblyInfo.cs со следующим содержимым:

using Xunit;

[assembly: CollectionBehavior(DisableTestParallelization = true)]

Как только я это сделал, тесты снова начали выполняться в моих сборках CI (в моем случае Azure Pipelines).

person Andrew Backes    schedule 26.08.2019

Моя проблема заключалась в асинхронном методе внутри конструктора:

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

Я исправил проблему, переместив асинхронный метод из конструктора и внедрив интерфейс xunits IAsyncLifetime (Await Tasks в коде настройки теста в xUnit.net?)

public async Task InitializeAsync()
{
    await MyAsyncMethod();
}
person Dorothy Hawley    schedule 12.05.2021

Обновление Microsoft.NET.Test.Sdk с 15.9 до 16.3 помогло в файле csproj.

person Юрий Мазуренко    schedule 10.10.2019