在Maven的某些模块中跳过testing

我希望我的Maven能够运行大部分的unit testing。 但是在一个项目中有unit testing比较慢,我想排除它们; 偶尔打开它们。

:我该怎么做?

我知道-Dmaven.test.skip=true ,但是关掉了所有的unit testing。

我也知道跳过集成testing, 这里描述。 但是我没有集成testing,只是unit testing,我没有任何明确的调用maven-surefire插件。 (我正在使用Maven 2和Eclipse-Maven插件)。

那么只有在这个模块中跳过testing呢?

在这个模块的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> 

最终,您可以创build一个configuration文件来禁用testing(仍然是模块的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> 

使用后一种解决scheme,如果运行mvn clean package ,它将运行所有testing。 如果你运行mvn clean package -DnoTest=true ,它将不会运行这个模块的testing。

我认为这样更容易,而且还可以用于非确定性testing(在我的例子中是FlexUnitTests)

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

我对这个问题的需求稍有不同,可能会有所帮助。 我想从命令行中排除来自不同软件包的几个不同的testing,所以一个通配符不会这样做。

我在Maven Failsafe文档中发现了排除规则,您可以指定逗号分隔的正则expression式或通配符排除列表: 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" 

对我来说,关键要素是在单个排除语句中将一堆testing集成到一个maven属性中。

如果您有一个大的多模块项目,并且您只想在某些模块中跳过testing,而无需使用自定义configuration和分析来更改每个模块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 ,在构build过程中,通过project.artifactId属性(在构build期间指向每个artifactId模块),实际上会dynamic地检查你是否在某个模块中,然后正则expression式匹配某些值(您要跳过testing的模块名称)并相应填充maven.test.skip属性(将其设置为true )。

在这种情况下, module3module3module2正常运行时跳过testing,也就是说正则expression式。

这种方法的好处是使其具有dynamic性和集中性(在父pom.xml ),因此更好的维护:您可以随时添加或删除模块,只需更改上面的简单正则expression式即可。

显然,如果这不是构build的默认行为(推荐的情况),你可以总是将上面的代码片段包装到mavenconfiguration文件中 。


你也可以走得更远,并根据你的input有dynamic的行为:

 <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.regexreplace了正则expression式值,默认值为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文件或激活任何configuration文件。

使用Surefire插件2.19,你可以使用正则expression式简单地排除你不想要的testing:

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

以上命令将排除所有包含excludedString的testing。

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

NB2应该特别注意使用多个版本的surefire插件的项目。 比2.19版本的surefire版本不会执行任何testing,因为它们不支持正则expression式。

版本pipe理(这可能是一个好主意,添加到父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> 

构build命令跳过testing的示例: https : //artbcode.com/how-to-skip-a-subset-of-the-unit-tests/