[nunit] NUnit 테스트를 병렬로 실행하려면 어떻게해야합니까?

NUnit을 사용하여 작성된 대규모 수용 테스트 (테스트 당 최대 10 초) 테스트 스위트가 있습니다. 내 컴퓨터가 모두 다중 코어 박스라는 사실을 활용하고 싶습니다. 이상적으로는 다른 테스트와 독립적으로 코어 당 하나의 테스트를 실행할 수 있습니다.

PNUnit이 있지만 스레딩 동기화 문제 및 이와 같은 문제를 테스트하기 위해 설계되었으며이 작업을 수행하는 확실한 방법을 찾지 못했습니다.

테스트를 병렬로 실행하는 데 사용할 수있는 스위치 / 도구 / 옵션이 있습니까?



답변

NUnit 테스트를 병렬로 실행하려면 최소한 두 가지 옵션이 있습니다.

  • NCrunch는 즉시 사용할 수 있습니다 (아무것도 변경하지 않고 상용 제품 임).
  • NUnit 3은 병렬 로 실행할 수있는 테스트를 나타내는 데 사용할 수 있는 Parallelizable 속성을 제공합니다.


답변

NUnit 버전 3은 병렬 테스트 실행을 지원합니다.

클래스에 속성 추가 : [Parallelizable(ParallelScope.Self)]테스트를 병렬로 실행합니다.

• ParallelScope.None은 테스트가 다른 테스트와 병렬로 실행되지 않을 수 있음을 나타냅니다.

• ParallelScope.Self는 테스트 자체가 다른 테스트와 병렬로 실행될 수 있음을 나타냅니다.

• ParallelScope.Children은 테스트의 하위 항목이 서로에 대해 병렬로 실행될 수 있음을 나타냅니다.

• ParallelScope.Fixtures는 조명기가 서로 병렬로 실행될 수 있음을 나타냅니다.

NUnit 프레임 워크-병렬 테스트-실행


답변

프로젝트에 여러 테스트 DLL이 포함 된 경우이 MSBuild 스크립트를 사용하여 병렬로 실행할 수 있습니다. 당연히 프로젝트 레이아웃에 맞게 경로를 조정해야합니다.

8 개의 코어로 실행하려면 다음을 사용하십시오. c:\proj> msbuild /m:8 RunTests.xml

RunTests.xml

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="RunTestsInParallel" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/>
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Release</Configuration>
    <Nunit Condition=" '$(Nunit)' == '' ">$(MSBuildProjectDirectory)\..\tools\nunit-console-x86.exe</Nunit>
  </PropertyGroup>

  <!-- see http://mikefourie.wordpress.com/2010/12/04/running-targets-in-parallel-in-msbuild/ -->

  <Target Name="RunTestsInParallel">
    <ItemGroup>
      <TestDlls Include="..\bin\Tests\$(Configuration)\*.Tests.dll" />
    </ItemGroup>

    <ItemGroup>
      <TempProjects Include="$(MSBuildProjectFile)" >
        <Properties>TestDllFile=%(TestDlls.FullPath)</Properties>
      </TempProjects>
    </ItemGroup>

    <MSBuild Projects="@(TempProjects)" BuildInParallel="true" Targets="RunOneTestDll" />
  </Target>

  <Target Name="RunOneTestDll">
    <Message Text="$(TestDllFile)" />
    <Exec Command="$(Nunit) /exclude=Integration $(TestDllFile)  /labels /xml:$(TestDllFile).results.xml"
      WorkingDirectory="$(MSBuildProjectDirectory)\..\bin\Tests\$(Configuration)" />
  </Target>

</Project>

업데이트
지금이 질문에 답했다면 최대 테스트 실행 성능을 위해 NCrunch 및 명령 줄 테스트 실행 도구를 적극 권장 합니다. 이와 같은 것은 없으며 코드-테스트-디버그주기를 동시에 혁신 할 것입니다.


답변

에서 이 문서 시험을 가속화하기 위해 포스터 명령 매개 변수는 각 인스턴스 실행해야 테스트하는 지정와 NUnit과의 여러 인스턴스를 실행하는 것을 언급한다.

FTA :

이상한 문제가 발생했습니다.

nunit-console을 사용하여 지속적 통합 서버에서 테스트를 실행합니다. 최근에는 Nunit 2.4.8에서 2.5.5로, .Net 3.5에서 4.0으로 이동했습니다. 테스트 실행 속도를 높이기 위해 다른 명령 줄 인수와 병렬로 Nunit의 여러 인스턴스를 실행합니다.

  • 테스트 어셈블리의 두 복사본과 폴더 A와 B에 nunit 바이너리가 있습니다.
  • 폴더 A에서 우리는

nunit-console-x86.exe Model.dll Test.dll / exclude : MyCategory /xml=TestResults.xml /framework=net-4.0 / noshadow

  • 폴더 B에서 우리는

nunit-console-x86.exe Model.dll Test.dll / include : MyCategory /xml=TestResults.xml /framework=net-4.0 / noshadow

순서대로 명령을 실행하면 둘 다 성공적으로 실행됩니다. 그러나 병렬로 실행하면 하나만 성공합니다. 내가 알 수있는 한 테스트 픽스처를 처음로드하는 것이 바로 그것입니다. 다른 하나는 “고정기를 찾을 수 없음”메시지와 함께 실패합니다.

이 문제가 이미 알려져 있습니까? 런치 패드의 버그 목록에서 관련 내용을 찾을 수 없습니다. BTW 당사 서버는 Windows Server 2008 64 비트를 실행합니다. Windows 7 64 비트에서도 문제를 재현 할 수 있습니다.

이 버그가 수정되었거나 소프트웨어의 최신 버전을 실행하고 있지 않다고 가정하면 해당 기술을 복제 할 수 있습니다.

최신 정보

TeamCity 는 NUnit 테스트를 자동으로 실행하는 데 사용할 수있는 도구처럼 보입니다. 그들은는 NUnit과 실행이 가지고 여기에 설명 여러 NUnit과 인스턴스를 시작하는 데 사용 될 수있는. 다음 은 여러 NUnit XML 결과를 단일 결과 파일로 병합하는 방법에 대한 블로그 게시물입니다.

따라서 이론적으로 TeamCity가 여러 NUnit 테스트를 자동으로 시작하도록 할 수 있지만 워크로드를 분할 한 다음 테스트 후 처리를 위해 결과를 단일 파일로 병합합니다.

귀하의 요구에 맞게 충분히 자동화되어 있습니까?


답변

PNUnit이 테스트 코드 내에서 동기화를 수행 할 수 있다고해서 실제로 해당 측면을 사용해야하는 것은 아닙니다. 내가 볼 수있는 한 세트를 생성하고 필요할 때까지 나머지를 무시하는 것을 막을 수있는 것은 없습니다.

BTW 나는 그들의 모든 소스를 읽을 시간이 없지만 Barrier 클래스를 확인하고 싶었고 매우 간단한 잠금 카운터입니다. N 개의 스레드가 입력 될 때까지 기다린 다음 모든 스레드가 동시에 실행되도록 펄스를 보냅니다. 그게 전부입니다. 만지지 않으면 물지 않습니다.

일반 스레드 개발에서는 약간 직관적 일 수 있지만 (잠금은 일반적으로 액세스를 직렬화하는 데 사용됩니다-1 x 1) 상당히 활발한 전환입니다 🙂


답변

이제 NCrunch 를 사용 하여 단위 테스트를 병렬화 할 수 있으며 NCrunch 에서 사용해야 하는 코어 수와 Visual Studio에서 사용해야하는 코어 수를 구성 할 수도 있습니다.

게다가 당신은 보너스로 지속적인 테스트를받습니다 🙂


답변

모든 테스트 클래스에 Parallelizable 속성을 추가하는 대신 :

nunit3 이상의 테스트 프로젝트 AssemblyInfo.cs 클래스에 다음을 추가하십시오.

// Make all tests in the test assembly run in parallel
[assembly: Parallelizable(ParallelScope.Fixtures)]