Как выполнить тесты JUnit и TestNG в одном проекте с помощью maven-surefire-plugin?
прямо сейчас у меня есть оба типа тестов, но когда я говорю "mvn test", он выполняет только тесты TestNG, а не Junit. Я хочу казнить их одного за другим. Есть Идеи ?
12 ответов
есть открыть выпуск для this, поэтому нет элегантного способа сделать это.
было бы намного проще для вас выбрать структуру и придерживаться ее.
Edit: мой предыдущий ответ не работает, потому что вы не можете указать зависимости в выполнении. Я пробовал несколько подходов, но лучшее, что я могу сделать, это создать профиль для зависимости 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>
подробнее об этом: смешивание тестов TestNG и JUnit в одном модуле Maven-2013 издание
текущая Ссылка для этого в maven-surefire-примеры плагинов. Искать "запуск тестов 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 при необходимости
Я обнаружил, что решение состояло в том, чтобы заставить плагин sure-fire использовать JUnit. Я сделал это, переопределив плагин surefire в конкретном проекте следующим образом. Зависимость заставляет surefire использовать 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.ява.) Ниже приведена конфигурация с двумя исполнениями surefire-плагина.
<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>
Я нашел решение для запуска обоих типов тестов с полученных без изменения конфигурации инструмента.
Я тестировал с 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 только один раз.
так что нет никаких ограничений на именование тестов.
плагин версии:
surefire-плагин 2.16 (junit47 и поставщики testng обе версии установлены в 2.16)
зависимость testng 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>
чем просто выполните: тест -Pjunit-тесты МВН (для теста на основе JUnit) или тест -PtestNG-тесты МВН (на основе теста для TestNG).