23

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

さらに、次の属性を追加しようとしました: [assembly: Parallelizable(ParallelScope.None)]— 運が悪い。

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

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


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

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


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

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

デフォルトでは、並列実行は行われません。属性は、並行して実行できるテストと、他のテストとの関係を示すために使用されます。

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


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

DispatcherHelper.Reset();
DispatcherHelper.Initialize();
4

2 に答える 2

25

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

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

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

申し訳ありませんが、私は MVVM Light に詳しくないので、OneTimeSetup スレッドにマーシャリングする方法を提案できません。

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

更新 2 - SingleThreadedAttributeTestFixture に追加してOneTimeSetUpOneTimeTearDownとすべての子テストを同じスレッドで実行する必要があることをランナーに示すことができるようになりました。

于 2016-03-15T21:48:45.143 に答える