阻止单元测试,但允许在 Maven 中进行集成测试
Posted
技术标签:
【中文标题】阻止单元测试,但允许在 Maven 中进行集成测试【英文标题】:Prevent unit tests but allow integration tests in Maven 【发布时间】:2011-09-30 12:56:02 【问题描述】:我有一个 Maven 版本,我在其中使用 SureFire 插件运行一些单元测试,并使用 FailSafe 插件运行一些集成测试。我想要一种只运行 FailSafe 插件测试的方法。
在 pom 中添加不同的配置文件或任何内容对我来说不是一个好的解决方案,因为它是一个多模块构建,我不想编辑每个模块的 pom。
有skip.tests
和maven.test.skip
和skipTests
停止所有 测试,还有skipITs
,它只停止故障保护插件。
那么,有没有像 skipITs
这样的 Maven 命令行标志,而是具有“onlyITs”的功能?
【问题讨论】:
@khmarbaise 在理论上,是的。但在我参与过的大多数项目中,“单元测试”实际上是与内存数据库进行集成测试(如果你幸运的话) @khmarbaise 大量的单元测试。它们需要几分钟才能运行,在这种情况下我们不需要它们运行。具体来说,我们在构建工件之前运行单元测试(当然),但我们希望在多个环境中运行 IT。此时没有必要重新运行单元测试。 嗨@khmarbaise,在我的设置中skipTests
只跳过安全测试,而不是故障安全测试!也许这是一个新功能?
仅供参考:故障安全插件 3.0.0-M3 (SUREFIRE-1611) 中现已弃用 skipTests
拥有 Failsafe Plugin 3.0.0-M5,它仍然会跳过与 skipTests
的集成测试。根据源代码中的注释skipTests
将在 Failsafe 3.0.0 中删除
【参考方案1】:
我发现只跳过surefire测试的最简单方法是配置surefire(但不是故障保护),如下所示:
<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
,并且只会跳过安全测试,而不是故障安全测试;它还将运行所有其他必要的阶段,包括预集成和集成后,并且还将运行verify
目标,如果您的集成测试失败,则实际使您的 maven 构建失败。 p>
请注意,这重新定义了用于指定应跳过测试的属性,因此,如果您提供规范的 -DskipTests=true
,surefire 将忽略它,但故障安全将尊重它,这可能是意外的,尤其是如果您有现有的构建/用户已经指定了该标志。一个简单的解决方法似乎是在 pom 的 <properties>
部分默认 skip.surefire.tests
为 skipTests
的值:
<properties>
<skip.surefire.tests>$skipTests</skip.surefire.tests>
</properties>
如果您需要,您可以提供一个名为 skip.failsafe.tests
的类似参数用于故障安全,但我认为没有必要 - 因为单元测试通常在较早的阶段运行,如果我想运行单元测试但不是集成测试,我会运行test
阶段而不是verify
阶段。您的体验可能会有所不同!
这些skip.(surefire|failsafe).tests
属性可能应该集成到surefire/failsafe代码本身中,但我不确定它会在多大程度上违反“它们是完全相同的插件,除了1个微小的差异”的精神。
【讨论】:
使用这个解决方案,我已经能够设置我的框架,所以 -DskipUnitTests 跳过了 surefire 插件, -DskipIntegrationTests 跳过了故障安全插件, DskipTests 跳过了两者。正是需要的! 我的 IDE 抱怨“无法解析符号 'skipTests'” 解决方案是添加一行<skipTests>false</skipTests>
仍然适用于 -DskipTests 或 -Dskip.surefire.tests 作为命令行参数的任意组合似乎覆盖了***.com/questions/13708738/… 属性,您可能希望将其添加到您的解决方案中
<skipTests>$skip.surefire.tests</skipTests>
不适用于maven-surefire-plugin
版本3.0.0-M3
。所有万无一失的测试仍在运行。还有人发现这个吗?但是,肖恩·帕特里克·弗洛伊德 (Sean Patrick Floyd) 的以下解决方案正在发挥作用。【参考方案2】:
一种解决方法是调用:
mvn clean test-compile failsafe:integration-test
诚然,这很丑陋,但它可能会解决您的问题。
或者(另一个黑客):
mvn clean integration-test -Dtest=SomePatternThatDoesntMatchAnything -DfailIfNoTests=false
参考:
surefire:test#test
surefire:test#failIfNoTests
【讨论】:
这是个好主意吗? 即使您的集成测试失败,这不会导致您的构建成功吗? 这就是故障安全的全部精髓,if you don't also run the 'verify' goal。引用:“Failsafe 插件在集成测试阶段不会使构建失败”。您需要运行验证目标来实际告诉您集成测试是否成功! @bacar 是对的,但在第二个解决方案中只使用verify
而不是integration-test
。
@MatthewGilliard 仍然有点老套,如果你没有充分的理由设置-DfailIfNoTests=false
无论如何(故障安全也会尊重这个标志)......但我现在正在寻找缺陷:-)
如果您将failsafe:verify
添加到第一个 hack (mvn clean test-compile failsafe:integration-test failsafe:verify
) 的末尾,如果其中一个集成测试失败,它将导致构建失败。
第一个解决方案也适用于运行单个测试:mvn -Dit.test=<testName> failsafe:integration-test
【参考方案3】:
我正在使用来自 Antonio Goncalves Blog 的代码,效果很好。
您可以使用以下属性:
-DskipUTs=true
跳过可靠测试。
-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>
【讨论】:
谢谢,很棒的方法!覆盖surefire的默认执行(默认测试)也很有用,请参阅:***.com/questions/11935181/… 确实是一个不错的解决方案。但是,故障安全配置是多余的,因为skipITs
是默认配置。
SkipITs 是此配置中的自定义选项。您在默认实现中是对的,但这不是 OP 的问题。【参考方案4】:
希望这会有所帮助!
尝试仅使用 FailSafe 运行测试(集成测试插件 - 默认情况下,它将允许您仅使用这种命名运行集成测试: */IT.java, **/IT.java, */*ITCase.java; ,但您可以轻松地从 pom 文件中更改它)
mvn failsafe:integration-test
当您只想使用 SureFire(用于单元测试的插件)时
mvn surefire:test
或一次进行一项测试:
mvn -Dtest=MyUnitlTest
【讨论】:
【参考方案5】:我确实喜欢这样,所以每个阶段都会正常执行:
mvn -Dtest=foo -DfailIfNoTests=false verify
【讨论】:
不需要按照 OP 的要求在 pom 中添加任何内容,并按照指示运行所有阶段。很好的答案。 这个技巧被低估了。感谢您的提示。【参考方案6】:这会跳过SureFire
触发的UnitTests
,只测试一个测试:
mvn failsafe:integration-test -Dit.test=YourTestName
您还可以提供一个模式:
mvn failsafe:integration-test -Dit.test=*
(Maven 3.6.3)
【讨论】:
【参考方案7】:尝试在单独的配置文件中运行您的集成或单元测试。然后您可以启用/禁用配置文件。
【讨论】:
也许添加父 pom,您可以在其中定义仅运行 IT 的配置文件?所有项目子模块都可以从该 pom 继承,因此您无需更改每个 pom 或使用特殊开关运行模块(因为您可以在属性缺失时激活配置文件)。以上是关于阻止单元测试,但允许在 Maven 中进行集成测试的主要内容,如果未能解决你的问题,请参考以下文章
如何使用注释在 testng + maven 中分离单元测试和集成测试?
允许在新的集成测试中运行整个测试文件夹——就像普通的单元测试一样