Собрать родительский pom и запустить специальный тест интеграции в Jenkins через maven?
Проведение mvn clean install
на моем родительском pom собирает все подмодули и запускает соответствующие тесты junit. Он не запускает интеграционные тесты.
После сборки и запуска модулей, я хочу запустить конкретный интеграционный тест в конкретном субмодуле.
Я использую следующую команду:
mvn clean install -DTest=integrationTestName
Работа терпит неудачу с No Test Found
ошибка на этапе сборки.
Я также пытался использовать
mvn clean install -DTest=integrationTestName -pl=sub-module-name
но это только строит мой субмодуль с интеграционным тестом.
Вопрос: Как запустить единый интеграционный тест определенного модуля?
2 ответа
Я полагаю, вы попробовали test
опция (в нижнем регистре) плагина Maven Surefire для запуска определенного теста, который Surefire не смог найти в первом модуле сборки реактора и, следовательно, потерпел неудачу.
Я также предполагаю, что интеграционные тесты выполняются плагином Maven Failsafe. Если нет, они должны, как указано в официальной документации:
Плагин Failsafe предназначен для запуска интеграционных тестов, а плагин Surefire - для модульных тестов. ... Если вы используете плагин Surefire для запуска тестов, то при сбое теста сборка остановится на
integration-test
фаза и ваша среда тестирования интеграции не будет сорвана правильно... Плагин Failsafe не подведет сборку во времяintegration-test
фаза, что позволяетpost-integration-test
фаза для выполнения.
Короче говоря: это безопаснее и намного надежнее.
Хотя запись конфигурации плагина для плагина Maven Failsafe также test
соответствующая опция командной строки it.test
, поэтому вы должны вместо этого запустить:
mvn clean install -Dit.test=SampleIT
куда SampleIT
это интеграционный тест (обратите внимание на стандарт IT
суффикс, распознаваемый по умолчанию Failsafe.
Официальная документация " Запуск одного теста" также предоставляет дополнительную информацию о запуске отдельных тестов интеграции.
Также обратите внимание: вызов выше будет работать, если у вас нет других интеграционных тестов в других модулях сборки, иначе он не сможет найти его раньше (до попадания в соответствующий модуль).
Если вы используете Surefire для запуска соответствующего интеграционного теста (опять же, вы не должны) или у вас есть несколько модулей, выполняющих интеграционные тесты, вам следует настроить профиль в соответствующем модуле, который бы позаботился об этом конкретном вызове, что-то вроде следующий:
<profiles>
<profile>
<id>run-single-it-test</id>
<activation>
<property>
<name>single.it.test</name>
</property>
</activation>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>2.19.1</version>
<configuration>
<test>${single.it.test}</test>
</configuration>
<executions>
<execution>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
А затем вызовите сборку следующим образом:
mvn clean install -Dsingle.it.test=SampleIT
Таким образом, Maven будет активировать профиль на основе наличия значения для single.it.test
собственности и передать его test
Свойство Failsafe Plugin (или Surefire, если оно имело место), Failsafe будет игнорировать любые другие интеграционные тесты для этого выполнения, и другие модули не пострадают (игнорируя это свойство).
Ответ A_Di-Matteo дает вам большую часть пути, но вам необходим следующий конфиг для maven-surefire-plugin для подавления всех модульных тестов.
<profiles>
<profile>
<id>run-single-it-test</id>
<activation>
<property>
<name>single.it.test</name>
</property>
</activation>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skipTests>true</skipTests>
<failIfNoTests>false</failIfNoTests>
</configuration>
<executions>
<execution>
<goals>
<goal>test</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<configuration>
<test>${single.it.test}</test>
<failIfNoTests>false</failIfNoTests>
</configuration>
<executions>
<execution>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>