0

我有一个具有结构的多模块 Maven 项目

parent
  pom.xml
module
  pom.xml
  core-api
    pom.xml
  integ-tests
    pom.xml

我有用于执行单元测试'*Test.java'的maven surefire插件设置,它们是'core-api'模块中的房屋。

我们在一个单独的“integ-tests”模块中进行了缓慢的长时间运行的集成测试。我们也使用 '*Test.java' 进行集成测试。

我们需要能够编译所有源代码,但希望将 'integ-test' 排除在默认 maven 'test' 阶段的一部分运行之外。我们计划使用配置文件来启用“集成测试”模块的测试阶段。我不想使用“故障安全”插件。

概述组合的矩阵在这里

mvn              | core           | integ-test
test             | run unit tests | exclude
test -PintegTest | unit tests     | integ tests 

我已经在我的父 pom 中定义了 surefire 插件,其属性“skip.integ.tests”将通过配置文件“-PintegTests”进行控制。

<properties>
  <skip.integ.tests>true</skip.integ.tests>
</properties>
..
<build>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
  </plugin>
</build>
..
<profiles>
  <profile>
    <id>integTests</id>
    <properties>
      <skip.integ.tests>false</skip.integ.tests>
    </properties>
  </profile>
</profiles>

在我的“integ-test”pom 中,我覆盖了“maven-surefire-plugin”配置并设置了“skipTests”配置以查看属性的值。

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-surefire-plugin</artifactId>
      <configuration>
        <skipTests>${skip.integ.tests}</skipTests>
      </configuration>
    </plugin>
  </plugins>
</build>

我的问题是 integ-test 模块测试在每种情况下都运行。关于我在哪里设置错误的任何想法?

4

2 回答 2

1

首先,您应该根据旨在运行集成测试的maven-failsafe-plugin的命名约定来命名您的集成测试。此外,预集成测试集成测试集成测试后生命周期阶段旨在运行这些测试。这意味着在您的情况下,根据这样的文档配置 maven-failsafe-plugin。maven-failsafe-plugin 绑定到集成测试生命周期阶段。

<project>
  [...]
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-failsafe-plugin</artifactId>
        <version>2.16</version>
        <executions>
          <execution>
            <goals>
              <goal>integration-test</goal>
              <goal>verify</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  [...]
</project>

我建议将以下配置文件添加到您的集成测试模块中,如下所示:

<profiles>
  <profile>
    <id>run-its</id>
    <build>
      <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-failsafe-plugin</artifactId>
            <version>2.16</version>
            <executions>
              <execution>
                <goals>
                  <goal>integration-test</goal>
                  <goal>verify</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
  </profile>
</profiles>

这为您提供了以下选项:

  • mvn test

    仅运行单元测试

  • mvn -DskipTests=true test

    运行编译等,但没有单元测试。

  • mvn -Prun-its verify

    运行打包等单元测试和集成测试

  • mvn install

    在没有集成测试的情况下运行安装。

  • mvn -DskipTests=true install

    运行安装而不运行单元测试或集成测试。

于 2013-10-25T16:40:44.497 回答
1

在您的 Maven 构建中,您可以排除:

  • 通过添加来编译和执行单元测试(通过 Surefire 插件)和集成测试(通过 Failsafe 插件)-Dmaven.skip.test=true
  • 通过执行单元测试和集成测试-DskipTests
  • 通过执行集成测试-DskipITs

相反,如果您在单独的 Maven 模块中进行集成测试(即在您的情况下为 integ-test),您可以通过配置文件直接将其从 Maven 构建中排除,如下例所示 - 请参阅聚合器的 pom.xml 和 maven 的摘录要启动的命令行:

<modules>
  <!-- remove 'integ-test' from this list -->
</modules>
<profiles>
    <profile><id>build-it</id>
        <activation><activeByDefault>true</activeByDefault></activation>
        <modules><module>integ-test</module></modules>
    </profile>
</profiles>

接着mvn install -P !build-it

于 2018-01-25T15:39:24.187 回答