Maven -DskipTests被忽略了。

49
我正在使用以下 SureFire 配置构建Maven项目:
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>${version.maven-surefire-plugin}</version>
    <configuration>
        <includes>
            <include>**/*Test.java</include>
        </includes>
    </configuration>
</plugin>

问题在于,当我使用mvn clean install -DskipTests=true来构建时,测试仍然被执行。可能的问题是什么?

我尝试了-DskipTests(来自Maven网站)和-DskipTests=true,后者当我勾选“跳过测试”复选框时,由IntelliJ Idea添加。

我没有使用任何Maven settings.xml文件。

  • Maven版本:2.2.1
  • Surefire插件:2.3

编辑 如果我注释掉SureFire插件的配置,则参数将按照我预期的行为。上述配置有什么问题吗?


2
请尝试使用-Dmaven.test.skip。 - farmer1992
1
农夫:编辑:这个可以工作,但它做了一些不同的事情。测试不仅被禁用,而且也没有编译。Reimus:相同的结果。 - NeplatnyUdaj
1
那个Surefire配置是多余的。即使没有显式配置插件,Surefire也会始终运行,因为它是一个标准插件。摆脱整个部分,看看会发生什么。 - artbristol
3
你的测试是否位于每个模块的标准路径 src/test/java 下,还是在其他位置?你在 POM 中发布该部分的目的是什么? - Nicola Musatti
1
@NeplatnyUdaj 你使用的是哪个版本的Surefire? - JamesB
显示剩余10条评论
6个回答

64

Maven知道两种跳过测试的参数:

-Dmaven.test.skip=true 

或者

-DskipTests=true 

surefire-plugin documentation中只提到了第一个,而你尚未尝试。


4
但是maven.test.skip命令也会跳过测试的编译,这不一定是原帖作者想要的。 - JamesB
是否有可能编译测试代码而不运行它们? - NeplatnyUdaj
1
你正在使用的标志应该这样做 @NeplatnyUdaj - JamesB
1
是的,应该可以。显然我的surefire插件配置破坏了它。请参见原帖的编辑。 - NeplatnyUdaj

16

你所做的应该是有效的。如何进一步调试:

  1. 运行mvn help:effective-pom以查看Maven将执行的整个POM。 搜索test(不区分大小写)以查看是否有异常情况。

  2. 运行mvn test -X以获得调试输出。这将打印用于配置maven-surefire-plugin的选项。确保将输出重定向到文件中!

    在日志中,您将看到

    [DEBUG] Configuring mojo 'org.apache.maven.plugins:maven-surefire-plugin:2.15:test' with basic configurator -->
    

    然后,在下面的几行中:

    [DEBUG]   (s) runOrder = filesystem
    [DEBUG]   (s) skip = false
    [DEBUG]   (s) skipTests = false
    

    这些值意味着测试不会被跳过。

  3. 您是否使用最新版本的插件?在这里检查。也许此选项不支持您的版本。


在第一步中,我没有看到任何奇怪的东西,但我也不知道要寻找什么。在第二步中,我没有看到这些参数。这些是我拥有的参数(我认为在这个问题中可能有意义):forkMode = once; childDelegation = false; parallel = false; useFile = true。 - NeplatnyUdaj
插件的哪个版本? - Aaron Digulla
2
升级到2.15版本。2.3版本相当老了,也许不支持紧凑语法。 - Aaron Digulla
1
啊...现在我明白了。当我移除surefire配置时它能工作,正是因为它使用了更新的版本。 - NeplatnyUdaj
2
@AaronDigulla 你似乎是第一个建议更新surefire的人。为什么不把你的评论发布为答案,这样NeplatnyUdaj就可以接受它了呢?这将使你的声誉有所提高,并使解决方案更加明显。 - Nicola Musatti
Nicola:我也正想建议这个 :) - NeplatnyUdaj

12

不是-DskipTests=true,而只是-DskipTests,假设你正在使用surfire 2.3版本。

因此,您应该将其运行为:

mvn install -DskipTests

2
我经常这样做。但是我的surefire版本是2.5。我刚刚尝试了2.3的surefire版本,它忽略了skipTests。你能否尝试使用2.5? - Raji
1
是的,那就是问题所在。它完美地解释了我观察到的行为。 - NeplatnyUdaj
两者都可以使用,但-DskipTests更方便。 - Gorky

3

我不确定为什么正确的答案还没有被发布。在旧版本的SureFire中,编译测试但不运行它们的标志是-Dmaven.test.skip.exec


这就是答案。 - undefined

2

这是一个老问题,但也许我的情况对某些人有所帮助。

因此,-DskipTests/-DskipTests=true/-DskipITs等都没有起作用,我不知道为什么。 我的父级pom.xml中有<profiles>,问题在于surefire/failsafe的配置。

<profiles>
        <profile>
            <id>unit-test</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
        </profile>
        <profile>
            <id>integration-test</id>
            <properties>
                <skip.unit-tests>true</skip.unit-tests>
                <skip.integration-tests>false</skip.integration-tests>
                <skip.end-to-end-tests>true</skip.end-to-end-tests>
            </properties>
        </profile>
...
</profiles>

在插件配置中,我像下面这样使用了:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>${maven-surefire-plugin.version}</version>
    <configuration>
        <skipTests>${skip.unit-tests}</skipTests>
    </configuration>
...
</plugin>

这个命令无法执行:
mvn clean install -DskipTests -DskipITs

这是有效的代码:
mvn clean install -Dskip.unit-tests=true -Dskip.integration-tests=true -Dskip.end-to-end-tests=true

0

尝试使用以下配置来配置您的Surefire插件

<plugin>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>${version.surefire.plugin}</version>
    <configuration>
        <skip>true</skip>
    </configuration>
</plugin>

1
没错。我希望它们在构建服务器上执行,并且当有人检出代码时也执行。我只需要在我的项目配置中禁用它们。 - NeplatnyUdaj
2
你可以为不同的场景创建不同的Maven构建配置文件,以便在需要跳过或执行测试的情况下使用。 - Andrei Nicusan
4
这似乎对于如此简单的事情来说有些过度了。 - NeplatnyUdaj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接