Maven不同单元测试如何从集成测试?

时间:2014-09-26 19:28:56

标签: unit-testing maven integration-testing

这是mvn中的项目结构:

enter image description here

您可以注意到,我在src/test/java

中有两个班级
  1. CardValidtorIT.java(这是集成测试)

  2. CardValidatorTest.java(这是单元测试)

  3. 当我跑

    mvn package

    我注意到只有unit-test (CardValidatorTest.java)正在运行

    但是当我跑步时

    mvn integration-test

    我看到unit-testIntegration 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目标。但是我没有把目标放在集成测试期间应该运行哪个类

    由于

3 个答案:

答案 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 testmvn package选中。所有IT课程都会被mvn integration-test选中。你确定你不会对这两个类有一些代码级别的依赖吗?除了更改的包含/排除规则之外,我唯一可以想到的可能会导致他们被mvn testmvn 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”不会达到“集成测试”构建阶段。