NUnitを使用して作成された大規模な受け入れテスト(テストごとに最大10秒)のテストスイートがあります。私のマシンはすべてマルチコアボックスであるという事実を利用したいと思います。理想的には、他のテストとは関係なく、コアごとに1つのテストを実行できます。
PNUnitはありますが、スレッド同期の問題などをテストするために設計されており、これを実現する明確な方法がわかりませんでした。
テストを並行して実行するために使用できるスイッチ/ツール/オプションはありますか?
NUnitを使用して作成された大規模な受け入れテスト(テストごとに最大10秒)のテストスイートがあります。私のマシンはすべてマルチコアボックスであるという事実を利用したいと思います。理想的には、他のテストとは関係なく、コアごとに1つのテストを実行できます。
PNUnitはありますが、スレッド同期の問題などをテストするために設計されており、これを実現する明確な方法がわかりませんでした。
テストを並行して実行するために使用できるスイッチ/ツール/オプションはありますか?
回答:
NUnitバージョン3は、テストの並行実行をサポートします。
クラスに属性を追加する[Parallelizable(ParallelScope.Self)]
と、テストが並行して実行されます。
•ParallelScope.Noneは、テストが他のテストと並行して実行されない可能性があることを示します。
•ParallelScope.Selfは、テスト自体が他のテストと並行して実行される可能性があることを示します。
•ParallelScope.Childrenは、テストの子孫が相互に並行して実行される可能性があることを示します。
•ParallelScope.Fixturesは、フィクスチャが互いに並行して実行される可能性があることを示します。
プロジェクトに複数のテスト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に、.Net3.5から4.0に移行しました。テストの実行を高速化するために、異なるコマンドライン引数と並行してNunitの複数のインスタンスを実行します
- テストアセンブリとnunitバイナリの2つのコピーがフォルダAとBにあります。
- フォルダ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 200864ビットを実行しています。Windows 764ビットでも問題を再現できました。
このバグが修正されているか、記載されているソフトウェアの新しいバージョンを実行していない場合は、それらの手法を複製できるはずです。
更新
TeamCityは、NUnitテストを自動的に実行するために使用できるツールのように見えます。ここでは、複数のNUnitインスタンスを起動するために使用できるNUnitランチャーがあります。 これは、複数のNUnitXML結果を単一の結果ファイルにマージすることについて説明しているブログ投稿です。
したがって、理論的には、ワークロードを分割し、テスト後の処理のために結果を1つのファイルにマージする方法に基づいて、TeamCityに複数のNUnitテストを自動的に起動させることができます。
それはあなたのニーズに十分に自動化されていますか?
PNUnitがテストコード内で同期を実行できるからといって、実際にそのアスペクトを使用する必要があるわけではありません。私が見る限り、セットをスポーンし、必要になるまで残りを無視することを妨げるものは何もありません。
ところで、私は彼らのすべてのソースを読む時間がありませんが、バリアクラスをチェックすることに興味がありました、そしてそれは非常に単純なロックカウンターです。N個のスレッドが入るまで待機してから、すべてのスレッドが同時に実行を継続するようにパルスを送信します。それがすべてです-あなたがそれに触れなければ、それはあなたを噛まないでしょう。
通常のスレッド開発では少し直感に反するかもしれませんが(ロックは通常、アクセスを1つずつシリアル化するために使用されます)、非常に活発な転換です:-)
すべてのテストクラスにParallelizable属性を追加する代わりに、次のようにします。
これをnunit3以降のテストプロジェクトAssemblyInfo.csクラスに追加します。
// Make all tests in the test assembly run in parallel
[assembly: Parallelizable(ParallelScope.Fixtures)]
ここではプロジェクトについて触れていないので、NUnit.Multicoreを立ち上げたいと思います。私は自分でプロジェクトを試したことがありませんが、NUnitを使用した並列テストの問題に対して興味深いアプローチがあるようです。
あなたは私の小さなツールを試すことができTBOXをまたはパラレルコンソールランナーもパソコンのセットにユニットテストを実行することができ、分散calulationsを行うために、あるいはプラグインをスカイネット
TBoxは、多くのプロジェクトを含む大きなソリューションでの作業を簡素化するために作成されています。多くのプラグインをサポートしており、そのうちの1つはNUnitテストを並行して実行する機能を提供します。このプラグインでは、既存のテストを変更する必要はありません。
また、それはサポートします:
単体テストを使用したフォルダーの複製(テストによってローカルデータが変更された場合)、
テストの同期(たとえば、testfixtureteardownでのテストがすべての開発サーバーまたはqunitのchromerunnerを強制終了する場合)
テストを実行するためのx86モードと管理者権限
バッチ実行-多くのアセンブリのテストを並行して実行できます
シングルスレッドの実行でも、小さなテストが多い場合は、標準のnunitランナーよりも高速に動作します。
また、このツールはコマンドラインテストランナー(並列実行用)をサポートしており、継続的インテグレーションで使用できます。
次のPowerShellコマンドを使用できます(NUnit3の場合、NUnit2の場合はランナー名を変更します)。
PS> nunit3-console (ls -r *\bin\Debug\*.Tests.dll | % FullName | sort-object -Unique)
提示されたコマンドは、すべてのテストアセンブリを単一のnunitインスタンスで実行します。これにより、エンジンに組み込まれた並列テスト実行を活用できます。
備考
ディレクトリ検索パターンを微調整することを忘れないでください。与えられた例は.Tests.dll
、\bin\Debug
ディレクトリで終わり、ディレクトリ内で終わるアセンブリのみを実行します。
Unique
フィルタリングに注意してください-あなたはそれを持ちたくないかもしれません。