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

Java 在Maven构建中并行运行junit测试?,java,maven,junit,Java,Maven,Junit,我正在使用JUnit4.4和Maven,并且我有大量长期运行的集成测试 当涉及到并行化测试套件时,有一些解决方案允许我在单个测试类中并行运行每个测试方法。但所有这些都要求我以某种方式改变测试 我真的认为在X个线程中并行运行X个不同的测试类是一个更干净的解决方案。我有数百个测试,所以我并不真正关心线程化单个测试类 有什么方法可以做到这一点吗?(这是我的第一个反射——然后我看到你已经有了很多测试用例) 对于JUnit,请查看 您可以在一分钟内将您的测试更改为TestNg测试(您只需更改导入),Tes

我正在使用JUnit4.4和Maven,并且我有大量长期运行的集成测试

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

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

有什么方法可以做到这一点吗?

(这是我的第一个反射——然后我看到你已经有了很多测试用例)


对于JUnit,请查看

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

您可以尝试在计算网格上运行分布式测试

从JUnit4.7开始,现在可以在不使用TestNG的情况下并行运行测试。事实上,从4.6开始就有可能了,但是在4.7中有许多修复程序将使它成为一个可行的选项。您还可以使用spring运行并行测试,您可以阅读spring的相关内容。提供了类似的功能,请查看文档以了解详细信息。它依赖于JUnit4.7,您只需将测试标记为
@RunWith(ConcurrentTestRunner)


干杯

您可以查看开源库-。它完全满足您的要求——并行运行不同的测试类。这在ant junit级别进行了集成,因此您不必在任何情况下更改测试。我是图书馆的作者之一

另外,考虑不要在线程中运行它们,因为您可能需要一个进程级沙箱。例如,如果您在集成测试中遇到一个DB,您不希望一个测试失败,因为另一个测试在不同的线程中添加了一些数据。大多数情况下,编写测试时并没有考虑到这一点

最后,到目前为止,您是如何解决这个问题的?

使用maven插件:


org.apache.maven.plugins
maven surefire插件
2.7.1
班级
5.

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

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);
                }
            }
        });
    }
}
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);
                }
            }
        });
    }
}

您可以使用Junit本身提供的ParallelComputer并行运行测试。这里有一个小片段让你开始

Class[] cls = { TestCase1.class, TestCase2.class };
Result result = JUnitCore.runClasses(ParallelComputer.classes(), cls);
List<Failure> failures = result.getFailures();
Class[]cls={TestCase1.Class,TestCase2.Class};
结果=JUnitCore.runClasses(ParallelComputer.classes(),cls);
List failures=result.getFailures();
当您需要从代码运行测试时,这将有所帮助,因为它不依赖于Maven或任何其他构建管理工具


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

另一个选择:Punner,一个新的并行junit runner和maven插件。您不必更改代码,只需将其复制到pom.xml:

<!-- Disable default surefire based testing -->
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>2.20</version>
  <configuration>
    <skip>true</skip>
  </configuration>
</plugin>

<plugin>
  <groupId>com.github.marks-yag</groupId>
  <artifactId>punner-maven-plugin</artifactId>
  <version>${version}</version>
  <configuration>
  </configuration>
  <executions>
    <execution>
      <id>test</id>
      <phase>test</phase>
      <goals>
        <goal>test</goal>
      </goals>
    </execution>
  </executions>
</plugin>
Punner生成与surefire兼容的输出,您还可以从reports目录获取原始日志数据和降价格式报告:

➜  ipc git:(develop) ll target/punner-reports
total 104
-rw-r--r--   1 guile  staff    11K Oct 15 23:07 TEST-com.github.yag.ipc.IPCTest.xml
-rw-r--r--   1 guile  staff   298B Oct 15 23:07 com.github.yag.ipc.IPCTest.txt
drwxr-xr-x  12 guile  staff   384B Oct  8 00:50 logs
-rw-r--r--   1 guile  staff    33K Oct 15 23:07 report.md
Punner是我的个人项目,我编写Punner是为了加速其他项目的单元测试阶段,如IPC框架、细粒度锁定、日志服务、分布式工作流引擎等。它节省了我大量的等待时间


Punner还不支持某些高级功能。如果您能尝试一下并给我一些反馈,我非常高兴。

不幸的是,这不是我所问问题的答案。并行junit仅在单个测试类中运行。TestNG也只在单个类中运行,我的测试不是TestNG测试。@PlatinumAzure:我更新了链接。我不知道这个项目是如何维持的。最近有人问我另一个问题。我尝试了GridGain解决方案,但遇到了两个主要问题。首先,您必须告诉GridGain从网格任务的类路径中排除GridGain也使用的任何东西,例如Spring和许多ApacheCommons的东西。其次,网络类加载虽然是一个绝妙的想法,但对于想要搜索类路径的库来说并不适用,例如Spring链接页面说“对于大多数双核解决方案,使用并行线程运行目前比使用非线程运行要快。”。仍然是这样吗?我认为如果你的测试进行任何IO,它们仍然会受益。例如,如果您的单元测试更像是集成测试,并且命中了数据库,那么并行运行应该会加快它们的速度。@Raedwald不要对简短的非io绑定单元测试期望过高,这正是我想要说的。更新版本的surefire也比文章中描述的2.5更好/更高效,因此您可能会获得稍好的结果。您声明这是可能的,但是否可以包含一个链接,以说明如何使用?你的第二个链接是“with spring”,我对此不感兴趣。@krosenvold链接?我正在努力寻找一个内置的解决方案。如果您使用的是Junit 4.7或更高版本,则surefire实际上支持。
[INFO] --- punner-maven-plugin:0.9.13:test (test) @ ipc ---
[INFO] Punner report directory: /Users/guile/workspace/ipc/target/punner-reports
[INFO]
[INFO] com.github.yag.ipc.IPCTest.testConnectionHandler.............. PASSED
[INFO] com.github.yag.ipc.IPCTest.testSequence....................... PASSED
[INFO] com.github.yag.ipc.IPCTest.testPartialContent................. PASSED
[INFO] com.github.yag.ipc.IPCTest.testResponseContent................ PASSED
[INFO] com.github.yag.ipc.IPCTest.testPingPong....................... PASSED
[INFO] com.github.yag.ipc.IPCTest.testServerClose.................... PASSED
[INFO] com.github.yag.ipc.IPCTest.testServerSideHeartbeatTimeout..... PASSED
[INFO] com.github.yag.ipc.IPCTest.testClientSideHeartbeatTimeout..... PASSED
[INFO] com.github.yag.ipc.IPCTest.testClientSideHeartbeat............ PASSED
[INFO] com.github.yag.ipc.IPCTest.testClientReconnect................ PASSED
[INFO]
[INFO] Tests run: 10, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 10.952 sec, Time saved: 25.919 sec.
➜  ipc git:(develop) ll target/punner-reports
total 104
-rw-r--r--   1 guile  staff    11K Oct 15 23:07 TEST-com.github.yag.ipc.IPCTest.xml
-rw-r--r--   1 guile  staff   298B Oct 15 23:07 com.github.yag.ipc.IPCTest.txt
drwxr-xr-x  12 guile  staff   384B Oct  8 00:50 logs
-rw-r--r--   1 guile  staff    33K Oct 15 23:07 report.md