我有一个具有以下结构的多模块项目:
Project:
- module1
- module2
- integration-test
- parent pom
实现以下目标的正确方法是什么:
mvn clean install
一些考虑因素:
- 默认情况下,不应使用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
时,它也正在运行来自其他模块的单元测试。我错过了什么?
答案 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中定义插件的版本,以定义构建期间使用的所有插件。