Комплексное тестирование отказоустойчивых интегрированных тестов Maven plus Spring Boot plus Multi
У меня есть многомодульный проект Spring Boot, который отвечает всем требованиям, кроме тестирования интеграции. Модульные тесты, определенные в src/test, работают безошибочно, как часть фазы тестирования.
Многочасовые эксперименты с отказоустойчивостью не принесли желаемых результатов. Отказоустойчивый не может найти ни одного из тестов. Я предполагаю, что это основано на:
- Тестовые классы не являются частью файла.jar, связанного с каждым из модулей.
- Я никак не мог понять, как получить тестовый файл.jar на пути к классам, где failsafe будет искать тесты.
Мой проект:
project folder
--pom.xml
|
----application
------pom.xml
------src
--------main
--------test
|
----model
------pom.xml
|
------data
--------pom.xml
--------src
----------main
----------test
|
------repository
--------pom.xml
--------src
----------main
----------test
Мой родительский пом:
<project>
....
<artifactId>master</artifactId>
....
<modules>
<module>model</module>
<module>application</module>
</modules>
....
<dependencyManagement>
<dependencies>
<!-- Model -->
<dependency>
<groupId>xxx.xxx.xxx</groupId>
<artifactId>data</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>xxx.xxx.xxx</groupId>
<artifactId>repository</artifactId>
<version>${project.version}</version>
</dependency>
<!-- Application -->
<dependency>
<groupId>xxx.xxx.xxx</groupId>
<artifactId>application</artifactId>
<version>${project.version}</version>
</dependency>
</dependencyManagement>
....
<build>
<!-- defined here and then used on a module-by-module basis -->
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>test-jar</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- Configure failsafe -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<configuration>
<includes>
<include>**/*Tests.java</include>
<include>**/*Test.java</include>
</includes>
<excludes>
<exclude>**/Abstract*.java</exclude>
</excludes>
<additionalClasspathElements>
<additionalClasspathElement>
${project.basedir}/../../model/data/target/data-${project.version}-tests.jar
</additionalClasspathElement>
</additionalClasspathElements>
<dependenciesToScan>
<dependency>
com.optum.cirrus:repository
</dependency>
</dependenciesToScan>
</configuration>
<executions>
<execution>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
</execution>
</executions>
</plugin>
</plugin>
</plugins>
</pluginManagement>
....
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.6</version>
<executions>
<execution>
<goals>
<goal>test-jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Обратите внимание, что я создаю тестовую флягу для всех модулей наряду с флягой, основанной на основном коде. Это работает, как и предполагалось, только с кодом src/test в файле test-jar.
Файлы модуля pom:
<project>
<parent>
<artifactId>master</artifactId>
</parent>
....
<artifactId>model</artifactId>
<packaging>pom</packaging>
<modules>
<module>data</module>
<module>repository</module>
</modules>
....
</project>
<project>
....
<parent>
<artifactId>model</artifactId>
</parent>
<artifactId>data</artifactId>
<packaging>jar</packaging>
<name>data</name>
....
</project>
<project>
....
<parent>
<artifactId>model</artifactId>
</parent>
<artifactId>repository</artifactId>
<packaging>jar</packaging>
<name>repository</name>
<dependencies>
<dependency>
<groupId>xxx.xxx.xxxx</groupId>
<artifactId>data</artifactId>
</dependency>
</dependencies>
....
</project>
<project>
....
<parent>
<artifactId>model</artifactId>
</parent>
<artifactId>master</artifactId>
<packaging>jar</packaging>
<name>application</name>
<dependencies>
<dependency>
<groupId>xxx.xxx.xxxx</groupId>
<artifactId>resources</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Отказоустойчивый работает только как часть сборки приложения. Это происходит после того, как была перепакована весенняя загрузка, хотя доступны и исходные, и перепакованные файлы jar.
Когда я запускаю maven с debug on, я вижу перепакованный jar приложения плюс jar ресурсов [я предполагаю, что это там на основе элемента зависимости, определенного в failsafe] плюс resources-test.jar [предполагается, что он существует на основе элемента AdditionalClasspathElements ] находятся на пути к классу.
Я не знаю, как настроить отказоустойчивую систему так, чтобы она могла находить тестовые классы, включенные в файл test.jar, точно так же, как и модульные тесты, когда используются только верный и единственный модуль.
Одной из неисследованных возможностей может быть создание второго артефакта, например, из ресурсов pom.xml, который бы создал test.jar. Затем я мог бы передать его в отказоустойчивый в качестве зависимости. Обратите внимание, что "просто создайте отдельный модуль, в котором есть только src/test, зависящий от кода src / main ", возможно, вы достигнете этого результата, но решение выглядит как настоящий клочок... создание стандартного исходного кода структура файла, чтобы соответствовать модели Maven.
Жизнь не может быть такой странной, а то, что делается, не может быть таким "одноразовым", что желаемые результаты еще не достигнуты. Это означает, что я явно делаю что-то не так, но понятия не имею, что. Мы ценим любые предложения.
Благодарю.