我希望同时在多个类中运行使用@Test
注释的每个方法。在某些情况下,我想限制这一点,并说每次只能运行100次。我希望在类中的任何Test运行之前运行@BeforeClass
注释的方法,并且我希望@AfterClass
注释在类运行中的所有测试之后运行一次。我希望System.out
,System.err
和Exceptions被适当地缓冲/捕获而不是写出来,这样它们就不会交错,我可以阅读最终输出并理解发生的事情。
这是否存在?我有大量的独立测试用例,我的应用程序(我相信)线程安全。这些测试中没有一个具有JVM之外的依赖关系,并且我希望在给定硬件的情况下尽快完成它们。
如果不存在,有没有具体的理由呢?全球junit用户丢失了多少时间因为这不容易?我可以把它构建成Junit吗?在我看来,这应该像一个标志一样简单,它“只是有效”。
答案 0 :(得分:15)
您可以使用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秒内运行,因为所有方法和类都是并行运行的。
这将在6s内运行(因为所有类都是并行的)。
JUnitCore.runClasses(new ParallelComputer(true, false), classes);
这也将在6s内运行(因为所有方法都是并行的)。
JUnitCore.runClasses(new ParallelComputer(false, true), classes);
答案 1 :(得分:5)
是的,你可以。
如果您正在使用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:Junit4使用 ParallelComputer
提供并行功能
答案 2 :(得分:2)
JUnit Toolbox为JUnit运行器提供了并行执行测试的功能。
为了不将输出混合到System.err
和System.out
,您必须在单独的JVM中启动测试,因为System.err
和System.out
是全局的。