2014-09-26 3 views
10

Это моя структура проекта в mvn:Как Maven отличается от теста интеграции?

enter image description here

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

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

  2. 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. но я не привязан к цели, к какому классу должен быть запущен во время тестирования интеграции

Благодаря

ответ

9

См. 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.

+0

Уверен, что у меня нет зависимости от уровня кода. 'mvn test' запускает только 1 тест (cardValidatorTest),' mvn package' запускает только 1 тест (CardValidatorTest), но 'mvn integration-test' запускает 2 теста (CardValidatorTest и CardValidatorIT). Но ваш ответ помог и ссылки тоже! благодаря –

4

Failsafe plugin в Maven обрабатывает интеграционного тестирования. По умолчанию, эти 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". 

Отказоустойчивость не является частью Maven-х default lifecycle bindings, поэтому интеграционные тесты, как CardValidatorIT, которые, конечно, удовлетворяет модели по умолчанию, не работают как часть жизненного цикла. Это приводит к убежденным соглашениям Maven, для которых сбои должны выходить из строя и какие тесты должны выполняться все время (быстрые модульные тесты с широким охватом кода), в сравнении с которыми тесты должны выполняться реже (медленные интеграционные тесты).

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

+0

, и они должны быть в 'src/test/java/IT **. Java'? будет ли это работать? 'src/main/java/IT **. java.' Это может иметь коллизии имен с моим классом, которые имеют шаблон' IT **. java' –

+0

Я никогда не пробовал, но я думаю, вы могли бы это сделать, добавив ' config' для плагинов для того, что включено/исключено в разных частях жизненного цикла. Тем не менее, вы открываете себе дверь для головной боли, что я буду рассматривать гораздо больше проблем, чем это стоит. – Vidya

+0

Я предпочитаю src/test/java/underfree-plugin и src/integration-test/java/лежащий в основе отказоустойчивый плагин для UT и IT. Как мы можем сделать ? – fjjiaboming

1

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

Смежные вопросы