我有一个maven2多模块项目,在我的每个子模块中,我都有JUnit测试,分别命名为Test.java
和Integration.java
,用于单元测试和集成测试。当我执行:
mvn test
执行子模块中的所有JUnit测试*Test.java
。当我执行
mvn test -Dtest=**/*Integration
Integration.java
测试中没有一个在子模块中执行。
这些对我来说似乎是完全相同的命令,但是 -Dtest = / * Integration **的那个命令不起作用它显示在父级别运行的0个测试,但没有任何测试
答案 0 :(得分:218)
Maven build lifecycle现在包括用于运行集成测试的“集成测试”阶段,该阶段与“测试”阶段期间运行的单元测试分开运行。它运行在“package”之后,因此如果你运行“mvn verify”,“mvn install”或“mvn deploy”,集成测试将一直运行。
默认情况下,integration-test运行名为**/IT*.java
,**/*IT.java
和**/*ITCase.java
的测试类,但这可以配置。
有关如何连接所有内容的详细信息,请参阅Failsafe plugin,Failsafe 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 {
}
}
<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清洁测试时,只会运行未标记的单元测试。
<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运行集成测试。
如果您希望使用标志来切换这些测试的执行,请遵循以下内容。
<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