在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
)。
在这种情况下, module3
和module3
在module2
正常运行时跳过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.regex
replace了正则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/