2013-07-23 58 views
5

既然可以配置maven surefire在一个版本中执行jUnit测试和testNG测试。我不会详细说明为什么我这么做(ok,提示:testNG是我们的标准框架,但是像jnario这样的框架需要jUnit)。如何让maven surefire正确执行JUnit和TestNG测试?

一般的方式做到这一点是配置万无一失插件这样的:

<plugin> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <version>${surefire.version}</version> 
    <dependencies> 
     <dependency> 
      <groupId>org.apache.maven.surefire</groupId> 
      <artifactId>surefire-junit47</artifactId> 
      <version>${surefire.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.maven.surefire</groupId> 
      <artifactId>surefire-testng</artifactId> 
      <version>${surefire.version}</version> 
     </dependency> 
    </dependencies> 
</plugin> 

(taken from here)

这工作得很好,JUnit测试和TestNG测试得到执行。

但是 - 现在我看到testNG也尝试执行jUnit测试(可能反之亦然) - 当然没有成功,因为它不会看到它的任何注释,但它看起来像它重新将测试标记为“通过”...无论如何,除非我评论第二个依赖关系条目,否则某些报告工具不会在jUnit测试中显示测试失败。

有没有更好的方法来配置surefire,以便两个框架的测试只能由他们的测试运行者执行?

+0

交叉发布在Maven-Users-List上:http://maven.40175.n5.nabble。com/maven-surefire-selecting-providers-td5764817.html –

回答

1

我自己并没有这样做,但是您可以尝试配置maven-surefire-plugin的两个different executions,并将其中一个配置为仅运行JUnit测试,另一个仅运行testNG测试。要区分JUnit和testNG测试,您应该将测试放在不同的目录中或使用可区分的名称方案,并使用合适的inclusion and exclusion patterns配置每个执行。

理论上这应该工作:)

+0

我无法将''元素拉入执行。如果可以的话,那么它真的是*解决方案,一个执行限于jUnit,另一个执行TestNG :( –

+0

你让我错了,我的意思是两个与原始问题一样。配置不同的包含/排除,一个执行只能找到JUnit测试,另一个只能找到testNG测试,这样不必要的测试就会被surefire过滤掉,不会传递给测试框架 –

+1

啊,是的,我也尝试过(并且更糟糕)TestNG get被激活了所有的执行,并且如果一个执行没有测试运行(没错,有一个属性......),构建失败 - 看起来好像我找到了一个bug,从maven的用户邮件列表强烈鼓励我[报告问题](https://jira.codehaus.org/browse/SUREFIRE-1019)。+1回答与帮助! –

4

与您有同样的问题。 TestNG报告中的零结果,但看起来像测试运行。 最后得到的maven-surefire-plugin

  1. 两个独立的执行这项工作首先从插件删除dependencies部分。
    • 否则,如果您使用<testNGArtifactName>(我们会需要它)测试将通过TestNG的反正执行和java.lang.NullPointerException
  2. 有TestNG的测试和JUnit测试部分的分离将失败。在我们的例子NG测试类的名字与TestNg
  3. 跳过默认执行
  4. 结束这样定义空两<executions>
<plugin> 
    <!-- configured to work with JUnit and TestNg in same project separatelly --> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-surefire-plugin</artifactId>    
    <configuration> 
     <!-- whatever you need... --> 
     <!-- skip the default execution, we have separate for Ng and for JUnit --> 
     <skip>true</skip> 
    </configuration> 
    <executions> 
     <execution> 
      <id>TestNg-execution</id> 
      <phase>test</phase> 
      <goals> 
       <goal>test</goal> 
      </goals> 
      <configuration> 
       <!-- overwrite skip from default config --> 
       <skip>false</skip> 
       <includes> 
        <include>%regex[.*TestNg.*]</include> 
       </includes> 
       <!-- used to skip JUnit profider --> 
       <junitArtifactName>dev:null</junitArtifactName> 
       <!-- to continue on next execution in case of failures here --> 
       <testFailureIgnore>true</testFailureIgnore> 
      </configuration> 
     </execution> 
     <execution> 
      <id>JUnit-execution</id> 
      <phase>test</phase> 
      <goals> 
       <goal>test</goal> 
      </goals> 
      <configuration> 

       <skip>false</skip> 
       <!-- used to skip TestNg profider --> 
       <testNGArtifactName>dev:null</testNGArtifactName> 
       <excludes> 
        <exclude>%regex[.*TestNg.*]</exclude>        
       </excludes> 
      </configuration>      
     </execution> 
    </executions> 
</plugin> 

测试了:

<junit-version>4.11</junit-version> 
<maven-surefire-plugin-version>2.16</maven-surefire-plugin-version> 
<org.testng-version>6.8.7</org.testng-version> 

这种配置的玛吉来自:
Running TestNG-, JUnit3- and JUnit4-tests with Maven Surefire in one run
your SUREFIRE bug report,
surefire plugin configuration

希望它有帮助。

+0

卓越的解决方案! – bedrin

相关问题