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


157

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

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

skip.testsmaven.test.skipskipTests它停止所有的测试,并且skipITs,其中只有故障安全插件停止。

那么,是否为Maven提供了一个命令行标记,例如skipITs,而是具有“ onlyIT”功能?


您尝试过maven.test.skip还是skipTests
托马斯

1
@khmarbaise从理论上讲,是的。但是在我从事的大多数项目中,“单元测试”实际上是对内存数据库的集成测试(如果幸运的话)
Sean Patrick Floyd

9
@khmarbaise很多单元测试。它们需要几分钟才能运行,在这种情况下,我们不需要它们运行。具体来说,我们在构建工件之前就进行了单元测试(当然),但是我们希望在多个环境中运行IT。此时没有任何要重新运行单元测试的时间。
马修·吉利亚德

2
嗨@khmarbaise,在我的设置中,skipTests仅跳过surefire 测试,而不跳过故障安全测试!也许这是一个新功能?
丹尼米迪(Danidemi)'17

2
FYI:skipTests现在已经过时,在故障安全插件3.0.0-M3(SUREFIRE-1611
纪尧姆Husta

Answers:


170

我发现仅跳过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并且仅跳过surefire(而非故障安全)测试;它还将运行所有其他必要阶段,包括集成前和集成后,并且还将运行verify目标,如果集成测试失败,该目标实际上会使您的maven构建失败。

请注意,这重新定义了用于指定应跳过测试的属性,因此,如果提供了canonical属性-DskipTests=true,则surefire将忽略它,但failsafe将尊重它,这可能是意外的,特别是如果您已经具有指定该标志的现有内部版本/用户。简单的解决方法似乎是默认skip.surefire.tests的值设置为skipTests<properties>聚甲醛的部分:

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

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

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


4
使用此解决方案,我已经能够设置我的框架,因此-DskipUnitTests跳过surefire插件,-DskipIntegrationTests跳过故障安全插件,而DskipTests跳过这两个插件。确实需要什么!
Alex Jansen 2014年

2
我的IDE抱怨“无法解析符号'skipTests'”,解决方案是添加一行<skipTests>false</skipTests>仍可与-DskipTests或-Dskip.surefire.tests的任意组合一起使用,因为命令行参数似乎会覆盖属性stackoverflow.com/questions/13708738 /…您可能想将其添加到您的解决方案中
globalworming

<skipTests>${skip.surefire.tests}</skipTests>不适用于maven-surefire-pluginversion 3.0.0-M3。所有的surefire测试仍在运行。其他人找到了吗?肖恩·帕特里克·弗洛伊德(Sean Patrick Floyd)的以下解决方案正在工作。
约翰·迈耶

120

解决方法是致电:

mvn clean test-compile failsafe:integration-test

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


或(另一个技巧):

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

参考:


1
第二个建议对我有用。集成前测试成功通过
Lawrence Tierney 2013年

7
这是一个好主意吗?即使您的集成测试失败,这也不会导致您的构建成功吗?这是故障安全的整个本质,如果你不运行“验证”的目标。Quote:“故障安全插件将不会在集成测试阶段使构建失败”。您需要运行验证目标,以实际告诉您集成测试是否成功!
bacar

2
@bacar是正确的,但只使用verify,而不是integration-test在第二个解决方案。
Matthew Gilliard 2013年

1
您实际上应该看到@bacar答案以获得更好的解决方案。
FBB 2013年

12
如果您failsafe:verify在第一个技巧(mvn clean test-compile failsafe:integration-test failsafe:verify)的末尾添加,如果其中一个集成测试失败,它将使构建失败。
Shadow Man

73

我正在使用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>

2
谢谢,很棒的方法!它也是有用的覆盖万无一失(默认测试)的默认执行看到:stackoverflow.com/questions/11935181/...

1
这就是为什么有时您必须向下滚动并寻找具有所有必需信息的有效解决方案的原因。感谢您的分享
Atul Chaudhary

真的是一个不错的解决方案。但是,故障安全配置skipITs和默认配置一样是冗余的。
timomeinen '18

SkipITs是此配置中的自定义选项。您可以使用默认实现,但这不是OP的问题。
Martijn Burger

恭喜,您是一位专家专家!这应该在Maven超级游戏中。
亚当

22

希望这可以帮助!

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

mvn failsafe:integration-test

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

mvn surefire:test

或一次进行以下一项测试:

mvn -Dtest=MyUnitlTest

9

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

 mvn -Dtest=foo -DfailIfNoTests=false verify

1
这是最简单(老实说是最出色的)解决方案!
Titulum

不需要按OP要求在pom中添加任何内容,并按照指示运行所有阶段。好答案。
jnichols959

1

扩展@danidemi和@GuillaumeHusta的评论:

仅供参考:Failsafe Plugin 3.0.0-M3(SUREFIRE-1611)中不推荐使用skipTests

因此,如果您使用的是最新版本的Failsafe插件,则可以跳过单元测试,而不是集成测试,可以执行以下操作:

mvn verify -DskipTests

(如果有帮助,请给提到的评论加分)


-3

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


也许添加在其中定义仅运行IT的配置文件的父pom?所有项目子模块都可以继承该pom形式,因此您无需更改每个pom或使用特殊开关运行模块(因为您可以在缺少属性时激活配置文件)。
yoosiba
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.