Как я могу получить мои тесты интеграции Maven для запуска


у меня есть многомодульный проект maven2, и в каждом из моих дочерних модулей у меня есть тесты JUnit, которые называются Test.java и Integration.java для юнит-тестов и интеграционных тестов соответственно. Когда я выполняю:

mvn test

все тесты JUnit *Test.java внутри дочерних модулей выполняются. Когда я выполняю

mvn test -Dtest=**/*Integration

нет Integration.java тесты выполняются в рамках модулей ребенка.

они кажутся точно такими же прикажи мне, но тот, у кого -Dtest=/*интеграция** не работает он отображает 0 тестов, выполняемых на родительском уровне, которые не имеют никаких тестов

8 143

8 ответов:

вы можете настроить Surefire Maven для запуска модульных тестов и интеграционных тестов отдельно. На этапе стандартного модульного теста выполняется все, что не соответствует шаблону интеграционного теста. Ты тогда создать вторую фазу испытаний это работает только интеграционные тесты.

вот пример:

    <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>

The жизненный цикл сборки Maven теперь включает фазу " integration-test "для запуска интеграционных тестов, которые выполняются отдельно от модульных тестов, выполняемых во время фазы" test". Он запускается после "пакета", поэтому если вы запустите" mvn verify"," mvn install "или" mvn deploy", интеграционные тесты будут выполняться по пути.

по умолчанию integration-test запускает тестовые классы с именем **/IT*.java,**/*IT.java и **/*ITCase.java, но это можно настроить.

подробнее о том, как чтобы подключить все это, см. безотказный плагин на безотказного использования страницы (не правильно связаны с предыдущей страницы, как я пишу это), а также проверить это сообщение в блоге Sonatype.

Я сделал именно то, что вы хотите сделать, и это отлично работает. Модульные тесты" * Тесты "всегда выполняются, а" * IntegrationTests " выполняются только при выполнении mvn verify или mvn install. Вот это фрагмент из моего ПОМА. 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>

удачи!

вы можете разделить их очень легко, используя категории JUnit и Maven.
Это очень кратко ниже путем разделения модульных и интеграционных тестов.

Определить Интерфейс Маркера

Первым шагом в группировке теста с использованием категорий является создание интерфейса маркера.
Этот интерфейс будет использоваться для пометки всех тестов, которые вы хотите запустить в качестве интеграционных тестов.

public interface IntegrationTest {}

пометить тестовые классы

добавьте аннотацию категории в верхнюю часть тестового класса. Он принимает имя вашего нового интерфейса.

import org.junit.experimental.categories.Category;
@Category(IntegrationTest.class)
public class ExampleIntegrationTest{
@Test
public void longRunningServiceTest() throws Exception {
 }
}

Настройка Модульных Тестов Maven

Красота этого решения заключается в том, что на самом деле ничего не меняется для единичного теста.
Мы просто добавляем некоторую конфигурацию в плагин maven surefire, чтобы заставить его игнорировать любые интеграционные тесты.

<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 будут выполняться только ваши немаркированные модульные тесты.

Настройка Интеграционных Тестов Maven

Опять же конфигурация для этого очень проста.
Мы используем стандартный отказоустойчивый плагин и настраиваем его только для запуска интеграционных тестов.

<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>

конфигурация использует стандартную цель выполнения для запуска отказоустойчивого плагина на этапе тестирования интеграции сборки.

теперь вы можете сделать mvn чистый установить
На этот раз, как и при выполнении модульных тестов, интеграционные тесты выполняются на этапе интеграции-теста.

вы должны попробовать использовать Maven failsafe plugin. Вы можете сказать, что он включает в себя определенный набор тестов.

по умолчанию Maven выполняет только тесты, которые имеют тест где-то в имени класса.

переименовать в IntegrationTest, и это, вероятно, будет работать.

в качестве альтернативы вы можете изменить конфигурацию Maven, чтобы включить этот файл, но, вероятно, проще и лучше просто назвать ваши тесты SomethingTest.

с включения и исключения из испытания:

по умолчанию, плагин Surefire будет автоматически включить все тестовые классы со следующими шаблонами подстановочных знаков:

  • "**/тест*.java " - включает в себя все его подкаталоги и все java имена файлов, которые начинаются с "Test".
  • "**/*тест.java " - включает в себя все его подкаталоги и все java имена файлов, которые заканчиваются на "тест".
  • " * * / * TestCase.java " - включает в себя все его подкаталоги и все java имена файлов, которые заканчиваются на "TestCase".

Если тестовые классы не идут с название соглашение, затем настроить Верный плагин и указать тестов вы хотите включить.

другой способ запуска интеграционных тестов с 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'.

вы можете следовать документация maven для запуска модульных тестов со сборкой и запуска интеграционных тестов отдельно.

<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