187

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

mvn test

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

mvn test -Dtest=**/*Integration

没有任何Integration.java测试在子模块中执行。

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

4

10 回答 10

273

Maven 构建生命周期现在包括用于运行集成测试的“集成测试”阶段,这些测试与在“测试”阶段运行的单元测试分开运行。它在“package”之后运行,因此如果您运行“mvn verify”、“mvn install”或“mvn deploy”,集成测试将一路运行。

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

有关如何连接这一切的详细信息,请参阅Failsafe 插件Failsafe 使用页面(在我撰写本文时未正确链接到上一页),还可以查看此 Sonatype 博客文章

于 2011-02-23T11:34:23.333 回答
121

您可以设置 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>
于 2009-09-09T12:04:55.393 回答
70

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

祝你好运!

于 2010-07-09T02:59:11.057 回答
34

您可以使用 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>

当您执行 amvn clean test时,只会运行未标记的单元测试。

配置 Maven 集成测试

同样,此配置非常简单。
我们使用标准故障安全插件并将其配置为仅运行集成测试。

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

该配置使用标准执行目标在构建的集成测试阶段运行故障安全插件。

你现在可以做一个mvn clean install.
这次除了单元测试运行外,集成测试也在集成测试阶段运行。

于 2012-04-30T09:56:25.080 回答
22

你应该使用maven surefire 插件来运行单元测试和maven failsafe 插件来运行集成测试。

如果您希望使用标志切换这些测试的执行,请按照以下说明进行操作。

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
于 2020-07-05T13:32:50.303 回答
17

您应该尝试使用maven 故障安全插件。您可以告诉它包含一组特定的测试。

于 2010-05-18T18:29:11.133 回答
16

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

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

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

测试的包含和排除

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

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

如果测试类不符合命名约定,则配置 Surefire 插件并指定要包含的测试。

于 2009-09-09T11:58:35.683 回答
10

使用 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'

于 2011-06-02T21:04:10.233 回答
1

您可以按照maven 文档在构建中运行单元测试并单独运行集成测试。

<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
于 2018-02-09T21:42:51.823 回答
0

我不需要执行其他答案中建议的所有设置,我可以单独运行单元测试或集成测试。

我所做的是:

  1. 将下面的配置添加到pom.xml以指示 maven 集成测试文件(java 代码和资源文件)在哪里:
<plugins>
    <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>build-helper-maven-plugin</artifactId>
        <executions>
            <execution>
                <id>add-integration-test-source</id>
                <phase>generate-test-sources</phase>
                <goals>
                    <goal>add-test-source</goal>
                </goals>
                <configuration>
                    <sources>
                        <source>src/integration-test/java</source>
                    </sources>
                </configuration>
            </execution>
            <execution>
                <id>add-integration-test-resource</id>
                <phase>generate-test-resources</phase>
                <goals>
                    <goal>add-test-resource</goal>
                </goals>
                <configuration>
                    <resources>
                        <resource>
                            <directory>src/integration-test/resources</directory>
                        </resource>
                    </resources>
                </configuration>
            </execution>
        </executions>
    </plugin>
</plugins>
  1. 使用“IT”后缀命名集成测试文件,例如“MyTestIT.java”

  2. 使用此命令仅执行集成测试:

    mvn failsafe:integration-test failsafe:verify

在上面的命令中,“failsafe:integration-test”将执行 *IT.java 文件,“failsafe:verify”将告诉 maven 检查之前运行的任何集成测试是否失败。如果您不使用'failsafe:verify',即使一项测试失败, mvn命令也会成功退出。

  1. 要仅运行单元测试,请运行:

    mvn test

于 2021-09-20T20:21:57.857 回答