如何让 maven surefire 正确执行 JUnit 和 TestNG 测试?
Posted
技术标签:
【中文标题】如何让 maven surefire 正确执行 JUnit 和 TestNG 测试?【英文标题】:Howto have maven surefire execute JUnit and TestNG test properly? 【发布时间】:2013-07-22 20:59:33 【问题描述】:有一段时间可以配置 maven surefire 以在一个构建中执行 jUnit 测试和 testNG 测试。我不会详细说明我这样做的原因(好吧,提示:testNG 是我们的标准框架,但像 jnario 这样的一些框架需要 jUnit)。
一般的做法是像这样配置surefire插件:
<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,以便两个框架的测试只能由它们的测试运行者执行?
【问题讨论】:
在 Maven-Users-List 上交叉发布:maven.40175.n5.nabble.com/… 【参考方案1】:和你有同样的问题。 TestNG 报告中的结果为零,但看起来已经运行了测试。
最后在maven-surefire-plugin
的两个单独执行中完成这项工作
-
首先从插件中删除
dependencies
部分。
否则,如果您使用<testNGArtifactName>
(我们将需要它),TestNG 无论如何都会执行测试,并且会在java.lang.NullPointerException
上失败
TestNG 测试和 JUnit 测试有一些分离。在我们的例子中,NG 测试类名称以TestNg
结尾
跳过默认执行
定义两个<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的想法的边缘
希望对你有帮助。
【讨论】:
我们还没有这样做,但我正在保存这个答案,等我们到达那里。【参考方案2】:我自己没有这样做,但是您可以尝试配置 maven-surefire-plugin 的两个 different executions 并将其中一个执行配置为仅运行 JUnit 测试,另一个仅运行 testNG 测试。要区分 JUnit 和 testNG 测试,您应该将测试放在不同的目录中或使用可区分的名称方案,并使用合适的 inclusion and exclusion patterns 配置每个执行。
理论上这应该可行:)
【讨论】:
我无法将<dependencies>
元素拉入执行。如果可以的话,那真的是 the 解决方案,一个执行仅限于 jUnit,另一个执行仅限于 TestNG :(
你误会了。我的意思是像原始问题一样拥有两个 不确定this 页面底部的 Running TestNG 和 JUnit 测试 部分是否在 2013 年存在,但在 surefire-testng
提供程序中设置 junit=false
现在似乎可以回答您的问题.
【讨论】:
以上是关于如何让 maven surefire 正确执行 JUnit 和 TestNG 测试?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 maven-surefire-plugin 在同一个项目中执行 JUnit 和 TestNG 测试?
在测试执行 Maven Surefire 插件时排除日志跟踪