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


83

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

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

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


これについてもっと知りたいです。@Billy ONealを見つけたら、回答を投稿してください。
PK

テストごとに10秒、理想的にはコアごとに1つのテストを実行すると言います。テストはCPUを集中的に使用しますか?それ以外の場合は、さらに多くの機能を同時に実行できるはずです。
Mattias Nilsson 2010

@Mattias:はい、テストはCPUを集中的に使用します。
Billy ONeal 2010

回答:


52

NUnitテストを並行して実行する場合は、少なくとも2つのオプションがあります。

  • NCrunchは、箱から出してすぐに提供します(何も変更せずに、ただし商用製品です)
  • NUnit 3は並列化可能属性を提供ます。これは、どのテストを並列に実行できるかを示すために使用できます。

質問を考えると、この答えは間違っているように見えます。本当の答えよりも良い提案です。私の考えでは、NCrunchはあなたの賛成票を必要とし、同じまたは複数のプロセス内で、1つまたは複数のマシン間で同時に(NUnit)テストを実行でき、VSまたはビルドサーバーから実行できるため、最高の答えになるはずです。
チリトム2015年

2
@chillitom NCrunchは、この質問に回答した後にリリースされました。これは良い選択です(一部の人にとっては高すぎるものの、これは箱から出してすぐに機能するはずです)。将来の他のオプションには、テストの並列実行を提供する可能性のあるNUnit 3が含まれる可能性があります(github.com/nunit/dev/wiki/Roadmapによる)。
David_001 2015年

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に、.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テストを自動的に起動させることができます。

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


これは、カテゴリについてすでに投稿されているのと同じアイデアです...ここのインスタンス間で適度に等しいランタイムを維持する必要はありません。これを行う前に、自分のNUnitランナーを作成したいと思います。
Billy ONeal 2010

私の知る限り、NUnitは、複数のインスタンスを実行するなどの回避策なしではこれをサポートしていません。必要に応じて、テストをNセットに分割し、NUnitのNインスタンスを自動的に実行するツールを作成できます。Nは、使用しているプロセッサ/コアの数です。これが、NUnitで考えられるある種の自動並列テストを行う唯一の方法です。
kniemczak 2010

TeamCity継続的インテグレーションツールについて説明する更新を追加し、そのツールを使用して自動化のニーズを解決する方法に関する投稿をいくつか含めました。
kniemczak 2010

3

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

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

通常のスレッド開発では少し直感に反するかもしれませんが(ロックは通常、アクセスを1つずつシリアル化するために使用されます)、非常に活発な転換です:-)


3

NCrunchを使用して単体テストを並列化できるようになりました。また、NCrunchで使用するコアの数と、VisualStudioで使用するコアの数を構成することもできます。

さらに、ボーナスとして継続的テストを取得します:)


3
NCrunchは、Visual Studio内で使用する場合は優れていますが、ビルドサーバーでテストを並列化しようとしている場合は役に立ちません。
paccc 2013年

3
NCrunchには、ビルドサーバーで非常にうまく機能するコマンドラインツールが用意されています。
チリトム2015年

3

すべてのテストクラスにParallelizable属性を追加する代わりに、次のようにします。

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

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

2

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

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

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


2

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


2

あなたは私の小さなツールを試すことができTBOXをまたはパラレルコンソールランナーもパソコンのセットにユニットテストを実行することができ、分散calulationsを行うために、あるいはプラグインをスカイネット

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

また、それはサポートします:

  • 単体テストを使用したフォルダーの複製(テストによってローカルデータが変更された場合)、

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

  • テストを実行するためのx86モードと管理者権限

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

  • シングルスレッドの実行でも、小さなテストが多い場合は、標準のnunitランナーよりも高速に動作します。

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


この製品に関連している場合は、これを開示してください。あなたはこれを指し示す複数のものを投稿しました。
BradLarson

確かに、TBox-は私自身のツールです。暇な時間だけに書いています。ここで無料のツールについて言うのが悪い習慣である場合、私はこの答えを削除します、それは問題ありません:)
Alex H

私たちは人々に彼らが関わっている製品について明確にして欲しいだけです。それがあなたのものであること、質問によって提起された問題を解決することが適切である理由を完全に開示し、それをあまり積極的に宣伝しない場合、あなたの答えはここで受け入れられるはずです。
BradLarson

@brad Codeplexのオープンソースですが、なぜここに問題があるのか​​わかりません。
dvallejo 2014年

@ DanVallejo-オープンソースプロジェクトであることが、投稿時にコミュニティによって削除されなかった理由です。そこではもう少し余裕を持たせますが、それでも、プロジェクトとの関係を開示して、人々があなたの推薦の背後にある文脈を理解できるようにしてください。アレックスはここでそうしました、それで彼の答えは今のところ完全に問題ありません。
BradLarson


1

NUnit3.0.0ベータ4を使用してテストを並行して実行することに成功しました

  • ビルドサーバーで実行
  • Seleniumテストを実行します
  • VisualStudioをサポートしています
  • 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.