web-dev-qa-db-ja.com

NUnit 3:テストの並列実行を禁止する

最新のNUnit(3.2.0)をインストールし、すべてのテストを並行して実行しています。それは望ましい動作のように見えるかもしれませんが、私はそれを要求しませんでした、そして実際にそれは私のテストのいくつかを壊しました。スレッドに依存する_[OneTimeSetUp]_で初期化を行っていますが、NUnitにテストを順番に実行させるには何もできないようです。私は documentation を読みましたが、デフォルトではテストは並行して実行されないことが明記されていますが、実際はそうです!

さらに、次の属性を追加しようとしました:[Assembly: Parallelizable(ParallelScope.None)] —運がありません。

誰かがこの動作を変更する方法を知っていますか?

追伸ReSharperで実行しましたが、MSVSアドインでも試しました。


UPD:MVVM Light DispatcherHelper.Initialize()(inside _[OneTimeSetUp]_)を使用して、後で使用されるディスパッチャーオブジェクトを格納していますいくつかのテスト。スレッドが異なる場合(テストとセットアップメソッドの間)、テスト中のアクションが非同期に実行され、テストが失敗します。

私はさまざまなテストでスレッドIDをチェックしましたが、それらはすべて異なります。


UPD2:ドキュメントからの抜粋:

NUnit 3.0フレームワークは、アセンブリ内で並行してテストを実行できます。これはEngine Parallel Test Executionとは完全に別の機能ですが、同じテスト実行で両方を使用することは可能です。

デフォルトでは、並列実行は行われません。属性は、並行して実行できるテストと、それらが他のテストとどのように関連しているかを示すために使用されます。

明示的に指定されるまで、アセンブリ内のテストを並行して実行してはならないという意味ではない場合、それはどういう意味ですか?そして、なぜ[Assembly: Parallelizable(ParallelScope.None)]がテストの並列実行に影響しないのですか?


UPD3:質問への回答は以下にありますが、DispatcherHelper.Initialize()で(私がそうであるように)行き詰まっている場合は、この初期化をOneTimeSetUpから削除し、ディスパッチャーを使用するすべてのテストに次の行を追加します。

_DispatcherHelper.Reset();
DispatcherHelper.Initialize();
_
14
ixSci

NUnitはすべてのテストが同じスレッドで実行されることを保証しないため、テストが異なるスレッドで実行されているという観察は、それらが並行して実行されていることを意味しません。

ドキュメントには、テストが順次または並列に実行されることが記載されています。これは同じスレッドで実行されることを意味すると考えるかもしれませんが、内部実装が異なるスレッドで実行するためにテストを必要とする場合がある多くの理由があります。タイムアウトは一例です。テストがタイムアウトした場合にスレッドを生成して強制終了しますが、他にもたくさんあります。

並列テストの実行はNUnit 3で新しくなったため、内部実装がNUnit 2から変更されました。スレッド内のすべてのテストを同じスレッドで強制的に実行する属性が役立つ場合があるため、気軽に を送信してください。機能強化リクエスト

申し訳ありませんが、MVVM Lightに慣れていないため、OneTimeSetupスレッドにマーシャリングする方法を提案することはできません。

Update-これはWebおよび非同期での一般的な使用方法であるため、NUnitチームは同じスレッドでテストを実行することを要求する属性を提供することを決定しましたフィクスチャのOneTimeSetupとして。これは、次のリリース3.4、またはホットフィックス3.2.1リリースのいずれかになります。進行状況を追跡する場合は、 issue および pull request を参照してください。

Update 2-SingleThreadedAttributeをTestFixtureに追加して、ランナーにOneTimeSetUpOneTimeTearDownとすべての子テストは同じスレッドで実行する必要があります。

19
Rob Prouse

[NonParallelizable] 属性を追加することで、テストが並行して実行されるのを防ぐことができます。これは、テスト、クラス、およびアセンブリレベルで追加できます。

6
Nir