2013-03-20 263 views
9

我在使用JUnit,Groovy,Spock和Maven时并行执行JUnit测试时出现问题。当执行他们,我得到下面的测试之后,成功地通过了:JUnit + Maven +并行测试执行错误

[INFO] ------------------------------------------------------------------------ 
[INFO] BUILD FAILURE 
[INFO] ------------------------------------------------------------------------ 
[INFO] Total time: 18.362s 
[INFO] Finished at: Wed Mar 20 15:14:25 CET 2013 
[INFO] Final Memory: 16M/221M 
[INFO] ------------------------------------------------------------------------ 
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.14:test (default-test) on project spock-webdriver: ExecutionException; nested exception is java.util.concurrent.ExecutionException: java.lang.RuntimeException: There was an error in the forked process 
[ERROR] java.lang.NoSuchMethodError: org.apache.maven.surefire.common.junit4.JUnit4RunListener.rethrowAnyTestMechanismFailures(Lorg/junit/runner/Result;)V 
[ERROR] at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:129) 
[ERROR] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
[ERROR] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
[ERROR] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
[ERROR] at java.lang.reflect.Method.invoke(Method.java:601) 
[ERROR] at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray2(ReflectionUtils.java:208) 
[ERROR] at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:158) 
[ERROR] at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:86) 
[ERROR] at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:153) 
[ERROR] at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:95) 
[ERROR] -> [Help 1] 
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. 
[ERROR] Re-run Maven using the -X switch to enable full debug logging. 
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles: 
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException 

当使能在我的pom.xml使用JUnit 47提供给力,我得到:

[INFO] ------------------------------------------------------------------------ 
[INFO] BUILD FAILURE 
[INFO] ------------------------------------------------------------------------ 
[INFO] Total time: 3.271s 
[INFO] Finished at: Wed Mar 20 15:31:42 CET 2013 
[INFO] Final Memory: 17M/178M 
[INFO] ------------------------------------------------------------------------ 
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.14:test (default-test) on project spock-webdriver: ExecutionException; nested exception is java.util.concurrent.ExecutionException: java.lang.RuntimeException: There was an error in the forked process 
[ERROR] java.lang.NoSuchMethodError: org.apache.maven.surefire.util.TestsToRun.size()I 
[ERROR] at org.apache.maven.surefire.junitcore.JUnitCoreProvider.invoke(JUnitCoreProvider.java:123) 
[ERROR] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
[ERROR] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
[ERROR] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
[ERROR] at java.lang.reflect.Method.invoke(Method.java:601) 
[ERROR] at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray2(ReflectionUtils.java:208) 
[ERROR] at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:158) 
[ERROR] at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:86) 
[ERROR] at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:153) 
[ERROR] at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:95) 
[ERROR] -> [Help 1] 
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. 
[ERROR] Re-run Maven using the -X switch to enable full debug logging. 
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles: 
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException 

pom.xml中看起来是这样的

<dependencies> 
     <dependency> 
      <groupId>org.seleniumhq.selenium</groupId> 
      <artifactId>selenium-java</artifactId> 
      <version>2.31.0</version> 
      <scope>compile</scope> 
     </dependency> 

     <!--If this is commented out parallel testing is not working!!! When in testexecution itself is not working --> 
     <dependency> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-surefire-plugin</artifactId> 
      <version>2.14</version> 
     </dependency> 

     <dependency> 
      <groupId>org.spockframework</groupId> 
      <artifactId>spock-maven</artifactId> 
      <version>0.7-groovy-2.0</version> 
      <scope>test</scope> 
     </dependency> 
    </dependencies> 

    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.codehaus.gmaven</groupId> 
       <artifactId>gmaven-plugin</artifactId> 
       <version>1.3</version> 
       <configuration> 
        <providerSelection>1.7</providerSelection> 
        <source/> 
       </configuration> 
       <executions> 
        <execution> 
         <goals> 
          <goal>testCompile</goal> 
         </goals> 
        </execution> 
       </executions> 
       <dependencies> 
        <dependency> 
         <groupId>org.codehaus.gmaven.runtime</groupId> 
         <artifactId>gmaven-runtime-1.7</artifactId> 
         <version>1.3</version> 
         <exclusions> 
          <exclusion> 
           <groupId>org.codehaus.groovy</groupId> 
           <artifactId>groovy-all</artifactId> 
          </exclusion> 
         </exclusions> 
        </dependency> 
        <dependency> 
         <groupId>org.codehaus.groovy</groupId> 
         <artifactId>groovy-all</artifactId> 
         <version>2.0.6</version> 
        </dependency> 
       </dependencies> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-surefire-plugin</artifactId> 
       <version>2.14</version> 
       <dependencies> 
       </dependencies> 
       <configuration> 
        <includes> 
         <include>**/*Test.java</include> 
        </includes> 
        <!-- Surefire 2.14+ configuration for parallelization --> 
        <forkCount>5</forkCount> 
        <reuseForks>false</reuseForks> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 
+0

如果您启动测试顺序会发生什么?使用另一个版本的'junit','surefire'? – 2013-03-20 14:37:27

+0

没有太多取决于Surefire版本我得到例如2.12.2 '无法执行目标org.apache.maven.plugins:maven-surefire-plugin:2.12.2:项目测试(默认测试)spock-webdriver :执行目标为org.apache.maven.plugins的默认测试:maven-surefire-plugin:2.12.2:测试失败:分叉的虚拟机终止而没有正确地说再见。虚拟机崩溃或System.exit调用? - > [Help 1]' – 2013-03-20 15:16:05

+0

在添加spock依赖后立即崩溃。我尝试了硒和junit依赖,并建立它。添加spock依赖到我的pom后,它不起作用。尝试了几个spock版本 – 2013-03-20 15:49:50

回答

1

尝试使用2.9版本或以上

<groupId>org.apache.maven.plugins</groupId> 
<artifactId>maven-surefire-plugin</artifactId> 
<version>2.9</version> 
0

我不确定这是否相关,但当我在Maven中运行我的Grails Spock测试时,我遇到了“分支进程中出现错误”错误。原来,我在我的文件名缺少一个“S”:

MyCoolTest.groovy => MyCoolTests.groovy

6

这是一个古老的线程,但为别人谁可能碰到这个问题......这错误是由于与surefire插件依赖和spock 0.7.0依赖不一致而导致的。 Spock使用surefire-junit47,2.11版本。这个类/方法,JUnit4RunListener.rethrowAnyTestMechanismFailures在那个surefire版本中不存在。解决的办法是排除来自斯波克依赖的定义是这样的神火版本:

<dependency> 
    <groupId>org.spockframework</groupId> 
    <artifactId>spock-maven</artifactId> 
    <version>0.7-groovy-2.0</version> 
    <exclusions> 
     <exclusion> <!-- exclude so we can pick up surefire-junit4 2.17 version for failsafe integration tests --> 
      <groupId>org.apache.maven.surefire</groupId> 
      <artifactId>surefire-junit47</artifactId> 
     </exclusion> 
    </exclusions> 
</dependency> 

现在,它将使用万无一失的版本,你已经定义,完整性,这里的神火依赖我用:

<dependency> 
    <groupId>org.apache.maven.surefire</groupId> 
    <artifactId>surefire-junit4</artifactId> 
    <version>2.17</version> 
</dependency> 

然后确保插件定义允许单元测试和集成测试单独进行(这部分更多的是关于获得单元测试,集成测试,spock,maven和groovy玩的很好)。

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <version>2.17</version> 
    <dependencies> 
     <dependency> 
      <groupId>org.apache.maven.surefire</groupId> 
      <artifactId>surefire-junit4</artifactId> 
      <version>2.17</version> 
     </dependency> 
    </dependencies> 
    <configuration> 
     <forkCount>0</forkCount> 
     <includes> 
      <include>%regex[.*Test.*]</include> 
     </includes> 
     <excludes> 
      <exclude>%regex[.*IntegrationTest.*]</exclude> 
     </excludes> 
    </configuration> 
</plugin> 

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-failsafe-plugin</artifactId> 
    <version>2.17</version> 
    <configuration> 
     <includes> 
      <include>%regex[.*IntegrationTest.*]</include> 
     </includes> 
    </configuration> 
    <executions> 
     <execution> 
      <id>failsafe-integration-tests</id> 
      <goals> 
       <goal>integration-test</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

现在,单元测试将触发与测试目标,测试和集成测试可以推出独立于这样的需求:MVN故障保护:集成测试

+0

这帮助我们解决了我们的问题。谢谢! – Steve 2014-09-23 13:08:22