2017-09-21 24 views
0

私は現在、一連のテストを行っています。スイートを可能な限り並列化できるようにしたいと思います。私が持っている大きな問題の1つは、ある種のテストではある種のグローバルなアプリケーション状態を一方向に設定する必要があり、あるものは別の方法で設定する必要があるということです。 NUnitテストランナーグループに、どのグローバルな状態が必要なのかに基づいてテストを行い、それぞれのグループ内でテストを並行して実行し、グループ間のグローバルな状態を変更する方法はありますか?NUnit - テストをキーでグループ化し、各グループのテストを並行して実行できますが、各グループは直列に実行できますか?

たとえば、グローバル設定がFooで、カスタム属性が[RequiresFoo(X)]で、テストに必要な値がFooであると注釈を付けることができます。実行時には、引数なしですべてのテストをRequiresFooにグループ化し、マークされていないテストをデフォルトのFoo値としてカウントするようにNUnitに指示します。

は、その後、各グループのために、私は

  1. Nは、そのグループのFoo値で設定しFoo = Nにそれをしたいです。
  2. そのグループ内のすべてのテストを並行して実行します。

私は理想的な世界では、私はこのグローバルな状態のモックシステムを持っていましたが、それは私が今持っていない多くの時間がかかります。 NUnitでこれを行うことはできますか?

注意変数を設定するだけでなく、グループ間でどのメソッドも実行できる必要があります。私が実際に扱っているグローバルコンテキストは、マイクロサービスの開始や停止、設定ファイルの更新などがあります。これらの要件のいずれかをカスタム属性に渡す文字列にシリアル化できますが、実行時には任意に実行できる必要があります要件を解析して環境を再構成するためのコード。


擬似コードの例です。デフォルトのテストで

は次のように直列に実行します。

foreach (var t in allTests) 
{ 
    Run(t); 
} 

NUnits基本的な並列動作は、このようなものです:あなたのよう

var grouped = allTests 
    .GroupBy(t => GetRequirementsFromCustomAttributes(t)); 

foreach (var g in grouped) 
{ 
    SetGlobalState(g.Key); 
    Parallel.ForEach(g, t => Run(t)); 
} 

答えて

1

Parallel.ForEach(allTests, t => Run(t)); 

が、私はこのような何かをしたいですNUnitではまだ問題はありません。計画されていますが、実装されていない機能があり、ではなくが一緒に実行されるテストの任意のグループ化が可能です。

あなたの回避策は、各グループをテストにすることです。NUnitはテストで並列化の指定しか許可しないからです。テストでは、テストケースまたはテストのグループ、つまりフィクスチャまたは名前空間スイートのいずれかを意味することに注意してください。

[Parallelizable]を階層の任意の場所に配置すると、そのテストは同じレベルの他のテストと並行して実行されます。 を置くと、同じテストが単独で実行されます。

Fooの値を必要とする5つのフィクスチャがあるとします。あなたはそれらの備品のそれぞれを並列化できないようにします。そのようにして、彼らの誰もが同時に走って、他の人と干渉することはできませんでした。

これらのフィクスチャを他のFoo以外のフィクスチャと並行して実行できるようにするには、Tests.FooRequredのようにすべて同じ名前空間に配置するだけです。 その名前空間にSetupFixtureを作成します。実際のセットアップ操作を行わないダミーの可能性があります。それに[Parallelizable]属性を入れてください。

すべてのfooテストのグループは、他のテストと並行して実行されますが、個々のフィクスチャは互いに並行して実行されません。

+0

ありがとうチャーリー。私は名前空間の備品について知らなかった。それはちょうどトリックを行うかもしれません。 – JamesFaix

+0

小規模の技術的修正:あなたが何をしていても名前空間スイートがあります。ただし、名前空間にSetUpFixtureを作成すると、名前空間スイートの仕事を引き継ぎ、さらに高レベルのOneTimeのセットアップとティアダウンが可能になります。この場合、私はSetupFIxtureを指定するだけで、属性が表示される何かを与えることを提案しています。属性は名前空間には適用されません。 – Charlie

関連する問題