当前位置:  开发笔记 > 编程语言 > 正文

在Maven构建中并行运行junit测试?

如何解决《在Maven构建中并行运行junit测试?》经验,为你挑选了4个好方法。

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

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

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

有没有办法做到这一点?



1> 小智..:

使用maven插件:


    
    
        org.apache.maven.plugins
        maven-surefire-plugin
        2.7.1
        
            classes
            5
        
    
    


如果您使用Junit 4.7或更高版本,则确实支持.[surefire guide](http://maven.apache.org/surefire/maven-surefire-plugin/examples/junit.html)

2> krosenvold..:

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


你说它是可能的,但是你可以包含一个解释如何的链接吗?你的第二个链接是"春天",我对此并不感兴趣.
我认为,如果你的测试做任何IO,他们仍然会受益.例如,如果您的单元测试更像集成测试并且命中数据库,那么并行运行应该加快它们的速度.

3> Mustafa Ulu..:

受JUnit实验性ParallelComputer跑步者的启发,我已经建立了自己的ParallelSuiteParallelParameterized跑步者.使用这些运行程序,可以轻松地并行化测试套件和参数化测试.

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注释值更改为其中一个Parallel*类.

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



4> Toby..:

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

干杯

推荐阅读
李桂平2402851397
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有