我如何让我的Maven集成testing运行

我有一个maven2多模块项目,并在我的每个子模块中,我有Test.javatesting和集成testing命名为Test.javaIntegration.java JUnittesting。 当我执行时:

mvn test

子模块内的所有JUnittesting*Test.java被执行。 当我执行

mvn test -Dtest=**/*Integration

没有一个Integration.javatesting在子模块中得到执行。

这些对我来说似乎是完全一样的命令,但是带有-Dtest = / * Integration **的那个不起作用,它显示了在父级别运行的0个testing,没有任何testing

您可以设置Maven的Surefire来分别运行unit testing和集成testing。 在标准的unit testing阶段,你运行所有不符合集成testing的模式。 然后创build第二个testing阶段 ,只运行集成testing。

这里是一个例子:

  <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <excludes> <exclude>**/*IntegrationTest.java</exclude> </excludes> </configuration> <executions> <execution> <id>integration-test</id> <goals> <goal>test</goal> </goals> <phase>integration-test</phase> <configuration> <excludes> <exclude>none</exclude> </excludes> <includes> <include>**/*IntegrationTest.java</include> </includes> </configuration> </execution> </executions> </plugin> 

Maven构build生命周期现在包括运行集成testing的“集成testing”阶段,这个阶段是与“testing”阶段运行的unit testing分开运行的。 它在“包”之后运行,因此如果运行“mvn verify”,“mvn install”或“mvn deploy”,集成testing将一直运行。

默认情况下,integration-test运行名为**/IT*.java**/*IT.java**/*ITCase.javatesting类,但是可以configuration它。

有关如何连接这些的详细信息,请参阅Failsafe插件 , Failsafe使用情况页面 (当我写这个页面时,没有正确链接到上一页),并查看这个Sonatype博客文章 。

我已经完成了你想要做的事情,而且效果很好。 unit testing“*testing”总是运行,而“* IntegrationTests”只有当你进行mvnvalidation或mvn安装时才运行。 这里是我的POM的片段。 serg10几乎是正确的….但不完全。

  <plugin> <!-- Separates the unit tests from the integration tests. --> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <!-- Skip the default running of this plug-in (or everything is run twice...see below) --> <skip>true</skip> <!-- Show 100% of the lines from the stack trace (doesn't work) --> <trimStackTrace>false</trimStackTrace> </configuration> <executions> <execution> <id>unit-tests</id> <phase>test</phase> <goals> <goal>test</goal> </goals> <configuration> <!-- Never skip running the tests when the test phase is invoked --> <skip>false</skip> <includes> <!-- Include unit tests within integration-test phase. --> <include>**/*Tests.java</include> </includes> <excludes> <!-- Exclude integration tests within (unit) test phase. --> <exclude>**/*IntegrationTests.java</exclude> </excludes> </configuration> </execution> <execution> <id>integration-tests</id> <phase>integration-test</phase> <goals> <goal>test</goal> </goals> <configuration> <!-- Never skip running the tests when the integration-test phase is invoked --> <skip>false</skip> <includes> <!-- Include integration tests within integration-test phase. --> <include>**/*IntegrationTests.java</include> </includes> </configuration> </execution> </executions> </plugin> 

祝你好运!

您可以使用JUnit类别和Maven非常容易地拆分它们。
下面通过分割单元和集成testing非常简要地展示了这一点。

定义标记界面

使用类别对testing进行分组的第一步是创build标记界面。
这个界面将被用来标记所有你想作为集成testing运行的testing。

 public interface IntegrationTest {} 

标记你的testing类

将类别注释添加到testing类的顶部。 它采用您的新界面的名称。

 import org.junit.experimental.categories.Category; @Category(IntegrationTest.class) public class ExampleIntegrationTest{ @Test public void longRunningServiceTest() throws Exception { } } 

configurationMavenunit testing

这个解决scheme的好处在于事物的unit testing方面没有什么变化。
我们只是添加一些configuration到maven surefire插件,使其忽略任何集成testing。

 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.11</version> <configuration> <includes> <include>**/*.class</include> </includes> <excludedGroups> com.test.annotation.type.IntegrationTest </excludedGroups> </configuration> </plugin> 

当你做一个mvn干净的testing,只有你的未标记的unit testing将运行。

configurationMaven集成testing

再次,这个configuration是非常简单的。
我们使用标准的故障安全插件,并将其configuration为仅运行集成testing。

 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-failsafe-plugin</artifactId> <version>2.19.1</version> <configuration> <includes> <include>**/*.class</include> </includes> <groups> com.test.annotation.type.IntegrationTest </groups> </configuration> </plugin> 

configuration使用标准执行目标在构build的集成testing阶段运行故障安全插件。

你现在可以做一个干净的安装
这次以及unit testing运行,集成testing在集成testing阶段运行。

你应该尝试使用maven failsafe插件 。 你可以告诉它包含一些特定的testing。

默认情况下,Maven只运行在类名中有testing的testing。

重命名为IntegrationTest,它可能会工作。

或者,您可以更改Mavenconfiguration以包含该文件,但是可能更简单,更好的方法是将您的testing命名为SomethingTest。

从包含和排除testing :

默认情况下,Surefire插件将自动包含所有testing类,并具有以下通配符模式:

  • “** / Test * .java” – 包含所有以“Test”开头的子目录和所有的java文件名。
  • “** / * Test.java” – 包含所有以“Test”结尾的子目录和所有的java文件名。
  • “** / * TestCase.java” – 包含所有以“TestCase”结尾的子目录和所有的java文件名。

如果testing类不符合命名约定,则configurationSurefire插件并指定要包含的testing。

使用Maven运行集成testing的另一种方法是使用configuration文件function:

 ... <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <includes> <include>**/*Test.java</include> </includes> <excludes> <exclude>**/*IntegrationTest.java</exclude> </excludes> </configuration> </plugin> </plugins> </build> <profiles> <profile> <id>integration-tests</id> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <includes> <include>**/*IntegrationTest.java</include> </includes> <excludes> <exclude>**/*StagingIntegrationTest.java</exclude> </excludes> </configuration> </plugin> </plugins> </build> </profile> </profiles> ... 

运行“mvn clean install”将会运行默认版本。 如上所述,集成testing将被忽略。 运行“mvn clean install -P integration-tests”将包含集成testing(我也忽略了我的集成testing)。 此外,我有一个每天晚上运行我的集成testing的CI服务器,为此我发出命令“mvn test -P integration-tests”

如果我们不想运行集成testing阶段,我认为@Jorge是一个好主意。

在我的情况下,我正在使用这个想法在testing阶段运行casperjs相关的testing。