与Junit并行运行测试

时间:2015-11-14 00:02:28

标签: java testing junit

我希望同时在多个类中运行使用@Test注释的每个方法。在某些情况下,我想限制这一点,并说每次只能运行100次。我希望在类中的任何Test运行之前运行@BeforeClass注释的方法,并且我希望@AfterClass注释在类运行中的所有测试之后运行一次。我希望System.outSystem.err和Exceptions被适当地缓冲/捕获而不是写出来,这样它们就不会交错,我可以阅读最终输出并理解发生的事情。

这是否存在?我有大量的独立测试用例,我的应用程序(我相信)线程安全。这些测试中没有一个具有JVM之外的依赖关系,并且我希望在给定硬件的情况下尽快完成它们。

如果不存在,有没有具体的理由呢?全球junit用户丢失了多少时间因为这不容易?我可以把它构建成Junit吗?在我看来,这应该像一个标志一样简单,它“只是有效”。

3 个答案:

答案 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.errSystem.out,您必须在单独的JVM中启动测试,因为System.errSystem.out是全局的。