如何在 maven 的集成测试目标中运行单个测试
Posted
技术标签:
【中文标题】如何在 maven 的集成测试目标中运行单个测试【英文标题】:How to run individual test in the integration-test target in maven 【发布时间】:2010-10-28 00:59:27 【问题描述】:我们在 Maven 中为集成测试阶段生命周期定义了数百个测试,它们需要很长时间才能完成。
我想做的只是在integration-test
中运行一项测试。我试着做:
mvn -Dtest=<my-test> integration-test
但这不起作用。 -Dtest
只运行单元测试目标中的测试,而不是集成测试阶段。我尝试了-Dintegration-test=<my-test>
,但被忽略了。
有没有办法做到这一点?
我的配置是:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<executions>
<execution>
<id>surefire-it</id>
<phase>integration-test</phase>
<goals>
<goal>test</goal>
</goals>
<configuration>
<excludes>
<exclude>none</exclude>
</excludes>
<includes>
<include>**/api/**</include>
</includes>
.....
【问题讨论】:
我刚刚在我的项目中完成了这项工作,并且成功了。你有没有机会从 pom 中发布 surefire 插件部分?如果您使用的是Maven failsafe plugin,则可以通过将it.test
属性设置为您的完全限定测试类名称来运行单个集成测试:
mvn -Dit.test=your.TestCase verify
见the failsafe plugin docs for more info。
【讨论】:
这在 2013 年 7 月 26 日对我有用,插件版本为 2.15 和 Maven 3.1.0,尽管其他答案是这样说的。另一个答案似乎是一个错误。 已针对 mvn 3.2.5、插件 2.18 验证。运行一个集成测试: mvn integration-test -Dit.test=MyClassIT 但是,这也运行单元测试: mvn verify -Dit.test=MyClassIT 请注意,这可能仍会运行单元测试。要关闭单元测试的执行,请添加-Dtest=foo -DfailIfNoTests=false
(假设 foo 不存在),请参阅***.com/questions/6612344/…。【参考方案2】:
Failsafe documentation 会让您像这样指定测试:
mvn -Dit.test=BrokenIT verify
但是,-Dit.test 似乎不再起作用了。相反,用于指定 Surefire 测试的相同参数显然也适用于 Failsafe。例如:
mvn -Dtest=WorksIT verify
我已经提交了bug(编辑: 在 2.12 中被关闭为“无法复制”)以更正文档。
【讨论】:
无法触发构建测试环境的build-helper-maven-plugin。 @okwap 这听起来像是您的项目和插件设置所特有的,而不是故障安全/集成测试问题。 5 年后...我遇到了类似的问题 -Dit.test,或者任何带有点的参数都不起作用。通过 cmd 而不是 powershell 运行命令为我修复了它。【参考方案3】:只需添加 -DfailIfNoTests=false
即可使用 testNG 为我工作。像这样的:
mvn integration-test -Dtest=aITest -DfailIfNoTests=false
【讨论】:
【参考方案4】:我为此苦苦挣扎,并创建了一个额外的配置文件,以便在我只想运行一个集成测试时使用。我希望我在这里成功提取了正确的部分:
<profile>
<id>integrationTestSingle</id>
<build>
<plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<executions>
<execution>
<id>surefire-it</id>
<phase>integration-test</phase>
<goals>
<goal>test</goal>
</goals>
<configuration>
<includes>
<include>**/integration/**/$test.java</include>
</includes>
<skipTests>false</skipTests>
</configuration>
</execution>
</executions>
<configuration>
<argLine>-Xms256M -Xmx768M -XX:MaxPermSize=256M</argLine>
</configuration>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<executions>
<execution>
<id>default-test</id>
<configuration>
<skipTests>true</skipTests>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
现在,我使用 integrationTestSingle 配置文件和 -DfailIfNoTests=false -Dtest=NameOfTest
调用 maven,它在常规“测试”阶段不运行任何常规测试,而在集成测试期间仅运行 NameOfTest
测试阶段。
【讨论】:
【参考方案5】:我不确定 JUnit,但对于 TestNG,策略是定义一个只有一个测试的套件 XML 文件,然后在您的 POM 中配置surefire插件以仅运行它。在你的 POM 中,你会有这样的东西(免责声明,这是未经测试的):
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<executions>
<execution>
<phase>integration-test</phase>
<configuration>
<suiteXmlFiles>
<suiteXmlFile>single-test.xml</suiteXmlFile>
</suiteXmlFiles>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
要配置套件文件,请参阅http://testng.org/doc/documentation-main.html
【讨论】:
我同意詹姆斯的观点。 TestNG 适合这种情况,但我认为最好使用 TestNG 组:@Test(groups = "slow_test" ) 然后在您的 TestNG 套件中:我自己也遇到了。这样的事情对我很有效:
mvn -Pintegration-test -Dtest=<my-test>
诀窍是确保在 -Dtest 部分之前提到了测试组。
【讨论】:
【参考方案7】:我正在使用: Apache Maven 3.6.3
openjdk version "11.0.2" 2019-01-15
<groupId>org.codehaus.mojo</groupId>
<artifactId>failsafe-maven-plugin</artifactId>
<version>2.4.3-alpha-1</version>
这个命令对我有用:
mvn failsafe:integration-test -Dsurefire.skip=true -DskipIntegrationTests=false -DskipTests=false -Dtest=com.myxyz.func.ITestGate
【讨论】:
【参考方案8】:通过使用实际文档回到基础知识,实际上比上面的答案更简单。
运行 Junit 5 集成测试:
openjdk version "11.0.11" 2021-04-20
Apache Maven 3.6.3
在主构建中,只需放入记录的故障安全配置:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>3.0.0-M5</version>
<executions>
<execution>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
然后你可以只运行一个特定的集成测试:
mvn -Dtest=\*cs1_\* verify
请注意,此版本将在 target
文件夹中运行您的测试,如果您需要加载任何类似于 src\test\resources\x.y
的外部文件,则将它们复制到 target\test-classes\x.y
【讨论】:
【参考方案9】:这对我有用,当我在集成测试中只运行一种测试方法时
mvn clean -Dit.test=some.package.SomeTestClass#testMethodName integration-test
【讨论】:
以上是关于如何在 maven 的集成测试目标中运行单个测试的主要内容,如果未能解决你的问题,请参考以下文章
运行 Maven 集成测试时获取“在分支目标处期望堆栈图帧”
如何使用 Maven Surefire 插件与不同的组进行测试和集成测试?