防止单元测试但允许在Maven中进行集成测试

Mat*_*ard 138 integration-testing build maven maven-surefire-plugin maven-failsafe-plugin

我有一个Maven构建,我使用SureFire插件来运行一些单元测试,而FailSafe插件则运行一些集成测试.我想要一种方法来运行FailSafe插件的测试.

对于我来说,在pom中添加不同的配置文件或任何东西并不是一个好的解决方案,因为它是一个多模块构建,我不想编辑每个模块的pom.

skip.testsmaven.test.skipskipTests它停止所有的测试,以及skipITs,其仅停止故障安全插件.

那么,Maven是否有一个命令行标志skipITs,而是具有"onlyITs"的功能?

bac*_*car 152

我发现只跳过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>
Run Code Online (Sandbox Code Playgroud)

这允许你运行mvn verify -Dskip.surefire.tests,只有万无一失,而不是故障保险,测试将被跳过; 它还将运行所有其他必要的阶段,包括预集成和后集成,并且还将运行在集成测试失败时verify实际失败maven构建所需的目标.

请注意,这会重新定义用于指定应跳过测试的属性,因此如果您提供规范-DskipTests=true,则surefire将忽略它,但failsafe会尊重它,这可能是意外的,特别是如果您已经有指定该标志的现有构建/用户.一个简单的解决方法似乎是默认skip.surefire.testsskipTests<properties>的pom部分的值:

<properties>
    <skip.surefire.tests>${skipTests}</skip.surefire.tests>
</properties>
Run Code Online (Sandbox Code Playgroud)

如果你需要,你可以提供一个名为failafe的类似参数skip.failsafe.tests,但是我没有发现它是必要的 - 因为单元测试通常在早期阶段运行,如果我想运行单元测试而不是集成测试,我会运行的test阶段,而不是verify阶段.您的经历会有所不同!

这些skip.(surefire|failsafe).tests属性应该可以集成到surefire/failsafe代码本身,但我不确定它会违反多少"它们是完全相同的插件,除了1个小差异"的精神.

  • 使用这个解决方案,我已经能够设置我的框架,所以-DskipUnitTests跳过surefire插件,-DskipIntegrationTests跳过故障安全插件,DskipTests跳过这两个插件.究竟需要什么! (4认同)
  • 我的 IDE 抱怨“无法解析符号‘skipTests’”,解决方案是添加一行 `&lt;skipTests&gt;false&lt;/skipTests&gt;` 仍然适用于 -DskipTests 或 -Dskip.surefire.tests 的任何组合,因为命令行参数似乎覆盖属性 /sf/ask/959611691/ 您可能希望将其添加到您的解决方案中 (3认同)

Sea*_*oyd 113

解决方法是致电:

mvn clean test-compile failsafe:integration-test
Run Code Online (Sandbox Code Playgroud)

不可否认,这很难看,但它可以解决你的问题.


或(另一个黑客):

mvn clean integration-test -Dtest=SomePatternThatDoesntMatchAnything -DfailIfNoTests=false
Run Code Online (Sandbox Code Playgroud)

参考:

  • 如果你将`failsafe:verify`添加到第一个hack(`mvn clean test-compile failsafe:integration-test failsafe:verify`)的末尾,如果其中一个集成测试失败,它将失败. (12认同)
  • 这是一个好主意吗?**即使您的集成测试失败,这也不会导致您的构建成功吗?**这是故障安全的全部本质,[如果您不*也*运行'验证'目标](http:// maven. apache.org/surefire/maven-failsafe-plugin/).引用:"Failsafe插件在集成测试阶段不会失败".您需要运行验证目标来实际告诉您集成测试是否成功! (5认同)
  • @bacar是对的,但只是在第二个解决方案中使用`verify`而不是`integration-test`. (2认同)

Mar*_*ger 56

我正在使用Antonio Goncalves博客的代码,它完美无缺.

您可以使用以下属性:

-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>
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,很好的方法!覆盖surefire的默认执行(default-test)也很有用:http://stackoverflow.com/questions/11935181/what-does-the-default-test-stand-for-in-the-maven-surefire-插入 (2认同)

小智 21

希望这可以帮助!

尝试仅使用FailSafe运行测试(用于集成测试的插件 - 它将允许您仅使用此类命名运行集成测试,默认情况下:*/ IT .java,**/IT.java,* /*ITCase.java ;,但您可以轻松地从pom文件更改它)

mvn failsafe:integration-test
Run Code Online (Sandbox Code Playgroud)

当你只想使用SureFire(插件进行单元测试)时

mvn surefire:test
Run Code Online (Sandbox Code Playgroud)

或者一次一次测试:

mvn -Dtest=MyUnitlTest
Run Code Online (Sandbox Code Playgroud)


小智 8

我喜欢这样,所以每个阶段都会正常执行:

 mvn -Dtest=foo -DfailIfNoTests=false verify
Run Code Online (Sandbox Code Playgroud)

  • 不需要按照 OP 的要求在 pom 中添加任何内容,并按照指示运行所有阶段。很好的答案。 (2认同)