这是mvn
中的项目结构:
您可以注意到,我在src/test/java
CardValidtorIT.java
(这是集成测试)
CardValidatorTest.java
(这是单元测试)
当我跑
时 mvn package
我注意到只有unit-test (CardValidatorTest.java)
正在运行
但是当我跑步时
mvn integration-test
我看到unit-test
和Integration tests
都在运行。
运行mvn
时,CardValidatorIT.java
如何知道不执行mvn package
。也就是说,为什么它没有运行CardValidatoryIT.java
这是我的pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>chapter14</artifactId>
<groupId>org.agoncal.book.javaee7</groupId>
<version>1.0</version>
</parent>
<groupId>org.agoncal.book.javaee7.chapter14</groupId> <artifactId>chapter14-service</artifactId> <version>1.0</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>org.glassfish.main.extras</groupId> <artifactId>glassfish-embedded-all</artifactId> <version>4.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5.1</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.2</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId> <artifactId>maven-failsafe-plugin</artifactId> <version>2.12.4</version>
<executions>
<execution>
<id>integration-test</id>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
P.S:我知道我在mvn中有一个integration-test
目标。但是我没有把目标放在集成测试期间应该运行哪个类
由于
答案 0 :(得分:17)
见Maven Surefire。
此插件负责Maven中的mvn test
。默认配置正在发挥作用。这意味着当您运行Test
并且在您的情况下mvn test
mvn package
的课程将会发挥作用
http://maven.apache.org/surefire/maven-surefire-plugin/examples/inclusion-exclusion.html
运行mvn integration-test
时,会使用故障安全插件。它的默认包含/排除规则不同 - 默认情况下,它会查找单词IT
,例如。
http://maven.apache.org/surefire/maven-failsafe-plugin/examples/inclusion-exclusion.html
注意:对我来说,运行CardValidatorTest
时会检测到测试类mvn integration-test
,这很奇怪。基于我如何阅读failsafe-plugin的默认包含和排除规则,我不希望这样。事实上,当我将pom.xml
改编为我自己的示例项目时,我不会看到这种行为。相反,所有Test
个类都会被mvn test
和mvn package
选中。所有IT
课程都会被mvn integration-test
选中。你确定你不会对这两个类有一些代码级别的依赖吗?除了更改的包含/排除规则之外,我唯一可以想到的可能会导致他们被mvn test
或mvn package
选中。
答案 1 :(得分:5)
Maven中的Failsafe plugin处理集成测试。默认情况下,这些是集成测试的include patterns:
"**/IT*.java" - includes all of its subdirectories and all java filenames that start with "IT".
"**/*IT.java" - includes all of its subdirectories and all java filenames that end with "IT".
"**/*ITCase.java" - includes all of its subdirectories and all java filenames that end with "ITCase".
Failsafe不是Maven的default lifecycle bindings的一部分,所以像CardValidatorIT
这样的集成测试当然满足默认模式,不会作为生命周期的一部分运行。这得到了Maven的观点约定,其中失败应该使构建失败以及哪些测试应该一直运行(具有宽代码覆盖率的快速单元测试)与哪些测试应该较少运行(慢速集成测试)。
当然,您可以根据需要覆盖约定。
答案 2 :(得分:2)
集成测试构建阶段在软件包构建阶段之后。所以“mvn package”不会达到“集成测试”构建阶段。