Junit4 и TestNG в одном проекте с Maven
Вопрос
Чтобы запустить их вместе, доступно несколько вариантов, но я выбрал использование разных профилей для Junit и TestNG.Но теперь проблема заключается в исключении и включении тестовых примеров.
Поскольку, если мы добавим зависимость TestNG к основному проекту в maven, она пропустит все Junit, я решил поместить ее в отдельный профиль.Итак, я исключаю тесты TestNG в профиле по умолчанию (main) из компиляции, используя следующую запись в pom.xml :
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.0.2</version>
<configuration>
<source>1.5</source>
<target>1.5</target>
<testExcludes>
<testExclude>**/tests/**.*</testExclude>
<testExclude>**/tests/utils/**.*</testExclude>
</testExcludes>
</configuration>
</plugin>
и то же самое для плагина surefire.Таким образом, он отлично работает с основным профилем и выполняет только тесты Junit4.Но когда я использую TestNG profile, он не будет выполнять TestNG test, даже если он не будет их компилировать.Я использую следующий профиль для их выполнения.
<profile>
<id>testNG</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.5</source>
<target>1.5</target>
<testIncludes>
<testInclude>**/tests/**.java</testInclude>
<testInclude>**/tests/utils/**.*</testInclude>
</testIncludes>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skip>false</skip>
<includes>
<include>**/**.class</include>
<include>**/tests/utils/**.class</include>
</includes>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>5.8</version>
<scope>test</scope>
<classifier>jdk15</classifier>
</dependency>
</dependencies>
</profile>
У кого - нибудь есть какие - нибудь идеи, почему он не включает их и не компилирует снова?
Решение
Конфигурация для плагина компилятора исключает типы TestNG.Конфигурация из профиля объединена с конфигурацией по умолчанию, поэтому ваша эффективная конфигурация компилятора является:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.5</source>
<target>1.5</target>
<testIncludes>
<testInclude>**/tests/**.java</testInclude>
<testInclude>**/tests/utils/**.*</testInclude>
</testIncludes>
<testExcludes>
<testExclude>**/tests/**.*</testExclude>
<testExclude>**/tests/utils/**.*</testExclude>
</testExcludes>
</configuration>
</plugin>
Это означает, что ваши типы TestNG никогда не компилируются и, следовательно, не выполняются.
Если вы укажете раздел <excludes> в профиле TestNG, он переопределит исключения по умолчанию, и ваши типы TestNG будут скомпилированы и запущены.Я не могу вспомнить, будет ли это работать с пустым тегом excludes (т.е.<excludes />), возможно, вам придется указать что-то вроде этого, чтобы гарантировать переопределение конфигурации по умолчанию.
<testExcludes>
<testExclude>dummy</testExclude>
</testExcludes>
Другие советы
Самое простое решение выглядит следующим образом
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>${surefire.version}</version>
<dependencies>
<dependency>
<groupId>org.apache.maven.surefire</groupId>
<artifactId>surefire-junit47</artifactId>
<version>${surefire.version}</version>
</dependency>
<dependency>
<groupId>org.apache.maven.surefire</groupId>
<artifactId>surefire-testng</artifactId>
<version>${surefire.version}</version>
</dependency>
</dependencies>
</plugin>
Более подробная информация об этом: Смешивание тестов TestNG и JUnit в одном модуле Maven – издание 2013 года
Я не нашел в Интернете ни одного комбинированного решения как для надежного, так и для безотказного использования.Приведенные ниже изменения в файле POM сработали для меня.
- Верный трюк выполняется путем явного указания дочернего плагина как для JUnit, так и для TestNG.
- Отказоустойчивый трюк выполняется путем определения двух исполнений, каждое с пустой конфигурацией, одно для JUnit, а другое для TestNG.
Оба решения - это хаки, которые я нашел в Интернете.Я думаю, что ссылка на Верный трюк содержится в другом ответе на этот вопрос.
<plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>${surefire.version}</version>
<dependencies>
<dependency>
<groupId>org.apache.maven.surefire</groupId>
<artifactId>surefire-junit47</artifactId>
<version>${surefire.version}</version>
</dependency>
<dependency>
<groupId>org.apache.maven.surefire</groupId>
<artifactId>surefire-testng</artifactId>
<version>${surefire.version}</version>
</dependency>
</dependencies>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>${failsafe.version}</version>
<executions>
<execution>
<id>test-testng</id>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
<configuration>
<testNGArtifactName>none:none</testNGArtifactName>
</configuration>
</execution>
<execution>
<id>test-junit</id>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
<configuration>
<junitArtifactName>none:none</junitArtifactName>
</configuration>
</execution>
</executions>
</plugin>
<!-- ... -->
</plugins>