私は現在、一連のテストを行っています。スイートを可能な限り並列化できるようにしたいと思います。私が持っている大きな問題の1つは、ある種のテストではある種のグローバルなアプリケーション状態を一方向に設定する必要があり、あるものは別の方法で設定する必要があるということです。 NUnitテストランナーグループに、どのグローバルな状態が必要なのかに基づいてテストを行い、それぞれのグループ内でテストを並行して実行し、グループ間のグローバルな状態を変更する方法はありますか?NUnit - テストをキーでグループ化し、各グループのテストを並行して実行できますが、各グループは直列に実行できますか?
たとえば、グローバル設定がFoo
で、カスタム属性が[RequiresFoo(X)]
で、テストに必要な値がFoo
であると注釈を付けることができます。実行時には、引数なしですべてのテストをRequiresFoo
にグループ化し、マークされていないテストをデフォルトのFoo
値としてカウントするようにNUnitに指示します。
は、その後、各グループのために、私は
N
は、そのグループのFoo
値で設定しFoo = N
にそれをしたいです。- そのグループ内のすべてのテストを並行して実行します。
私は理想的な世界では、私はこのグローバルな状態のモックシステムを持っていましたが、それは私が今持っていない多くの時間がかかります。 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));
}
ありがとうチャーリー。私は名前空間の備品について知らなかった。それはちょうどトリックを行うかもしれません。 – JamesFaix
小規模の技術的修正:あなたが何をしていても名前空間スイートがあります。ただし、名前空間にSetUpFixtureを作成すると、名前空間スイートの仕事を引き継ぎ、さらに高レベルのOneTimeのセットアップとティアダウンが可能になります。この場合、私はSetupFIxtureを指定するだけで、属性が表示される何かを与えることを提案しています。属性は名前空間には適用されません。 – Charlie