与 Junit 并行运行测试

2022-09-02 20:17:56

我想同时在多个类上运行每个用 来注释的方法。对于某些情况,我想对此进行限制,并说一次只能运行总共100个。我希望带有批注的方法在类中的任何测试运行之前运行一次,并且我希望在类中的所有测试运行之后运行一次批注。我希望 、和 Exceptions 被适当地缓冲/捕获,而不是写出来,这样它们就不会交错,我可以读取最终输出并了解发生了什么。@Test@BeforeClass@AfterClassSystem.outSystem.err

这存在吗?我有大量独立的测试用例,我的应用程序是(我相信)线程安全的。这些测试都没有JVM之外的依赖关系,鉴于我的硬件,我想尽快完成它们。

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


答案 1

你可以用JUnit来完成这个(注意它仍然被认为是实验性的)。这是一个非常简单的实现,由java.util.concurrent.ExecutorService API支持。
如果您想知道它是如何工作的,请查看源代码ParallelComputer

基本上,您为第一个参数调用并传入一个对象。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 秒内运行,因为所有方法和类都是并行运行的。

这将在6秒内运行(因为所有类都是并行的)。JUnitCore.runClasses(new ParallelComputer(true, false), classes);

这也将在6秒内运行(因为所有方法都是并行的)。JUnitCore.runClasses(new ParallelComputer(false, true), classes);


答案 2

是的,可以。

如果您使用的是 maven。您可以采取以下措施的帮助

maven-surefire-plugin

在春天,

您可以查看此链接

<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 使用并行计算机提供并行功能