Как мне запустить тесты интеграции Maven
У меня есть многомодульный проект maven2, и в каждом из моих дочерних модулей есть тесты JUnit, которые называются Test.java
а также Integration.java
для юнит-тестов и интеграционных тестов соответственно. Когда я выполню:
mvn test
все тесты JUnit *Test.java
внутри дочерних модулей выполняются. Когда я выполню
mvn test -Dtest=**/*Integration
ни один из Integration.java
тесты выполняются в дочерних модулях.
Мне кажется, что это одна и та же команда, но команда с -Dtest =/ * Integration ** не работает, она отображает 0 тестов, выполняемых на родительском уровне, которых нет.
10 ответов
Вы можете настроить Maven's Surefire для отдельного запуска модульных и интеграционных тестов. На стандартном этапе модульного тестирования вы запускаете все, что не соответствует шаблону, соответствует интеграционному тесту. Затем вы создаете второй этап тестирования, который запускает только интеграционные тесты.
Вот пример:
<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>
Жизненный цикл сборки Maven теперь включает фазу "интеграционного тестирования" для запуска интеграционных тестов, которые запускаются отдельно от модульных тестов, выполняемых на стадии "тестирования". Он запускается после "package", поэтому, если вы запустите "mvn verify", "mvn install" или "mvn deploy", интеграционные тесты будут выполняться по пути.
По умолчанию интеграционный тест запускает тестовые классы с именем **/IT*.java
, **/*IT.java
, а также **/*ITCase.java
, но это можно настроить.
Для получения подробной информации о том, как подключить все это, см. Плагин Failsafe, страницу использования Failsafe (неправильно указанную на предыдущей странице, когда я пишу это), а также ознакомьтесь с этим сообщением в блоге Sonatype.
Я сделал именно то, что вы хотите сделать, и это прекрасно работает. Модульные тесты "*Tests" всегда запускаются, а "*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>
Удачи!
Вы должны использовать плагин maven surefire для запуска модульных тестов и плагин maven failsafe для запуска интеграционных тестов.
Следуйте инструкциям ниже, если вы хотите переключить выполнение этих тестов с помощью флагов.
Конфигурация Maven
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skipTests>${skipUnitTests}</skipTests>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<configuration>
<includes>
<include>**/*IT.java</include>
</includes>
<skipTests>${skipIntegrationTests}</skipTests>
</configuration>
<executions>
<execution>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
</execution>
</executions>
</plugin>
<properties>
<skipTests>false</skipTests>
<skipUnitTests>${skipTests}</skipUnitTests>
<skipIntegrationTests>${skipTests}</skipIntegrationTests>
</properties>
Итак, тесты будут пропущены или переключены в соответствии с приведенными ниже правилами флага:
Тесты можно пропустить с помощью следующих флагов:
-DskipTests
пропускает как модульные, так и интеграционные тесты-DskipUnitTests
пропускает модульные тесты, но выполняет интеграционные тесты-DskipIntegrationTests
пропускает интеграционные тесты, но выполняет модульные тесты
Запуск тестов
Выполните ниже, чтобы выполнить только модульные тесты
mvn clean test
Вы можете выполнить команду ниже, чтобы запустить тесты (как модульные, так и интеграционные)
mvn clean verify
Чтобы запускать только тесты интеграции, выполните
mvn failsafe:integration-test
Или пропустить модульные тесты
mvn clean install -DskipUnitTests
Также, чтобы пропустить интеграционные тесты во время mvn install
, следовать
mvn clean install -DskipIntegrationTests
Вы можете пропустить все тесты, используя
mvn clean install -DskipTests
Вы можете очень легко разделить их, используя категории 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>
Конфигурация использует стандартную цель выполнения для запуска подключаемого модуля failsafe во время фазы тестирования интеграции сборки.
Теперь вы можете сделать чистую установку mvn
На этот раз, а также при выполнении модульных тестов интеграционные тесты выполняются на этапе интеграционных тестов.
По умолчанию Maven запускает только те тесты, которые имеют Test где-то в имени класса.
Переименуйте в IntegrationTest, и это, вероятно, будет работать.
В качестве альтернативы вы можете изменить конфигурацию Maven для включения этого файла, но, возможно, проще и лучше просто назвать ваши тесты SomethingTest.
Из включений и исключений тестов:
По умолчанию плагин Surefire автоматически включает все тестовые классы со следующими шаблонами:
- "** / Test *.java" - включает все его подкаталоги и все имена файлов Java, которые начинаются с "Test".
- "** / * Test.java" - включает все его подкаталоги и все имена файлов Java, которые заканчиваются на "Test".
- "** / * TestCase.java" - включает все его подкаталоги и все имена файлов Java, которые заканчиваются на "TestCase".
Если тестовые классы не соответствуют соглашению об именах, настройте плагин Surefire и укажите тесты, которые вы хотите включить.
Вы должны попробовать использовать maven failsafe плагин. Вы можете сказать, чтобы включить определенный набор тестов.
Еще один способ запуска интеграционных тестов с 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 интеграционные тесты будет включать интеграционные тесты (я также игнорирую свои промежуточные интеграционные тесты). Кроме того, у меня есть CI-сервер, который каждую ночь выполняет мои интеграционные тесты, и для этого я запускаю команду "mvn test -P интеграционные тесты".
Вы можете следовать документации 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
Мне не нужно было выполнять все настройки, предложенные в других ответах, и я могу запускать модульные или интеграционные тесты отдельно.
Что я сделал:
- добавьте конфигурацию ниже в pom.xml, чтобы указать maven, где находятся файлы интеграционных тестов (код Java и файлы ресурсов):
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<executions>
<execution>
<id>add-integration-test-source</id>
<phase>generate-test-sources</phase>
<goals>
<goal>add-test-source</goal>
</goals>
<configuration>
<sources>
<source>src/integration-test/java</source>
</sources>
</configuration>
</execution>
<execution>
<id>add-integration-test-resource</id>
<phase>generate-test-resources</phase>
<goals>
<goal>add-test-resource</goal>
</goals>
<configuration>
<resources>
<resource>
<directory>src/integration-test/resources</directory>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
Назовите файлы тестов интеграции с суффиксом "IT", например "MyTestIT.java".
Выполните только интеграционные тесты с помощью этой команды:
mvn failsafe:integration-test failsafe:verify
В приведенной выше команде «failsafe: integration-test» выполнит файлы *IT.java, а «failsafe:verify» скажет maven проверить, не завершился ли какой-либо из ранее выполненных интеграционных тестов. Если вы не используете failsafe: verify, команда mvn завершится успешно, даже если один тест не прошел.
Чтобы запустить только модульные тесты, запустите:
mvn test