【问题标题】:Prevent unit tests but allow integration tests in Maven阻止单元测试,但允许在 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 中删除

标签: maven build integration-testing maven-surefire-plugin maven-failsafe-plugin


【解决方案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 作为命令行参数的任意组合似乎覆盖了stackoverflow.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

参考:

【讨论】:

  • 这是个好主意吗? 即使您的集成测试失败,这不会导致您的构建成功吗? 这就是故障安全的全部精髓,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的默认执行(默认测试)也很有用,请参阅:stackoverflow.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 或使用特殊开关运行模块(因为您可以在属性缺失时激活配置文件)。
      猜你喜欢
      • 2015-07-19
      • 2016-01-23
      • 1970-01-01
      • 1970-01-01
      • 2013-03-18
      • 2012-01-01
      • 1970-01-01
      • 2023-01-09
      • 1970-01-01
      相关资源
      最近更新 更多