如何参数化 Maven surefire 插件,以便我可以选择运行哪些 TestNG 套件
Posted
技术标签:
【中文标题】如何参数化 Maven surefire 插件,以便我可以选择运行哪些 TestNG 套件【英文标题】:How to parametrize Maven surefire plugin so I can choose which TestNG suites to run 【发布时间】:2012-07-08 23:38:34 【问题描述】:我在 TestNG 中有很多测试套件。这些是 XML 文件。从 maven 运行集成测试时,我希望能够选择多个 XML 套件。
目前我可以像这样将套件文件添加到 pom.xml:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<suiteXmlFiles>
<suiteXmlFile>$pathToMySuiteFile_1</suiteXmlFile>
<suiteXmlFile>$pathToMySuiteFile_1</suiteXmlFile>
</suiteXmlFiles>
</configuration>
</plugin>
此解决方案有一些限制。我只能更改我在 pom.xml 中定义的测试套件的路径。所以在我的例子中,它总是必须是两个文件。我无法运行,比如说 5 个套件或只有一个。
有没有办法以某种方式参数化 pom.xml 中的整个“suiteXmlFiles”部分?
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<suiteXmlFiles>
$multiple_paths_ToMySuiteFiles
</suiteXmlFiles>
</configuration>
</plugin>
运行与给定测试组匹配的所有内容对我来说不是一个选项: 我不想加载我拥有的所有套件,然后使用 TestNG 套件中的组只运行选定的测试。原因是运行所有带有组过滤器的测试套件后生成的报告与仅运行选定的测试套件时生成的报告不同。
【问题讨论】:
【参考方案1】:根据User Property 的suiteXmlFiles
可以使用:
mvn test -Dsurefire.suiteXmlFiles=test1.xml,test2.xml
【讨论】:
使用此方案,无需在 pom.xml 文件中指定[ERROR] Unknown lifecycle phase ".suiteXmlFiles=test1.xml,test2.xml". You must specify a valid lifecycle phase or a goal in the format <plugin-prefix>:<goal> or <plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>.
【参考方案2】:
我们的测试也遇到了这个问题。 我们现在使用的当前解决方法是在属性部分定义一个属性变量并将其注入到sure-fire suiteXmlFiles 块中。
<properties>
<!-- Default suites -->
<batsSuiteFile>$project.build.testOutputDirectory/BatsTests.xml</batsSuiteFile>
<smokeSuiteFile>$project.build.testOutputDirectory/SmokeTests.xml</smokeSuiteFile>
<!-- Default suite files if not being specified from mvn command line -->
<defaultSuiteFiles>$batsSuiteFile,$smokeSuiteFile</defaultSuiteFiles>
<suiteFile>$defaultSuiteFiles</suiteFile>
</properties>
然后在插件部分...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.12</version>
<configuration>
<suiteXmlFiles>
<!-- Suite file injection parameter from command line -->
<suiteXmlFile>$suiteFile</suiteXmlFile>
</suiteXmlFiles>
</configuration>
</plugin>
如果没有从命令行指定任何内容,它将回退并默认使用上面属性部分中指定的 2 个套件。 然后,如果您想启动一组指定的套件文件,您可以这样做:
mvn test -DsuiteFile=test1.xml,test2.xml
令人惊讶的是,从 maven 文档中您期望 arg suiteXmlFiles 应该只从命令行覆盖它,并且应该只接受一个逗号分隔的 testng xmls 列表 http://maven.apache.org/plugins/maven-surefire-plugin/test-mojo.html#suiteXmlFiles
如果有人有其他更好的方法,请分享。
【讨论】:
另一种方法是在另一个 mvn -D 测试 $path/test1 test , mvn -D tests $path/test2 test 和依赖项之后运行以下命令集-Dsurefire.suiteXmlFiles
。请参阅下面的答案。
@norbertpy 这个例子也使用了那个变量:)【参考方案3】:
您可以使用groups参数或在命令行中指定-Dgroups=...:
(仅带有 JUnit4.8+ 的 TestNG/JUnit47 提供程序)此测试的组。 仅用指定的组之一装饰的类/方法/等 如果指定,此处将包含在测试运行中。对于 JUnit,这 参数强制使用 4.7 提供者 此参数被忽略 如果指定了 suiteXmlFiles 参数。 .
【讨论】:
我提到我不想使用组,因为它会破坏测试结果报告并且不够灵活 灵活与否,但这是您唯一的选择。它可以像您的组一样灵活。当然,除了运行单独的测试。以上是关于如何参数化 Maven surefire 插件,以便我可以选择运行哪些 TestNG 套件的主要内容,如果未能解决你的问题,请参考以下文章
如何使 maven cobertura 和 surefire 插件一起工作?
如何使用 Maven Surefire 插件与不同的组进行测试和集成测试?
Maven Surefire 插件没有重新运行失败的 Cucumber 测试
retryAnalyzer 后如何将 TestNG DefaultSuite 结果发送到 Maven Surefire 插件