Как получить тесты Maven Integration для запуска

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

mvn test

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

mvn test -Dtest=**/*Integration

ни один из тестов Integration.java не выполняет выполнение в дочерних модулях.

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

Ответ 1

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

Вот пример:

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

Ответ 2

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

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

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

Ответ 3

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

Удачи!

Ответ 4

Вы можете легко разделить их, используя категории 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 clean test, будут выполняться только ваши немаркированные юнит-тесты.

Настроить интеграционные тесты 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 clean install.
На этот раз, а также при выполнении модульных тестов интеграционные тесты выполняются на этапе интеграционных тестов.

Ответ 5

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

Ответ 6

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

Переименуйте в IntegrationTest, и это, вероятно, сработает.

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

Из Включения и исключения тестов:

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

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

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

Ответ 7

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

Ответ 8

Вы можете следовать документации 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

Ответ 9

Я думаю, что @Jorge - хорошая идея, если мы не хотим запускать фазу интеграции-тестирования.

В моем случае я использую эту идею для запуска теста, связанного с casperjs, на этапе тестирования.