Как выполнить тесты JUnit и TestNG в одном проекте, используя плагин maven-surefire?
-
22-07-2019 - |
Вопрос
Сейчас у меня есть тесты обоих типов, но когда я говорю «тест mvn», он выполняет только тесты TestNG, а не Junit.Я хочу выполнить оба один за другим.Есть идеи ?
Решение
Существует открытая проблема для этих , поэтому нет элегантного способа сделать это.
Было бы гораздо проще выбрать основу и придерживаться ее.
Редактировать: мой предыдущий ответ не работает, потому что вы не можете указать зависимости при выполнении. Я испробовал несколько подходов, но лучшее, что я могу сделать, - это создать профиль для зависимости TestNG, чтобы можно было переключаться между тестированием TestNG и JUnit. Похоже, что нет средств для запуска тестов TestNG и Junit 4. . р>
Еще один момент, на который следует обратить внимание: вы можете запустить свои тесты JUnit из TestNG , но я думаю, что это работает только для тестов JUnit 3.
Другие советы
Официальный способ с выбором поставщиков .
Вы также можете указать несколько поставщиков в качестве зависимостей, и все они будут работать и создавать общий отчет . Это может быть особенно удобно для внешних поставщиков, поскольку существует несколько вариантов использования для объединения включенных поставщиков.
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.18.1</version>
<dependencies>
<dependency>
<groupId>org.apache.maven.surefire</groupId>
<artifactId>surefire-junit47</artifactId>
<version>2.18.1</version>
</dependency>
<dependency>
<groupId>org.apache.maven.surefire</groupId>
<artifactId>surefire-testng</artifactId>
<version>2.18.1</version>
</dependency>
</dependencies>
</plugin>
Вы также можете указать несколько поставщиков в качестве зависимостей, и все они будут работать и создавать общий отчет . Это может быть особенно удобно для внешних поставщиков, поскольку существует несколько вариантов использования для объединения включенных поставщиков.
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.18.1</version>
<dependencies>
<dependency>
<groupId>org.apache.maven.surefire</groupId>
<artifactId>surefire-junit47</artifactId>
<version>2.18.1</version>
</dependency>
<dependency>
<groupId>org.apache.maven.surefire</groupId>
<artifactId>surefire-testng</artifactId>
<version>2.18.1</version>
</dependency>
</dependencies>
</plugin>
Подробнее об этом: Смешивание тестов TestNG и JUnit в одном модуле Maven & # 8211; Издание 2013 года
Текущая ссылка для этого в примеры maven-surefire-plugin . Найдите " Выполнение тестов TestNG и JUnit ".
Вы захотите настроить провайдера testng так, чтобы он игнорировал тесты junit следующим образом:
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.18.1</version>
<configuration>
<properties>
<property>
<name>junit</name>
<value>false</value>
</property>
</properties>
</configuration>
[...providers as dependecies, see above...]
</plugin>
У меня есть лучшее решение .
Идея состоит в том, чтобы создать два исполнения maven-surefire-plugin
, одно для JUnit, другое для TestNG. Вы можете отключить один из TestNG или JUnit для каждого выполнения, указав несуществующие junitArtifactName
или testNGArtifactName
:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<executions>
<execution>
<phase>test</phase>
<goals>
<goal>test</goal>
</goals>
<configuration>
<testNGArtifactName>none:none</testNGArtifactName>
</configuration>
</execution>
<execution>
<id>test-testng</id>
<phase>test</phase>
<goals>
<goal>test</goal>
</goals>
<configuration>
<junitArtifactName>none:none</junitArtifactName>
</configuration>
</execution>
</executions>
</plugin>
Для этого есть еще один выход.Вы также можете попросить TestNG запустить тестовые примеры Junit.Ниже приведен образец testng.xml для запуска всех тестовых случаев.
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="TestAll">
<test name="junitTestCases" junit="true">
<packages>
<package name="com.test.*" />
</packages>
</test>
<test name="testNGTestCases" >
<packages>
<package name="com.test.*" />
</packages>
</test>
</suite>
Благодаря этой ссылке ( http://jira.codehaus.org/browse/SUREFIRE-377 ) Вот решение моей предыдущей проблемы (3 выполнения вместо 2)
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.10</version>
<configuration>
<testNGArtifactName>none:none</testNGArtifactName>
</configuration>
<executions>
<execution>
<phase>test</phase>
<goals>
<goal>test</goal>
</goals>
<configuration>
<junitArtifactName>none:none</junitArtifactName>
<testNGArtifactName>org.testng:testng</testNGArtifactName>
</configuration>
</execution>
</executions>
</plugin>
Для JUnit ---
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19.1</version>
<dependencies>
<dependency>
<groupId>org.apache.maven.surefire</groupId>
<artifactId>surefire-junit47</artifactId>
<version>2.19.1</version>
</dependency>
</dependencies>
Аналогичным образом используйте зависимость для TestNG, когда это необходимо.
Я обнаружил, что решение было заставить принудительный плагин использовать JUnit. Я сделал это, переопределив верный плагин в конкретном проекте следующим образом. Зависимость заставляет наверняка использовать JUnit.
<build>
<plugins>
<!-- force sure fire to use junit instead of testng -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.10</version>
<dependencies>
<dependency>
<groupId>org.apache.maven.surefire</groupId>
<artifactId>surefire-junit47</artifactId>
<version>2.10</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
На основании предыдущих решений. Я обнаружил, что это работает лучше всего для нас. Еще одна проблема, с которой мы столкнулись, заключалась в том, что TestNG пытался запустить старые тесты JUnit. Мы избежали этого, назвав все тесты TestNG по-разному (например, * TestNG.java). Ниже приведена конфигурация с двумя запусками surefire-plugin.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.12.4</version>
<configuration>
<testNGArtifactName>none:none</testNGArtifactName>
<excludes>
<exclude>**/*TestNG.java</exclude>
</excludes>
</configuration>
<executions>
<execution>
<id>test-testng</id>
<phase>test</phase>
<goals>
<goal>test</goal>
</goals>
<configuration>
<junitArtifactName>none:none</junitArtifactName>
<testNGArtifactName>org.testng:testng</testNGArtifactName>
<includes>
<include>**/*TestNG.java</include>
</includes>
<excludes>
<exclude>**/*Test.java</exclude>
</excludes>
</configuration>
</execution>
</executions>
</plugin>
Я нашел решение для запуска обоих типов тестов с TestNG без изменения конфигурации вашего инструмента сборки.
Я тестировал Gradle, но должен работать и с Maven.
Обратите внимание, что это будет запускать тесты JUnit внутри TestNG, но не наоборот.
Хитрость заключается в том, чтобы использовать аннотации обеих платформ в тестовых классах и использовать утверждения TestNG для совместимости с JUnit.
import static org.testng.AssertJUnit.*;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
@org.testng.annotations.Test
public final class ApplicationTest {
@org.testng.annotations.BeforeClass
@BeforeClass
public static void setup () {}
@org.testng.annotations.AfterClass
@AfterClass
public static void cleanup () {}
@Test public void json () throws IOException {
assertTrue (true);
}
}
Используя этот хак, вы можете легко запускать существующие тесты JUnit с TestNG, помогая переносить их, когда позволяет время.
Надеюсь, это поможет!
для Junit это решило мою проблему
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19.1</version>
<dependencies>
<dependency>
<groupId>org.apache.maven.surefire</groupId>
<artifactId>surefire-junit47</artifactId>
<version>2.19.1</version>
</dependency>
</dependencies>
если вы просто укажете провайдера testng, он будет запускать тесты junit и testng только один раз.
поэтому нет никаких ограничений по именованию тестов.
версии плагинов:
верный плагин 2.16 (для версий junit47 и testng обе версии установлены на 2.16)
тестирование зависимости 6.8.7
зависимость от junit 4.7
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.0</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
<!-- ********* Skip Test for Success BUILD ******** -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.10</version>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
<!-- *********************************************** -->
</plugins>
</build>
<profiles>
<!-- ********** Profiles for run test cases ************ -->
<!-- Profile for run JUnit test dependent tests -->
<profile>
<id>junit-tests</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.10</version>
<configuration>
<skip>false</skip>
</configuration>
<dependencies>
<dependency>
<groupId>org.apache.maven.surefire</groupId>
<artifactId>surefire-junit47</artifactId>
<version>2.10</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</profile>
<!-- Profile for run TestNG dependent tests -->
<profile>
<id>testNG-tests</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.10</version>
<configuration>
<skip>false</skip>
</configuration>
</plugin>
</plugins>
</build>
</profile>
<!-- ***************************************************** -->
</profiles>
Чем просто запустить: mvn test -Pjunit-tests (для запуска теста на основе junit) или mvn test -PtestNG-tests (для теста TestNG на основе).