Как Maven отличается unit Test от тестирования интеграции?

Это моя структура проекта в mvn:

enter image description here

Как вы можете заметить, у меня есть два класса в src/test/java

  • CardValidtorIT.java (это интеграционный тест)

  • CardValidatorTest.java (Это Unit-Test)

когда я запускаю

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: Я знаю, что у меня есть цель integration-test в mvn. но я не привязал цель, к которой класс должен быть запущен во время теста интеграции

Спасибо

Ответ 1

См. Maven Surefire.

Этот плагин отвечает за mvn test в Maven. Конфигурация по умолчанию вступает в игру. Это означает, что класс со словом 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. Основываясь на том, как я прочитал правила включения и исключения по умолчанию для отказоустойчивого плагина, я бы этого не ожидал. Фактически, когда я адаптирую ваш pom.xml к собственному образцу проекта, я не вижу этого поведения. Вместо этого все классы Test выбираются с помощью mvn test и mvn package. Все классы IT выбираются с помощью mvn integration-test. Вы уверены, что у вас нет зависимости уровня кода от двух классов? Помимо измененного правила включения/исключения, единственное, что я могу думать об этом, может привести к тому, что их обоих возьмут с помощью mvn test или mvn package.

Ответ 2

Failsafe plugin в Maven обрабатывает тестирование интеграции. По умолчанию это включить шаблоны для тестов интеграции:

"**/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 привязки жизненного цикла по умолчанию, поэтому интеграционные тесты, такие как CardValidatorIT, которые, конечно, удовлетворяют шаблонам по умолчанию, не выполняются как часть жизненного цикла. Это приводит к убеждениям Maven, которые отказывают в сбое и какие тесты должны выполняться все время (быстрые модульные тесты с широким охватом кода), в сравнении с которыми тесты должны выполняться реже (медленные интеграционные тесты).

Конечно, вы можете переопределять соглашения, как вы считаете нужным.

Ответ 3

Фаза сборки интеграционного теста возникает после фазы сборки пакета. Таким образом, "mvn package" не достигнет фазы сборки "интеграция-тест".