如何在多模块maven项目中运行集成测试

时间:2018-03-30 10:13:45

标签: java maven maven-3 maven-failsafe-plugin

我有一个具有以下结构的多模块项目:

Project:    
 - module1
 - module2
 - integration-test
 - parent pom

实现以下目标的正确方法是什么:

  • 使用mvn clean install
  • 从所有模块(集成测试除外)运行单元测试
  • 按需运行集成测试(可以使用maven-failsafe插件或通过maven配置文件?)
  • 在集成测试失败时失败。

一些考虑因素:
- 默认情况下,不应使用mvn clean install执行集成测试   - 集成测试模块只有集成测试。

我尝试使用maven-failsafe插件和maven-sunfire-plugin进行多次黑客攻击(用于单元测试),但无法以标准方式实现上述目标。

以下是集成测试pom的相关部分如何:

<dependencies>
   <!-- dependencies required for this module-->

</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>build-helper-maven-plugin</artifactId>
            <version>1.12</version>
            <executions>
                <execution>
                    <id>add-integration-test-sources</id>
                    <phase>generate-test-sources</phase>
                    <goals>
                        <goal>add-test-source</goal>
                    </goals>
                    <configuration>
                        <sources>
                            <source>src/test/java</source>
                        </sources>
                    </configuration>
                </execution>
                <execution>
                    <id>add-integration-test-resources</id>
                    <phase>generate-test-resources</phase>
                    <goals>
                        <goal>add-test-resource</goal>
                    </goals>
                    <configuration>
                        <resources>
                            <resource>
                                <filtering>true</filtering>
                                <directory>src/test/resources</directory>
                            </resource>
                        </resources>
                    </configuration>
                </execution>
            </executions>
        </plugin> 
    </plugins>
</build>

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

目前,当我运行mvn clean install时,它也运行集成测试。当我运行mvn -Prun-its clean verify时,它也正在运行来自其他模块的单元测试。我错过了什么?

3 个答案:

答案 0 :(得分:2)

只需在运行构建时设置-DskipITs=true,就可以跳过集成测试的执行:

mvn clean install -DskipITs=true

这将运行除IT之外的所有其他测试(请参阅here了解doc。)

如果您只想运行

mvn clean install

您可以在pom.xml中设置skipIT的默认值

<properties>
    <skipITs>true</skipITs>
</properties>

这样您可以使用

按需覆盖它
mvn clean install -DskipITs=false

要仅运行没有单位测试的IT,您可以配置maven-surefire-plugin的-Property,如此

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

所以,如果你运行

mvn clean install -DskipITs=false -DskipUnitTests=true

请注意,skipUnitTests默认为false,因此无需为此声明属性。

如果你更喜欢使用个人资料,它应该像那样工作

    <profile>
        <id>ITs</id>
        <properties>
            <skipUnitTests>true</skipUnitTests>
            <skipITs>false</skipITs> 
        </properties>
    </profile>

并像这样运行构建

mvn clean install -PITs

当然你也可以直接在配置文件中使用maven-surefire-plugin的插件配置和true,这样就不需要额外的属性了,比如

<profile>
    <id>ITs</id>
    <properties>
        <skipITs>false</skipITs> 
    </properties>
    <build>
       <plugins>
           <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.12.4</version>
                <configuration>
                   <skip>true</skip>
                </configuration>
            </plugin>
       </plugins>
    </build>
</profile>

答案 1 :(得分:0)

我不知道这是否是最佳解决方案,但您可以使用配置文件实现这一目标。例如,在主pom.xml中,您只需添加<modules>部分中的其他模块,然后添加另一个配置文件:

<modules>
... standard modules ...
</modules>
<profiles>
 <profile>
   <id>tests</id>
      <modules>
        <module>module1</module> 
... standard modules repeated (it might not be needed>...
        <module>module2</module>
        <module>module-integration-test</module>
      </modules> 
  </profile> 
</profiles>

如果您想运行测试,那么您可以使用该配置文件运行maven。

maven -P tests clean install

如果您想运行集成测试和其他模块,那将会有效。如果您只想运行集成测试,可以这样做:

<modules>
  <!-- EMPTY -->
</modules>
<profiles>
 <profile>
   <id>defaultModule</id>
   <activation>
      <activeByDefault>true</activeByDefault>
   </activation>
     <modules>
        <module>module1</module> 
... standard modules repeated (it might not be needed>...
        <module>module2</module>           
      </modules> 
 </profile>
 <profile>
   <id>tests</id>
      <modules>           
        <module>module-integration-test</module>
      </modules> 
  </profile> 
</profiles>

这样使用mvn clean install你将使用defaultModule(这是activeByDefault)运行,如果指定-P tests,你将只运行测试

答案 2 :(得分:0)

最好是创建一个单独的模块,其中包含看起来已经在您自己的问题中显示的集成测试。现在如何处理正在运行的集成测试......

集成测试模块如下所示:

<?xml version="1.0"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <parent>
    <groupId>groupOfYourParant</groupId>
    <artifactId>integration-test</artifactId>
    <version>0.1.0-SNAPSHOT</version>
  </parent>

  <artifactId>integration-test</artifactId>
  <packaging>jar</packaging>

  <name>Mod-IT</name>

  <dependencies>
    <dependency>
      <groupId>groupId</groupId>
      <artifactId>TheArtifact</artifactId>
      <version>${project.version}</version>
    </dependency>
    <!-- Supplemental deps only needed in this module -->
    <dependency>
      <groupId>....</groupId>
      <artifactId>....</artifactId>
      <version>...</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
  <profiles>
    <profile>
      <id>run-its</id>
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-failsafe-plugin</artifactId>
            <executions>
              <execution>
                <goals>
                  <goal>integration-test</goal>
                  <goal>verify</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    </profile>
  </profiles>
</project>

通过使用它,您可以通过以下方式控制运行集成测试:

mvn -Prun-its clean verify

您必须为集成测试模块所需的其他模块定义依赖关系,或者确保在此集成测试模块之前必须构建这些模块,这一点非常重要。

此外,您现在可以在此处配置集成测试所需的补充内容,例如在pre-integration-test和/或post-integration-test阶段中运行。

如果将测试代码放入src/test/java加上可选资源到src/test/resources,您现在可以在集成测试模块中与任何其他模块分开定义依赖关系。

您当然应该在父pom中的pluginManagement中定义插件的版本,以定义构建期间使用的所有插件。