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


83

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

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

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


나도 이것에 대해 더 알고 싶습니다. @Billy ONeal 답변을 찾으면 게시하십시오.
PK

테스트 당 10 초, 이상적으로는 코어 당 하나의 테스트 실행이라고 말합니다. CPU를 많이 사용하는 테스트입니까? 그렇지 않으면 동시에 더 많은 것을 실행할 수 있어야합니다.
Mattias Nilsson

@Mattias : 예, 테스트는 CPU 집약적입니다.
Billy ONeal 2010 년

답변:


52

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

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

이 대답은 질문을 감안할 때 잘못된 것처럼 보이며 실제 대답보다 좋은 제안입니다. 내 마음에 NCrunch는 귀하의 업 보트가 필요하며 동일한 또는 여러 프로세스 내에서 하나 또는 여러 시스템에서 동시에 (NUnit) 테스트를 실행할 수 있으며 VS 또는 빌드 서버에서 수행 할 수 있으므로 최고의 답변이되어야합니다.
chillitom

2
@chillitom NCrunch는이 질문에 대한 답변을받은 후 출시되었으며 좋은 선택입니다 (일부에게는 지나치게 비싸지 만 상자에서 바로 작동해야하기 때문입니다). 향후 다른 옵션에는 NUnit 3이 포함될 수 있으며, 이는 테스트의 병렬 실행을 제공 할 수 있습니다 ( github.com/nunit/dev/wiki/Roadmap 에 따라 ).
David_001

3
이것이 최고의 답변이지만 더 이상 예전만큼 정확하지 않습니다. Nunit 3.0은 2015 년 말에 출시되었으며 현재 Parallelizable 속성이 있습니다. 참고 : github.com/nunit/nunit/wiki/Parallelizable-Attribute
pb.

36

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

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

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

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

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

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

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


10

프로젝트에 여러 테스트 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 및 명령 줄 테스트 실행 도구를 적극 권장 합니다. 이와 같은 것은 없으며 코드-테스트-디버그주기를 동시에 혁신 할 것입니다.


1
이것은 단위 테스트 실행 시간을 3 분에서 2 분으로 줄이는 데 도움이되었습니다. 2 코어 CPU에서 테스트했습니다.
Dmitrii Lobanov 2014 년

4

에서 이 문서 시험을 가속화하기 위해 포스터 명령 매개 변수는 각 인스턴스 실행해야 테스트하는 지정와 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 테스트를 자동으로 시작하도록 할 수 있지만 워크로드를 분할 한 다음 테스트 후 처리를 위해 결과를 단일 파일로 병합합니다.

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


이것은 카테고리에 대해 이미 게시 된 것과 동일한 아이디어입니다. 여기에서 인스턴스간에 합리적으로 동일한 런타임을 유지하고 싶지 않습니다. 나는 이것을하기 전에 나만의 NUnit 러너를 작성하고 싶다.
Billy ONeal

내가 아는 한 NUnit은 여러 인스턴스를 실행하는 것과 같은 해결 방법 없이는 이것을 지원하지 않습니다. 원하는 경우 테스트를 N 세트로 분할하고 NUnit의 N 인스턴스를 자동으로 실행하는 도구를 만들 수 있습니다. 여기서 N은 보유한 프로세서 / 코어 수입니다. 이것이 제가 NUnit으로 생각할 수있는 일종의 자동화 된 병렬 테스트를하는 유일한 방법입니다.
kniemczak

TeamCity 지속적 통합 도구에 대한 업데이트를 추가하고 해당 도구를 사용하여 자동화 요구 사항을 해결하는 방법에 대한 몇 가지 게시물을 포함했습니다.
kniemczak

3

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

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

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


3

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

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


3
NCrunch는 Visual Studio 내에서 사용할 때 유용하지만 빌드 서버에서 테스트를 병렬화하려고 할 때는 도움이되지 않습니다.
Paccc

3
NCrunch는 이제 빌드 서버에서 정말 잘 작동하는 명령 줄 도구를 사용할 수 있습니다.
chillitom

3

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

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

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

2

약간의 해킹이지만 단위 테스트를 여러 범주로 나눌 수 있습니다. 그런 다음 각 범주에 대해 NUnit의 새 인스턴스를 시작합니다.

편집 : 콘솔 앱에 / process 옵션을 추가 한 것 같습니다. 명령 줄 도움말에 "테스트 용 프로세스 모델 : 단일, 분리, 다중"이라고 나와 있습니다. 테스트 실행기에도이 기능이있는 것으로 보입니다.

편집 2 : 불행히도 각 어셈블리에 대해 별도의 프로세스를 생성하지만 프로세스 격리 옵션 (명령 줄의 / process)은 에이전트를 한 번에 하나씩 실행합니다.


2

프로젝트가 여기에 언급되지 않았 으므로 NUnit.Multicore 를 가져오고 싶습니다 . 나는 프로젝트를 직접 시도하지 않았지만 NUnit의 병렬 테스트 문제에 대한 흥미로운 접근 방식을 가지고있는 것 같습니다.


2

내 작은 도구 TBox 또는 콘솔 병렬 Runner 또는 플러그인을 사용해 분산 계산을 수행 할 수 있으며 PC SkyNet 세트에서 단위 테스트를 실행할 수도 있습니다.

TBox는 많은 프로젝트가 포함 된 대규모 솔루션으로 작업을 단순화하기 위해 만들어졌습니다. 많은 플러그인을 지원하며 그중 하나는 NUnit 테스트를 병렬로 실행할 수있는 기능을 제공합니다. 이 플러그인은 기존 테스트를 변경할 필요가 없습니다.

또한 다음을 지원합니다.

  • 단위 테스트로 폴더 복제 (테스트가 로컬 데이터를 변경하는 경우),

  • 테스트 동기화 (예 : testfixtureteardown의 테스트가 모든 dev 서버 또는 qunit 용 chromerunner를 종료하는 경우)

  • x86 모드 및 테스트 실행을위한 관리자 권한

  • 일괄 실행-여러 어셈블리에 대한 테스트를 병렬로 실행할 수 있습니다.

  • 단일 스레드 실행의 경우에도 소규모 테스트가 많은 경우 표준 nunit 러너보다 빠르게 작동합니다.

또한이 도구는 명령 줄 테스트 실행기를 지원하며 (병렬 실행 용) 지속적인 통합과 함께 사용할 수 있습니다.


이 제품과 관련이있는 경우이를 공개하십시오. 이것을 가리키는 여러 가지를 게시했습니다.
Brad Larson

물론, TBox는 내 도구입니다. 나는 자유 시간에 혼자서 썼습니다. 여기서 무료 도구에 대해 말하는 것이 나쁜 습관이라면이 대답을 제거하겠습니다. 문제 없습니다. :)
Alex H

우리는 사람들이 그들이 관련된 제품에 대해 명확히하기를 원합니다. 그것이 당신의 것이라고 완전히 밝히고, 질문에 의해 제기 된 문제를 해결하는 것이 적절한 이유를 밝히고, 너무 공격적으로 홍보하지 않는다면, 당신의 대답은 여기서 받아 들여질 것입니다.
Brad Larson

@brad Codeplex의 오픈 소스이지만 여기에 문제가있는 이유가 확실하지 않습니다.
dvallejo 2014 년

@DanVallejo-오픈 소스 프로젝트이기 때문에 커뮤니티에서 게시 할 때 삭제되지 않은 이유입니다. 우리는 거기에 약간의 여유를 주지만 사람들이 당신의 추천 뒤에있는 맥락을 이해할 수 있도록 당신이 프로젝트와의 관계를 공개 할 것을 요청합니다. Alex가 여기에서 그렇게 했으므로 그의 대답은 현재 그대로입니다.
Brad Larson

1

NUnit 3.0.0 베타 -4를 성공적으로 사용하여 테스트를 병렬로 실행했습니다.

  • 빌드 서버에서 실행
  • Selenium 테스트 실행
  • Visual Studio 지원 있음
  • 아직 Resharper 지원 없음

동료 답변 주셔서 감사합니다 .

고차 :

  • Parallelizable 속성은 상속되지 않으므로 테스트 클래스에 지정해야합니다.

1
NUnit 3.0
출시

0

다음 PowerShell 명령을 사용할 수 있습니다 (NUnit3의 경우 NUnit2의 경우 러너 이름 변경).

PS> nunit3-console (ls -r *\bin\Debug\*.Tests.dll | % FullName | sort-object -Unique)

제시된 명령은 단일 nunit 인스턴스에서 모든 테스트 어셈블리를 실행하므로 엔진 내장 병렬 테스트 실행 을 활용할 수 있습니다 .

비고

  1. 디렉토리 검색 패턴을 조정하는 것을 잊지 마십시오. 을 감안할 때 예로 끝나는 경우에만 어셈블리 실행 .Tests.dll내부 \bin\Debug디렉토리.

  2. Unique필터링 에 유의하십시오-원하지 않을 수도 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.