2015-09-21 6 views
6

私は、テスト(理論)が遅いとそれのためのテストケースの束を持っている。 だから私はそれらを同時に動かしたい。xUnitで理論を並列実行する方法は?

"\packages\xunit.runner.console.2.0.0\tools\xunit.console" "\Projects\xUnitTest\xUnitTest\bin\Debug\xUnitTest.dll" -parallel all > xUnitResult.txt 

そして結果:かなりシリアルです

xUnit.net console test runner(64-bit.NET 4.0.30319.42000) 
Copyright(C) 2015 Outercurve Foundation. 

Discovering: xUnitTest 
Discovered: xUnitTest 
Starting: xUnitTest 
21:55:39.0449 - Starting 2 - Sleeping 2000 
21:55:41.0627 - Finished 2 - Sleeping 2000 
21:55:41.0783 - Starting 1 - Sleeping 5000 
21:55:46.0892 - Finished 1 - Sleeping 5000 
21:55:46.0892 - Starting 3 - Sleeping 4000 
21:55:50.0989 - Finished 3 - Sleeping 4000 
Finished: xUnitTest 

=== TEST EXECUTION SUMMARY === 
    xUnitTest Total: 3, Errors: 0, Failed: 0, Skipped: 0, Time: 11,137s 

[Theory] 
[MyTestData] 
public void MyTheory(int num, int sleep) 
{ 
    Console.WriteLine("{0:HH:mm:ss.ffff} - Starting {1} - Sleeping {2}", DateTime.Now, num, sleep); 
    Thread.Sleep(sleep); 
    Console.WriteLine("{0:HH:mm:ss.ffff} - Finished {1} - Sleeping {2}", DateTime.Now, num, sleep); 
} 

[AttributeUsage(AttributeTargets.Method)] 
public class MyTestDataAttribute : DataAttribute 
{ 
    public override IEnumerable<object[]> GetData(MethodInfo testMethod) 
    { 
     yield return new object[2] { 1, 5000 }; 
     yield return new object[2] { 2, 2000 }; 
     yield return new object[2] { 3, 4000 }; 
    } 
} 

コマンドラインでテストを実行するには:

私は簡単な例を作成しました。 私はそれを平行にすることは可能だと確信しています。

+6

https://xunit.github.io/docs/running-tests-in-parallel.html –

+1

Btw、[MemberData(nameof(MyTestData))] '私の意見では、カスタム属性を作成するよりもクリーンです。 –

答えて

5

現在、xUnit 2.1ではこれはできません。 parallelization docsによると、

デフォルトでは、各テストクラスは固有のテストコレクションです。同じテストクラス内のテストは、互いに並行して実行されません。ドキュメントは明示的に明確にしていない何

です:

  • xUnitの中で最小の「並列化」ユニットは、コレクション
  • で同じクラスのテストは異なるに設置するには方法はありませんコレクション

理論を並列化することは不可能です。なぜなら、理論は複数のクラスにまたがることができないからです。何が抽象化されるので、多くの時間がかかっているように

  • は、テスト対象のコードをリファクタリング:あなたのケースで


    が、これはあなたが、少なくとも二つの選択肢があることを意味します。たとえば、ビジネスロジックを実行してからデータベース呼び出しを行う必要があるとします。テスト可能なビジネスロジックを別のクラスに分けることができれば、それに対して理論を実行することができます(パラレルではなく、< 1ミリ秒)、低速データアクセスコードを個別にテストします。

  • テストケースが十分に少ない場合は、テストケースごとに新しいクラスを作成し、Theoryの代わりにFactを使用してください。それらをすべて1つのファイルに入れることもできます。より冗長であり、理論を使用する "クール"な要素は失われますが、並列実行が可能になります。

3

xUnitでは直接実行することはできませんが、必要に応じて回避することができます。欠点では、クラスを介して並列実行の数を手動で定義する必要があるように、2つのスレッドで並列化する場合は、2つのクラスを作成する必要があります。この例では

public abstract class ParellelTheoryBase 
{ 
    public static List<int> testValues = new List<int> {1, 2, 3, 4, 5, 6}; 
} 

public class ParallelTheory_1of2 : ParellelTheoryBase 
{ 
    public static List<object[]> theoryData = testValues.Where((data, index) => index % 2 == 0).Select(data => new object[] { data }).ToList(); 

    [Theory] 
    [MemberData(nameof(theoryData))] 
    public void DoSomeLongRunningAddition(int data) 
    { 
     Assert.True(data < 7); 
     Thread.Sleep(5000); 
    } 
} 

public class ParallelTheory_2of2 : ParellelTheoryBase 
{ 
    public static List<object[]> theoryData = testValues.Where((data, index) => index % 2 == 1).Select(data => new object[] { data }).ToList(); 

    [Theory] 
    [MemberData(nameof(theoryData))] 
    public void DoSomeLongRunningAddition(int data) 
    { 
     Assert.True(data < 7); 
     Thread.Sleep(5000); 
    } 
} 

、Iは、実際の試験クラスの基本クラスである、ParellelTheoryBaseでプロパティを定義しました。 ParallelTheory_1of2ParallelTheory_2of2は、そのクラスから継承し、testValuesにアクセスできます。現在、TheoryはこのテストをtheoryDataで実行し、奇数または偶数(index % 2 == 1またはindex % 2 == 0)のデータのみをリストから選択します。

それを取得Visual Studioのテストエクスプローラでピックアップ: Visual Studio test explorer

と並列に実行されます。

[xUnit.net 00:00:00.3397963] Starting 
[xUnit.net 00:00:15.5696617] Finished 

これかもしれない、それは事前にどれだけのテストデータで知ることが簡単ではない解決策になりますあなたが持っている。私は、例えば入力がディレクトリ内の任意のファイルであり、追加された新しいファイルがテストのために自動的に選択されるファイルパーサーの統合テストでこれを使用します。

例では、totalCountParallelscurrentIndexのパラメータを受け入れるようにMyTestData属性を簡単に変更できると思います。

関連する問題