Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: David MastersОтветов: 5

Я пытаюсь выполнить 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>
  • имейте в виду, что когда вы добавляете версию = 2.1.1 в свой проект, вам потребуется установить среду выполнения 2.1.1 на ваших серверах развертывания, чтобы ваше приложение работало. - github.com/aspnet/Home/issues/3250#issuecomment-403872208 MUG4N 18.09.2018

jenkinsunit-testing

Ответы

Ответ 1 · рейтинг 12 · David Masters

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

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

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

var result = await controller.PostAsync(request);

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

Ответ 2 · рейтинг 11 · Dmitry Pavlov

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

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

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

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

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

Ответ 3 · рейтинг 1 · Andrew Backes

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

using Xunit;

[assembly: CollectionBehavior(DisableTestParallelization = true)]

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

Ответ 4 · рейтинг 1 · Dorothy Hawley

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

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

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

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

Ответ 5 · Юрий Мазуренко

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы