在Maven构build中并行运行junittesting?
我使用的是JUnit 4.4和Maven,而且我有大量的长时间运行的集成testing。
在对testing套件进行并行化时,有几个解决scheme可以让我在单个testing类中并行运行每种testing方法。 但所有这些都要求我以这种或那种方式改变testing。
我真的认为这将是一个更简洁的解决scheme,在X线程中并行运行X个不同的testing类。 我有数以百计的testing,所以我并不在乎对单个testing类进行线程化。
有没有办法做到这一点?
使用maven插件:
<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>
从junit 4.7开始,现在可以在不使用TestNG的情况下并行运行testing。 实际上从4.6开始就可能了,但是在4.7中有很多修正,这将是一个可行的select。 你也可以用spring来运行并行testing,你可以在这里阅读
受JUnit实验性的ParallelComputer跑步者的启发,我build立了自己的ParallelSuite和ParallelParameterized跑步者。 使用这些跑步者可以很容易地并行testing套件和参数化testing。
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,你只需将你的testing标记为@RunWith(ConcurrentTestRunner)
。
干杯
TestNG可以做到这一点 (这是我的第一个反应 – 然后我看到你已经有很多testing用例)。
对于JUnit,请看parallel-junit 。
您可以查看开源库 – testing负载平衡器 。 它正是你所要求的 – 并行地运行不同的testing类。 这集成在ant-junit级别,所以你不必改变你的testing。 我是图书馆的作者之一。
另外,考虑不要在线程中运行它们,因为您可能需要一个进程级别的沙箱。 例如,如果您在集成testing中击中数据库,则不希望一个testing失败,因为另一个testing会在不同的线程中添加一些数据。 大多数情况下,testing不是写在这一点上。
最后,到现在为止如何解决这个问题呢?
您可以使用由Junit自身提供的ParallelComputer并行运行testing。 这是一个小的片段,让你开始。
Class[] cls = { TestCase1.class, TestCase2.class }; Result result = JUnitCore.runClasses(ParallelComputer.classes(), cls); List<Failure> failures = result.getFailures();
当你需要从代码运行testing时,这将有所帮助,因为它不依赖于Maven或任何其他构buildpipe理工具。
请注意,这将并行运行所有testing用例,如果您在不同testing用例之间存在任何依赖关系,则可能会导致误报。 无论如何,你都不应该有相互依存的testing。
您可以在一分钟内将您的testing更改为TestNgtesting(您只需要更改导入),TestNG是最好的并行testing。
你可以尝试Gridgain ,让你运行分布在一个计算网格的testing。