我正在使用JUnit 4.4和Maven,并且我有大量长时间运行的集成测试。

在并行化测试套件时,有一些解决方案允许我在一个测试类中并行运行每个测试方法。但所有这些都要求我以这种或那种方式改变测试。

我真的认为在X线程中并行运行X个不同的测试类会是一个更清晰的解决方案。我有数百个测试,所以我并不真正关心线程化各个测试类。

有没有办法做到这一点?

有帮助吗?

解决方案 2

从junit 4.7开始,现在可以在不使用TestNG的情况下并行运行测试。实际上从4.6开始就有可能,但是4.7中有一些修正,这将使它成为一个可行的选择。您也可以使用spring运行并行测试,您可以阅读此处

其他提示

使用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的实验性启发 ParallelComputer 跑步者我已经建立了自己的 ParallelSuite 和< strong> ParallelParameterized 参赛者。使用这些运行程序,可以轻松地并行化测试套件和参数化测试。

<强> 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 注释值更改为其中一个并行* 类。

@RunWith(ParallelSuite.class)
@SuiteClasses({ATest.class, BTest.class, CTest.class})
public class ABCSuite {}

tempus-fugit 提供类似的内容,请查看文档了解详情。它依赖于JUnit 4.7,你只需将测试标记为 @RunWith(ConcurrentTestRunner)

干杯

TestNG可以做到这一点(这是我的第一次反应 - 然后我看到你已经有了很多测试用例)。

对于JUnit,请查看 parallel-junit

您可以查看开源库 - 测试负载均衡器。它完全符合您的要求 - 并行运行不同的测试类。它集成在ant-junit级别,因此您无需进行任何更改测试。我是图书馆的作者之一。

另外,请考虑不要在线程中运行它们,因为您可能需要一个进程级别的沙箱。例如,如果您在集成测试中遇到数据库,则不希望一个测试失败,因为另一个测试在另一个线程中添加了一些数据。大多数时候,考试都不是考虑到这一点。

最后,到现在为止如何解决这个问题?

您可以使用Junit自己提供的ParallelComputer并行运行测试。这是一个可以帮助您入门的小片段。

Class[] cls = { TestCase1.class, TestCase2.class };
Result result = JUnitCore.runClasses(ParallelComputer.classes(), cls);
List<Failure> failures = result.getFailures();

当您需要从代码运行测试时,这将有所帮助,因为它不依赖于Maven或任何其他构建管理工具。

请注意,这将并行运行所有测试用例,如果不同测试用例之间存在任何依赖关系,则可能导致误报。无论如何,你不应该有相互依赖的测试。

您可以在一分钟内将测试更改为TestNg测试(您只需要更改导入),TestNG是并行测试中最好的。

你可以尝试 Gridgain 让你跑步在计算网格中分发测试。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top