2015-11-14 18 views
7

@Testと注釈を付けたすべてのメソッドを、複数のクラスにまたがって同時に実行したいと思います。いくつかのケースでは、これを制限して、一度に100個のトータルしか実行できないと言っています。私は@BeforeClassアノテーションを持つメソッドをクラス内のテストが実行される前に一度実行したいと思いますが、@AfterClassアノテーションをクラス内のすべてのテストが実行された後に一度実行したいと思います。 System.outSystem.err、例外を適切にバッファリング/キャプチャして書き出すのではなく、インターリーブしないようにして、最終出力を読み込み、何が起こったのかを理解したいと思います。Junitと並行してテストを実行する

これはありますか?私は独立したテストケースが多数あり、私のアプリケーションはスレッドセーフです(私は信じています)。これらのテストでは、JVMからの依存関係はありません。私は、ハードウェアがあれば、できるだけ早くそれらを終了したいと考えています。

これが存在しない場合、具体的な理由はありますか?これは簡単ではないので、世界中のjunitユーザーがどれくらい時間を失うのでしょうか?私はそれをJunitに組み込めますか?私の心の中では、これは単一の旗のように単純でなければならず、 "うまくいきます"。

答えて

11

これは、JUnitのParallelComputerで実現できます(これは実験的なものです)。これは、java.util.concurrent.ExecutorService APIによってサポートされている非常に簡単な実装です。
仕組みが不思議なら、check out the source

基本的にJUnitCore.runClasses(Computer, Classes ...)と呼び出して、ParallelComputerオブジェクトを最初の引数として渡します。

使用例:

import org.junit.Test; 
import org.junit.experimental.ParallelComputer; 
import org.junit.runner.JUnitCore; 

public class ParallelComputerExample { 

    @Test 
    public void runAllTests() { 
     Class<?>[] classes = { ParallelTest1.class, ParallelTest2.class }; 

     // ParallelComputer(true,true) will run all classes and methods 
     // in parallel. (First arg for classes, second arg for methods) 
     JUnitCore.runClasses(new ParallelComputer(true, true), classes); 
    } 

    public static class ParallelTest1 { 
     @Test 
     public void test1a() { 
      lookBusy(3000); 
     } 

     @Test 
     public void test1b() { 
      lookBusy(3000); 
     } 
    } 

    public static class ParallelTest2 { 
     @Test 
     public void test2a() { 
      lookBusy(3000); 
     } 

     @Test 
     public void test2b() { 
      lookBusy(3000); 
     } 
    } 

    public static void lookBusy(long ms) { 
     try { 
      Thread.sleep(ms); 
     } catch (InterruptedException e) { 
      System.out.println("interrupted"); 
     } 
    } 
} 

すべてのメソッドやクラスが並行して走っているので、上記のコードは3秒で実行されます。

これは6秒で実行されます(すべてのクラスが並列であるため)。 JUnitCore.runClasses(new ParallelComputer(true, false), classes);

これは6秒で実行されます(すべてのメソッドが並列であるため)。 JUnitCore.runClasses(new ParallelComputer(false, true), classes);

+2

@TestからJUnitCore.runClasses()を呼び出さないでください。これはテストレポートを混乱させます。参照:https://github.com/junit-team/junit4/issues/1102 テストを並行して実行するための本当の解決策は、ランナーまたはスイートを拡張することです –

2

はい、できます。

mavenを使用している場合。 Junit4はを使用して並列機能を提供します:あなたは春、

のmaven-確実な-プラグイン

の助けを借りることができますあなたはこのLink

<build> 
    <plugins> 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-surefire-plugin</artifactId> 
     <version>2.7.1</version> 
     <configuration> 
      <parallel>classes</parallel> 
      <threadCount>5</threadCount> 
     </configuration> 
    </plugin> 
    </plugins> 
</build> 

ソリューション2を確認することができますパラレルコンピュータ

0

JUnit Toolboxは、テストの並列実行のためのJUnitランナーを提供します。あなたはSystem.errSystem.outがグローバルであるため、別々のJVMでテストを開始する必要がSystem.outSystem.errへの出力を混在していないために

関連する問題