阻止单元测试,但允许在 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.testsmaven.test.skipskipTests 停止所有 测试,还有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 的 &lt;properties&gt; 部分默认 skip.surefire.testsskipTests 的值:

<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'” 解决方案是添加一行 &lt;skipTests&gt;false&lt;/skipTests&gt; 仍然适用于 -DskipTests 或 -Dskip.surefire.tests 作为命令行参数的任意组合似乎覆盖了***.com/questions/13708738/… 属性,您可能希望将其添加到您的解决方案中 &lt;skipTests&gt;$skip.surefire.tests&lt;/skipTests&gt; 不适用于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=&lt;testName&gt; 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 中分离单元测试和集成测试?

允许在新的集成测试中运行整个测试文件夹——就像普通的单元测试一样

如何在 Maven 中为 Java 项目组织单元、集成、e2e 测试文件夹结构?

Maven 进行单元测试用例的使用,加载的资源是哪里的

在测试阶段使用替代的 Maven 配置文件

在 Maven 中跳过某些模块中的测试