我有一个Maven构建,我使用SureFire插件运行一些单元测试,而FailSafe插件运行一些集成测试。我想要一种方法来运行FailSafe插件的测试。
对于我来说,在pom中添加不同的配置文件或任何内容并不是一个好的解决方案,因为它是一个多模块构建,我不想编辑每个模块的pom。
有skip.tests
和maven.test.skip
以及skipTests
停止所有测试,而skipITs
只停止故障安全插件。
那么,Maven是否有skipITs
的命令行标志,而是“onlyITs”的功能?
答案 0 :(得分:143)
我发现只跳过surefire测试的最简单方法是配置surefire(但不是failafe ),如下所示:
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.14</version>
<configuration>
<!-- skips surefire tests without skipping failsafe tests.
Property value seems to magically default to false -->
<skipTests>${skip.surefire.tests}</skipTests>
</configuration>
</plugin>
这允许你运行mvn verify -Dskip.surefire.tests
并且只有surefire,而不是故障安全,测试将被跳过;它还将运行所有其他必要的阶段,包括预集成和后集成,并且如果集成测试失败,还将运行实际使maven构建失败所需的verify
目标。
请注意,这会重新定义用于指定应跳过测试的属性,因此如果您提供规范-DskipTests=true
,则surefire将忽略它,但failsafe将尊重它,这可能是意外的,尤其是如果您已经存在已建立/用户指定该标志。一个简单的解决方法似乎是将skip.surefire.tests
默认为skipTests
的{{1}}部分中的<properties>
值:
<properties>
<skip.surefire.tests>${skipTests}</skip.surefire.tests>
</properties>
如果需要,你可以为故障保护提供一个名为skip.failsafe.tests
的类似参数,但是我没有发现它是必要的 - 因为单元测试通常在早期阶段运行,如果我想运行单元测试但不是集成测试,我会运行test
阶段而不是verify
阶段。您的经历可能会有所不同!
这些skip.(surefire|failsafe).tests
属性应该可以集成到surefire / failafe代码中,但是我不确定它会违反多少“它们是完全相同的插件,除了1个微小差异”的精神。 / p>
答案 1 :(得分:105)
解决方法是致电:
mvn clean test-compile failsafe:integration-test
不可否认,这很难看,但它可以解决你的问题。
或(另一个黑客):
mvn clean integration-test -Dtest=SomePatternThatDoesntMatchAnything -DfailIfNoTests=false
<强>参考:强>
答案 2 :(得分:52)
我正在使用Antonio Goncalves Blog中的代码,这完美无缺。
您可以使用以下属性:
-DskipUTs=true
用于跳过surefire测试。
-DskipITs=true
用于跳过故障安全测试。
-DskipTests=true
用于跳过所有测试。
pom.xml
如下:
<properties>
<skipTests>false</skipTests>
<skipITs>${skipTests}</skipITs>
<skipUTs>${skipTests}</skipUTs>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19.1</version>
<configuration>
<skipTests>${skipUTs}</skipTests>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>2.19.1</version>
<executions>
<execution>
<id>run-integration-tests</id>
<phase>integration-test</phase>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
</execution>
</executions>
<configuration>
<skipTests>${skipTests}</skipTests>
<skipITs>${skipITs}</skipITs>
</configuration>
</plugin>
</plugins>
</build>
答案 3 :(得分:18)
希望这有帮助!
尝试仅使用FailSafe运行测试(用于集成测试的插件 - 默认情况下,它允许您仅使用此类命名运行集成测试: * / IT .java,** / IT.java,* / * ITCase.java; ,但您可以轻松地从pom文件中更改它
mvn failsafe:integration-test
当你只想使用SureFire(插件进行单元测试)时
mvn surefire:test
或一次一次测试:
mvn -Dtest=MyUnitlTest
答案 4 :(得分:5)
我喜欢这样,所以每个阶段都会正常执行:
mvn -Dtest=foo -DfailIfNoTests=false verify
答案 5 :(得分:1)
要扩展@danidemi和@GuillaumeHusta的评论,
FYI:Failsafe插件3.0.0-M3(SUREFIRE-1611)中不推荐使用skipTests
因此,如果您使用的是最新版本的Failsafe插件,则可以跳过单元测试,而不跳过集成测试:
mvn verify -DskipTests
(如果有帮助,请给提到的评论加分)
答案 6 :(得分:0)
这会跳过由 UnitTests
触发的 SureFire
并且只测试一个测试:
mvn failsafe:integration-test -Dit.test=YourTestName
您还可以提供一个模式:
mvn failsafe:integration-test -Dit.test=*
(Maven 3.6.3)
答案 7 :(得分:-1)
尝试在单独的配置文件中运行集成或单元测试。然后你可以启用/禁用配置文件。