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

时间:2011-07-07 14:36:12

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

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

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

skip.testsmaven.test.skip以及skipTests停止所有测试,而skipITs只停止故障安全插件。

那么,Maven是否有skipITs的命令行标志,而是“onlyITs”的功能?

8 个答案:

答案 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)

尝试在单独的配置文件中运行集成或单元测试。然后你可以启用/禁用配置文件。