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