179

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

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

skip.testsand停止所有测试,andmaven.test.skip仅停止故障保护插件。skipTestsskipITs

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

4

7 回答 7

191

我发现只跳过surefire测试的最简单方法是配置surefire(但不是failsafe),如下所示:

<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,并且只会跳过可靠的测试,而不是故障安全的测试;它还将运行所有其他必要的阶段,包括预集成和后集成,并且还将运行如果您的集成测试失败时实际使您的 Maven 构建失败verify所需的目标。

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

<properties>
    <skip.surefire.tests>${skipTests}</skip.surefire.tests>
</properties>

如果需要,您可以提供一个称为skip.failsafe.tests故障安全的类比参数,但是我认为没有必要 - 因为单元测试通常在早期阶段运行,如果我想运行单元测试而不是集成测试,我会运行test相位而不是相位verify。您的经历可能会有所不同!

这些skip.(surefire|failsafe).tests属性可能应该集成到surefire/failsafe代码本身中,但我不确定它会在多大程度上违反“它们是完全相同的插件,除了1个微小的差异”精神。

于 2013-07-29T19:41:14.870 回答
129

一种解决方法是调用:

mvn clean test-compile failsafe:integration-test

诚然,这很丑陋,但它可能会解决您的问题。


或者(另一个黑客):

mvn clean integration-test -Dtest=SomePatternThatDoesntMatchAnything -DfailIfNoTests=false

参考:

于 2011-07-07T14:47:34.967 回答
94

我正在使用Antonio Goncalves 博客中的代码,它运行良好。

您可以使用以下属性:

-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>
于 2016-06-17T11:25:27.393 回答
27

希望这可以帮助!

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

mvn failsafe:integration-test

当您只想使用 SureFire(用于单元测试的插件)时

mvn surefire:test

或一次一项测试:

mvn -Dtest=MyUnitlTest
于 2013-12-01T15:32:16.453 回答
13

我确实喜欢这样,所以通常会执行每个阶段:

 mvn -Dtest=foo -DfailIfNoTests=false verify
于 2014-02-28T11:19:07.287 回答
2

这将跳过UnitTests触发SureFire并仅测试一个测试:

mvn failsafe:integration-test -Dit.test=YourTestName

您还可以提供一个模式: mvn failsafe:integration-test -Dit.test=*

(Maven 3.6.3)

于 2021-02-02T10:19:45.110 回答
-2

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

于 2011-07-08T00:00:11.037 回答