Как выполнить тесты JUnit и TestNG в одном проекте, используя плагин maven-surefire?

StackOverflow https://stackoverflow.com/questions/1232853

Вопрос

Сейчас у меня есть тесты обоих типов, но когда я говорю «тест 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>

Подробнее об этом: Смешивание тестов 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 на основе).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top