web-dev-qa-db-ja.com

NUnitテストを並行して実行するにはどうすればよいですか?

NUnitを使用して作成された大規模な受け入れテスト(テストごとに10秒以下)のテストスイートがあります。私のマシンはすべて複数のコアボックスであるという事実を利用したいと思います。理想的には、他のテストとは独立して、コアごとに1つのテストを実行できるようにします。

PNUnitはありますが、スレッド同期の問題などをテストするために設計されており、これを達成するための明確な方法がわかりませんでした。

テストを並行して実行するために使用できるスイッチ/ツール/オプションはありますか?

76
Billy ONeal

標準のnunitランナーは、テストの並行実行をサポートしていません。 can独自のテストランナーを作成して、テストを並行して実行します(現在のnunitテストを使用)。 nunitチームがまだこれを行っていない理由はわかりません。

また、MBUnitには並列化可能なテストを作成するオプションがあり、MBUnitにはNUnitとほぼ同じ構文があるため、切り替えにそれほど労力をかける必要はありません。

編集:コメントで述べたように、この回答は執筆時点では正しかったのですが、NUnitテストを並行して実行したい場合、少なくとも2つのオプションがあります。

  • NCrunchはそのまま使用できます(何も変更しませんが、商用製品です)
  • NUnit 3は、どのテストを並行して実行できるかを示すために使用できるparallelizable属性を提供します
47
David_001

NUnitバージョン3は、テストの並行実行をサポートします。

クラスに属性を追加すると、[Parallelizable(ParallelScope.Self)]はテストを並行して実行します。

•ParallelScope.Noneは、テストが他のテストと並行して実行されない可能性があることを示します。

•ParallelScope.Selfは、テスト自体を他のテストと並行して実行できることを示します。

•ParallelScope.Childrenは、テストの子孫が相互に並行して実行されることを示します。

•ParallelScope.Fixturesは、フィクスチャが互いに並行して実行できることを示します。

NUnit Framework-Parallel-Test-Execution

33
Peter

プロジェクトに複数のテスト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と、テスト実行のパフォーマンスを最大化するためのコマンドラインテスト実行ツールを強くお勧めします。 。そのようなものは何もありません、そしてそれは同時にあなたのコードテストデバッグサイクルに革命をもたらします。

10
chillitom

この記事 では、テストを高速化するために、ポスターは各インスタンスを実行するテストを指定するコマンドパラメーターを使用して、NUnitの複数のインスタンスを実行します。

FTA:

私は奇妙な問題に遭遇しました。

Nunit-consoleを使用して、継続的統合サーバーでテストを実行します。最近、Nunit 2.4.8から2.5.5および.Net 3.5から4.0に移行しました。テストの実行を高速化するために、Nunitの複数のインスタンスを異なるコマンドライン引数と並行して実行します

  • テストアセンブリの2つのコピーと、フォルダー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

コマンドを順番に実行すると、両方とも正常に実行されます。しかし、それらを並行して実行すると、1つだけが成功します。私が知る限り、それは最初にテストフィクスチャをロードするものです。もう1つは、「フィクスチャが見つかりません」というメッセージで失敗します。

この問題はすでに知られていますか?ランチパッドのバグリストに関連するものが見つかりませんでした。ところで、サーバーはWindows Server 2008 64ビットを実行しています。 Windows 7 64ビットでも問題を再現できました。

このバグが修正されているか、または言及されたソフトウェアの新しいバージョンを実行していないと仮定すると、それらのテクニックを再現できるはずです。

更新

TeamCity は、NUnitテストを自動的に実行するために使用できるツールのように見えます。 NUnitランチャー ここで説明 があり、複数のNUnitインスタンスを起動するために使用できます。 ここ は、複数のNUnit XML結果を単一の結果ファイルにマージすることについて説明しているブログ投稿です。

したがって、理論的には、ワークロードを分割し、結果を単一のファイルにマージしてテスト後処理を行う場合に基づいて、TeamCityが複数のNUnitテストを自動的に起動するようにすることができます。

それはあなたのニーズに十分に自動化されていますか?

4
kniemczak

PNUnitがテストコード内で同期を実行できるからといって、実際にその側面を使用する必要があるわけではありません。私が見る限り、セットを生成し、それが必要になるまで残りを無視することを妨げるものは何もありません。

ところで、私は彼らのソースのすべてを読む時間はありませんが、Barrierクラスをチェックアウトすることに興味があり、それは非常に単純なロックカウンターです。 N個のスレッドが入力されるまで待機し、すべてのスレッドが同時に実行を継続するようにパルスを送信します。それだけです-あなたがそれに触れなければ、それはあなたを噛まないでしょう。

通常のスレッド化された開発では直感的なビットカウンターになる場合があります(ロックは通常アクセスをシリアル化するために使用されます-1 x 1)

3
ZXX

NCrunch を使用して単体テストを並列化し、NCrunchで使用するコアの数とVisual Studioで使用するコアの数を構成することもできます。

さらに、ボーナスとして継続的なテストを受けることができます:)

3
Rickard

ここではプロジェクトについて言及していないので、 NUnit.Multicore を表示したいと思います。私は自分でプロジェクトを試したことはありませんが、NUnitの並列テストの問題に対する興味深いアプローチがあるようです。

2
tronda

ちょっとしたハックになりますが、単体テストをいくつかの categories に分割できます。次に、カテゴリごとにNUnitの新しいインスタンスを起動します。

編集:コンソールアプリに/ processオプションを追加したようです。コマンドラインヘルプには、これが「テストのプロセスモデル:単一、個別、複数」であると記載されています。テストランナーにもこの機能があるようです。

編集2:残念ながら、アセンブリごとに個別のプロセスを作成しますが、プロセス分離オプション(コマンドラインからの/プロセス)はエージェントを一度に1つずつ実行します。

2
Pedro

私の小さなツールを試すことができます TBox またはconsole parallel Runner または分散計算を行うプラグインでさえ、PCのセットで単体テストを実行できます SkyNet

TBoxは、多くのプロジェクトを含む大きなソリューションでの作業を簡素化するために作成されています。多くのプラグインをサポートし、そのうちの1つはNUnitテストを並行して実行する機能を提供します。このプラグインでは、既存のテストを変更する必要はありません。

また、以下をサポートします。

  • 単体テストによるフォルダーの複製(テストでローカルデータが変更される場合)、

  • テストの同期(たとえば、testfixtureteardownのテストがすべてのdevサーバーまたはqunitのchromerunnerを強制終了する場合)

  • テストを実行するx86モードと管理者特権

  • バッチ実行-多くのアセンブリのテストを並行して実行できます

  • 単一のスレッドで実行する場合でも、テストが非常に少ない場合は、標準のnunitランナーよりも速く動作します。

また、このツールはコマンドラインテストランナー(並列実行用)をサポートしており、継続的な統合で使用できます。

2
Alex H
1
Sjoerd

NUnit 3.0.0 beta-4を使用してテストを並行して実行することに成功しました

  • ビルドサーバーで実行
  • Seleniumテストを実行します
  • Visual Studioをサポートしています
  • resharperサポートはまだありません

ピアの回答 をありがとう。

落とし穴:

  • Parallelizable属性は継承されないため、テストクラスで指定する必要があります。
1
Alvis

すべてのテストクラスにParallelizable属性を追加する代わりに:

これをnunit3以上のテストプロジェクトAssemblyInfo.csクラスに追加します。

// Make all tests in the test Assembly run in parallel
[Assembly: Parallelizable(ParallelScope.Fixtures)]
0
tom redfern

次のPowerShellコマンドを使用できます(NUnit3の場合、NUnit2の場合はランナー名を変更します):

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

提示されたコマンドは、すべてのテストアセンブリを単一のnunitインスタンスで実行します。これにより、エンジン 組み込みの並列テスト実行 を活用できます。

備考

  1. ディレクトリ検索パターンを微調整することを忘れないでください。この例では、末尾が.Tests.dllおよび\bin\Debugディレクトリ内のアセンブリのみを実行します。

  2. Uniqueフィルタリングに注意してください-必要ないかもしれません。

0
one_mile_run