阻止maven中的unit testing,但允许集成testing

我有一个Maven构build,我使用SureFire插件来运行一些unit testing,而FailSafe插件来运行一些集成testing。 我想要一个只运行FailSafe插件testing的方法。

这对我来说不是一个好的解决scheme,因为它是一个多模块构build,我不想编辑每个模块的pom。

skip.testsmaven.test.skipskipTests停止所有的testing,并skipITs ,只停止故障安全插件。

那么,是否有像skipITs这样的maven的命令行标志,而是具有“onlyITs”的function呢?

我发现只跳过surefiretesting的最简单的方法是configurationsurefire( 但不是失败安全 ),如下所示:

 <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 ,只有确定的,不会失败的,testing将被跳过; 它还将运行所有其他必要的阶段,包括预集成和后整合,还将运行verify目标,如果您的集成testing失败,那么实际上会失败您的Maven构build

请注意,这重新定义了用于指定testing应该跳过的属性,所以如果您提供规范-DskipTests=true-DskipTests=true将忽略它,但是-DskipTests=true保护会尊重它,这可能是意外的,特别是如果您有现有的构build/该标志已经。 一个简单的解决方法似乎是在您的<properties> pom <properties><properties>部分skip.surefire.testsskip.surefire.tests的值:

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

如果你需要的话,你可以提供一个名为skip.failsafe.tests保护的参数,但是我没有发现它是必须的 – 因为unit testing通常在早期阶段运行,如果我想运行unit testing而不是集成testing,我会运行test阶段,而不是verify阶段。 你的经验可能会有所不同

这些skip.(surefire|failsafe).tests属性应该可以集成到skip.(surefire|failsafe).tests / failsafe代码本身,但我不知道它会违反“他们是完全相同的插件除了一个微小的差异”的精神。

解决方法是调用:

 mvn clean test-compile failsafe:integration-test 

诚然,这是丑陋的,但它可能会解决你的问题。


或者(另一个黑客):

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

参考:

  • surefire:test#test
  • surefire:test#failIfNoTests

我使用Antonio Goncalves Blog的代码,这个代码非常完美。

您可以使用以下属性:

-DskipUTs=true跳过-DskipUTs=truetesting。

-DskipITs=true用于跳过故障安全testing。

-DskipTests=true用于跳过所有testing。

我在Netbeans中创build了一个动作,允许我使用validation目标和属性来testing单个集成testing:

it.test=${packageClassName}

skipUTs=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> 

希望这可以帮助!

尝试只用FailSafe(集成testing插件)运行testing – 它将允许您只运行这种命名的集成testing,默认情况下:* / IT .java,** / IT.java,* / * ITCase.java ;但是你可以很容易地从pom文件中改变它)

 mvn failsafe:integration-test 

而当你只想使用SureFire(插件进行unit testing)

 mvn surefire:test 

或一次testing一次:

 mvn -Dtest=MyUnitlTest 

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

  mvn -Dtest=foo -DfailIfNoTests=false verify 

尝试在单独的configuration文件中运行集成或unit testing。 那么你可以启用/禁用configuration文件。