同时运行可能会导致意想不到的结果。例如,我刚刚发现,虽然我的带有 200 个测试的测试套件在一个接一个执行时通过,但它在并发执行时失败,我发现这不是线程安全问题,而是依赖于另一个测试的测试,是一件坏事,我可以解决这个问题。
Mycila work on JUnit ConcurrentJunitRunner and ConcurrentSuite 很有趣。与最新的 GA 版本相比,这篇文章似乎有点过时了,在我的示例中,我将展示更新后的用法。
像下面这样注解一个测试类会导致并发执行测试方法,并发级别为6:
import com.mycila.junit.concurrent.ConcurrentJunitRunner;
import com.mycila.junit.concurrent.Concurrency;
@RunWith(ConcurrentJunitRunner.class)
@Concurrency(6)
public final class ATest {
...
你也可以同时运行所有的测试类:
import com.mycila.junit.concurrent.ConcurrentSuiteRunner;
@RunWith(ConcurrentSuiteRunner.class)
@Suite.SuiteClasses({ATest.class, ATest2.class, ATest3.class})
public class MySuite {
}
Maven dependency 是:
<dependency>
<groupId>com.mycila</groupId>
<artifactId>mycila-junit</artifactId>
<version>1.4.ga</version>
</dependency>
我目前正在研究如何多次运行方法并与此包同时运行。如果有人有一个例子让我知道,这可能已经是可能的了,在我自制的解决方案下面。
@Test
public final void runConcurrentMethod() throws InterruptedException {
ExecutorService exec = Executors.newFixedThreadPool(16);
for (int i = 0; i < 10000; i++) {
exec.execute(new Runnable() {
@Override
public void run() {
concurrentMethod();
}
});
}
exec.shutdown();
exec.awaitTermination(50, TimeUnit.SECONDS);
}
private void concurrentMethod() {
//do and assert something
}
正如其他人所指出的那样,您永远无法确定是否会出现并发错误,但在数万或数十万次执行中,并发数为 16 时,统计数据就在您身边。