如何运行Maven Integration测试

时间:2009-09-09 11:56:20

标签: java maven-2 testing surefire

我有一个maven2多模块项目,在我的每个子模块中,我都有JUnit测试,分别命名为Test.javaIntegration.java,用于单元测试和集成测试。当我执行:

mvn test

执行子模块中的所有JUnit测试*Test.java。当我执行

mvn test -Dtest=**/*Integration

Integration.java测试中没有一个在子模块中执行。

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

9 个答案:

答案 0 :(得分:218)

Maven build lifecycle现在包括用于运行集成测试的“集成测试”阶段,该阶段与“测试”阶段期间运行的单元测试分开运行。它运行在“package”之后,因此如果你运行“mvn verify”,“mvn install”或“mvn deploy”,集成测试将一直运行。

默认情况下,integration-test运行名为**/IT*.java**/*IT.java**/*ITCase.java的测试类,但这可以配置。

有关如何连接所有内容的详细信息,请参阅Failsafe pluginFailsafe usage page(我写这篇文章时未在上一页中正确链接),还可以查看this Sonatype blog post

答案 1 :(得分:93)

您可以设置Maven的Surefire来单独运行单元测试和集成测试。在标准单元测试阶段,您运行的所有模式都不符合集成测试。然后,创建第二个测试阶段,只运行集成测试。

以下是一个例子:

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

答案 2 :(得分:58)

我已经完成了你想要做的事情并且效果很好。单元测试“* Tests”始终运行,“* IntegrationTests”仅在执行mvn verify或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>
祝你好运!

答案 3 :(得分:24)

您可以使用JUnit类别和Maven轻松拆分它们 下面通过拆分单元和集成测试非常简单地显示了这一点。

定义标记界面

使用类别对测试进行分组的第一步是创建标记接口。
此接口将用于标记要作为集成测试运行的所有测试。

public interface IntegrationTest {}

标记您的测试类

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

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

配置Maven单元测试

这个解决方案的优点在于单元测试方面没有任何改变 我们只需在maven surefire插件中添加一些配置,使其忽略任何集成测试。

<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清洁测试时,只会运行未标记的单元测试。

配置Maven集成测试

这个配置再次非常简单 我们使用标准的failsafe插件并将其配置为仅运行集成测试。

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

配置使用标准执行目标在构建的集成测试阶段运行failsafe插件。

您现在可以进行mvn clean install
这次以及单元测试运行时,集成测试在集成测试阶段运行。

答案 4 :(得分:15)

您应该尝试使用maven failsafe plugin。您可以告诉它包含一组特定的测试。

答案 5 :(得分:13)

默认情况下,Maven只运行在类名中包含Test的测试。

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

或者,您可以更改Maven配置以包含该文件,但将测试命名为SomethingTest可能更容易也更好。

来自Inclusions and Exclusions of Tests

  

默认情况下,Surefire插件会   自动包含所有测试类   使用以下通配符模式:

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

如果测试类没有使用   命名约定,然后配置   Surefire插件并指定测试   你想要包括。

答案 6 :(得分:9)

使用Maven运行集成测试的另一种方法是使用配置文件功能:

...
<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'将运行默认构建。如上所述,集成测试将被忽略。运行'mvn clean install -P integration-tests'将包括集成测试(我也忽略了我的分段集成测试)。此外,我有一个CI服务器,每晚运行我的集成测试,为此我发出命令'mvn test -P integration-tests'

答案 7 :(得分:8)

您应该使用maven surefire plugin运行单元测试,并使用maven failsafe plugin运行集成测试。

如果您希望使用标志来切换这些测试的执行,请遵循以下内容。

Maven配置

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
                <skipTests>${skipUnitTests}</skipTests>
            </configuration>
        </plugin>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-failsafe-plugin</artifactId>
            <configuration>
                <includes>
                    <include>**/*IT.java</include>
                </includes>
                <skipTests>${skipIntegrationTests}</skipTests>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>integration-test</goal>
                        <goal>verify</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

        <properties>
            <skipTests>false</skipTests>
            <skipUnitTests>${skipTests}</skipUnitTests>
            <skipIntegrationTests>${skipTests}</skipIntegrationTests>
        </properties>

因此,将根据以下标志规则跳过或切换测试:

可以通过以下标志跳过测试:

  • -DskipTests跳过单元测试和集成测试
  • -DskipUnitTests跳过单元测试,但执行集成测试
  • -DskipIntegrationTests跳过集成测试,但执行单元测试

运行测试

在下面运行以仅执行 单元测试

mvn clean test

您可以执行以下命令来运行测试(单元测试和集成测试)

mvn clean verify

为了仅运行 集成测试,请遵循

mvn failsafe:integration-test

或跳过单元测试

mvn clean install -DskipUnitTests

此外,为了跳过mvn install期间的集成测试,请遵循

mvn clean install -DskipIntegrationTests

您可以使用跳过所有测试

mvn clean install -DskipTests

答案 8 :(得分:1)

您可以按照maven documentation运行构建单元测试并单独运行集成测试。

<project>
    <properties>
        <skipTests>true</skipTests>
    </properties>
    [...]
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-failsafe-plugin</artifactId>
                <version>2.20.1</version>
                <configuration>
                    <skipITs>${skipTests}</skipITs>
                </configuration>
            </plugin>
        </plugins>
    </build>
    [...]
</project>

这将允许您在默认情况下禁用所有集成测试的情况下运行。要运行它们,请使用以下命令:

mvn install -DskipTests=false