在 Maven 中跳过某些模块中的测试

我希望我的 Maven 版本能够运行大多数单元测试。但是在一个项目中有一些单元测试比较慢,我通常会排除它们,偶尔也会打开它们。

问题 : 我该怎么做?

我知道 -Dmaven.test.skip=true,但是它关闭了所有的单元测试。

我还知道如何跳过集成测试,这里描述了 给你。但是我没有集成测试,只有单元测试,也没有对 maven-surefire-plugin 的任何明确调用。(我在 Eclipse-Maven 插件中使用 Maven 2)。

83851 次浏览

只在这个模块中跳过测试怎么样?

在这个模块的 pom.xml 中:

<project>
[...]
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.4.2</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
</plugins>
</build>
[...]
</project>

最终,您可以创建一个配置文件,禁用测试(仍然是模块的 pom.xml) :

<project>
[...]
<profiles>
<profile>
<id>noTest</id>
<activation>
<property>
<name>noTest</name>
<value>true</value>
</property>
</activation>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.4.2</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
[...]
</project>

对于后一种解决方案,如果运行 mvn clean package,它将运行所有测试。如果运行 mvn clean package -DnoTest=true,它将不会运行此模块的测试。

我认为这样做更容易,而且还有非必然性测试(在我的例子中是 FlexUnitTest)的好处

<profile>
<id>noTest</id>
<properties>
<maven.test.skip>true</maven.test.skip>
</properties>
</profile>

如果你有一个大型的多模块项目,你想跳过测试只有在某些模块,而不需要改变每个模块的 pom.xml文件与自定义配置和剖析,你可以添加以下到父 pom.xml文件:

<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>1.12</version>
<executions>
<execution>
<id>regex-property</id>
<goals>
<goal>regex-property</goal>
</goals>
<configuration>
<name>maven.test.skip</name>
<value>${project.artifactId}</value>
<regex>(module1)|(module3)</regex>
<replacement>true</replacement>
<failIfNoMatch>false</failIfNoMatch>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<modules>
<module>module1</module>
<module>module2</module>
<module>module3</module>
</modules>

多亏了 build-helper-maven-plugin,在构建过程中你可以通过 project.artifactId属性(在构建过程中指向每个 artifactId模块)动态地检查你是否在某个模块中,然后 regex 会为某些值(你想跳过测试的模块名称)寻找匹配,并相应地填充 maven.test.skip属性(设置为 true)。

在这种情况下,将跳过 module1module3的测试,同时正确地运行 module2,即正则表达式。

这种方法的优势在于它是动态和集中的(在父 pom.xml中) ,因此更适合于维护: 您可以随时添加或删除模块,只需更改上面的简单正则表达式即可。

显然,如果这不是构建的默认行为(推荐的情况) ,您总是可以将上面的代码片段包装在 Maven 侧写中。


你也可以更进一步,根据你的输入进行动态行为:

<properties>
<test.regex>none</test.regex>
</properties>


<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>1.12</version>
<executions>
<execution>
<id>regex-property</id>
<goals>
<goal>regex-property</goal>
</goals>
<configuration>
<name>maven.test.skip</name>
<value>${project.artifactId}</value>
<regex>${test.regex}</regex>
<replacement>true</replacement>
<failIfNoMatch>false</failIfNoMatch>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>

在这里,我们实际上用一个属性 test.regex替换 regex 值,该属性的默认值为 none(或者任何与任何模块名称不匹配的值,或者所需的默认跳过匹配)。

然后从命令行我们可以

mvn clean test -Dtest.regex="(module1)" > will skip tests only for module1
mvn clean test -Dtest.regex="(module1)|(module2)" > will skip tests on module1 and module2
mvn clean test -Dtest.regex="(module1)|(module2)|(module3)" > will skip the three module tests
mvn clean test -Dtest.regex=".+" > will skip all module tests
mvn clean test > would not skip anything (or fall back on default behavior)

也就是说,在运行时您决定,不需要更改 pom.xml文件或激活任何配置文件。

使用 Surefire Plugin 2.19,你可以简单地排除那些你不想使用正则表达式的测试:

mvn '-Dtest=!%regex[.*excludedString.*]' test

上面的命令将排除所有包含 不包括字符串的测试。

NB1 如果使用双引号(“)代替撇号(“) ,命令将不会被正确解释,并会产生意外的结果。(使用 bash 3.2.57进行测试)

NB2 应该特别注意那些使用了多个版本的 surefire 插件的项目。超过2.19的 surefire 版本不会执行任何测试,因为它们不支持正则表达式。

版本管理(将其添加到父 pom 文件中可能是一个好主意) :

<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19.1</version>
</plugin>
</plugins>
</pluginManagement>
</build>

跳过测试的生成命令示例: https://artbcode.wordpress.com/2016/11/28/how-to-skip-a-subset-of-the-unit-tests/

我对这个问题的需求略有不同,可能会有所帮助。我希望从命令行中从不同的包中排除一些不同的测试,这样一个通配符就不能做到这一点。

我在 Maven 故障安全文档中发现了排除规则,您可以指定一个逗号分隔的正则表达式或通配符排除列表: Https://maven.apache.org/surefire/maven-failsafe-plugin/examples/inclusion-exclusion.html

所以我的头像是这样的:

<excludes>
<exclude>${exclude.slow.tests}</exclude>
</excludes>

我的命令行包括:

mvn install "-Dexclude.slow.tests=**/SlowTest1.java, **/package/ofslowtests/*.java, **/OtherSlowTest.java"

对我来说,关键要素是在一个排除语句中对一个 maven 属性进行大量测试。