我正在使用JUnit 4.4和Maven,并且我有大量长时间运行的集成测试.
在并行化测试套件时,有一些解决方案允许我在一个测试类中并行运行每个测试方法.但所有这些都要求我以某种方式改变测试.
我真的认为在X线程中并行运行X个不同的测试类是一个更清晰的解决方案.我有数百个测试,所以我并不真正关心线程化个别测试类.
有没有办法做到这一点?
使用maven插件:
org.apache.maven.plugins
maven-surefire-plugin
2.7.1
classes
5
从junit 4.7开始,现在可以在不使用TestNG的情况下并行运行测试.实际上从4.6开始就有可能,但是4.7中有一些修正,这将使它成为一个可行的选择.您也可以使用spring运行并行测试,您可以在这里阅读
受JUnit实验性ParallelComputer跑步者的启发,我已经建立了自己的ParallelSuite和ParallelParameterized跑步者.使用这些运行程序,可以轻松地并行化测试套件和参数化测试.
ParallelSuite.java
public class ParallelSuite extends Suite { public ParallelSuite(Class> klass, RunnerBuilder builder) throws InitializationError { super(klass, builder); setScheduler(new RunnerScheduler() { private final ExecutorService service = Executors.newFixedThreadPool(4); public void schedule(Runnable childStatement) { service.submit(childStatement); } public void finished() { try { service.shutdown(); service.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS); } catch (InterruptedException e) { e.printStackTrace(System.err); } } }); } }
ParallelParameterized.java
public class ParallelParameterized extends Parameterized { public ParallelParameterized(Class> arg0) throws Throwable { super(arg0); setScheduler(new RunnerScheduler() { private final ExecutorService service = Executors.newFixedThreadPool(8); public void schedule(Runnable childStatement) { service.submit(childStatement); } public void finished() { try { service.shutdown(); service.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS); } catch (InterruptedException e) { e.printStackTrace(System.err); } } }); } }
用法很简单.只需将@RunWith注释值更改为其中一个Parallel*类.
@RunWith(ParallelSuite.class) @SuiteClasses({ATest.class, BTest.class, CTest.class}) public class ABCSuite {}
tempus-fugit提供类似的东西,查看文档了解详情.它依赖于JUnit 4.7,你只需将测试标记为@RunWith(ConcurrentTestRunner)
.
干杯