2010-08-30 173 views
8

使用Maven surefire,我无法执行并行测试。也就是说,我的每个测试用例都可以运行在一个serapate JVM中,因此是分叉的。另外,我希望我的测试用例能够并行运行。第一部分没有问题:我可以在自己的JVM中运行每个测试用例。但第二部分对我来说仍然是一个挑战。我没有设法让测试案例的并行执行工作。这里是我的插件声明如何:Maven Surefire:无法执行并行测试执行

<plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-surefire-plugin</artifactId> 
     <version>2.5</version> 
     <configuration> 
      <parallel>methods</parallel> 
      <forkMode>always</forkMode> 
       <argLine>-Xms512m -Xmx512m</argLine> 
     </configuration> 
</plugin> 

我试过两种方法和类,但没有看到任何并行化。 我的JUnit版本是4.7,如图由depency声明:

<dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>4.7</version> 
     <scope>compile</scope> 
    </dependency>    

任何帮助将非常appricated。

Gregoire。

回答

7

我认为你应该使用parallel模式时使用的threadCount参数:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <version>2.6</version> 
    <configuration> 
     <forkMode>always</forkMode> 
     <argLine>-Xms512m -Xmx512m</argLine> 
     <parallel>methods</parallel> 
     <threadCount>4</threadCount> 
    </configuration> 
    </plugin> 
2

确保您就在抽穗前获得一个日志消息是这样的

[INFO] Concurrency config is {perCoreThreadCount=false, threadCount=1, parallel=classes, configurableParallelComputerPresent=true} 

------------------------------------------------------- 
T E S T S 
------------------------------------------------------- 

此消息表明并行的surefire junit提供者是活跃的。

如果这不存在surefire可能会采取不同的版本junit比你想象的。低于4.7的任何内容都不起作用。运行mvn依赖关系:树来检查哪个版本存在。

您还应该升级到surefire 2.6,因为修复了与并行运行相关的一些小错误。出于同样的原因,你应该使用最新的junit。

+0

你不想让perCoreThreadCount成为true吗?否则拥有threadCount 1,意味着你只用一个线程并行运行,即串行? – Nicolai 2011-05-06 07:44:27

+0

不,您希望分布在每个可用内核上的线程,而不是一个内核上的所有线程。不幸的是,他们将默认设置为perCoreThreadCount = true,在一个内核上执行所有线程。 – rwst 2012-09-11 15:17:46

0

你确定它不工作?如果您的测试不包含许多测试方法,则可能无法获得太多加速。使用forkMode =总是可以做的最好的做法是并行地在一个类中运行所有测试方法。

1

尝试将您的forkMode从始终更改为“never”。它没有在他们的文档中说明这一点,但是此时你不能有fork和parallel(我们在通过surefire代码挖掘之后发现了这个)。

只是你知道,你可能会遇到不是测试由于许多测试/支持库(easymock,powermock等)导致线程安全,从而使并行测试的能力无效。

4

我有同样的问题,因为我用万无一失的2.7版本,升级后的2.12它具有以下配置工作:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <version>2.12</version> 
    <configuration> 
    <parallel>classes</parallel> 
    <forkMode>perthread</forkMode> 
    <threadCount>4</threadCount> 
    </configuration> 
</plugin> 

它催生了4线程,每个线程运行它自己的JVM。

+1

这个解决方案有一个在maven-surefire-plugin 2.13中解决的bug。检查此线程的更多信息:http://stackoverflow.com/questions/11098073/maven-surefire-failsafe-forkmode-perthread-is-not-working-a-workaround – ggarciao 2012-09-12 07:49:42

0

surefire 2.16修复了有关JUnit测试的并行执行。