web-dev-qa-db-fra.com

Comment exécuter des tests JUnit et TestNG dans le même projet en utilisant maven-surefire-plugin?

À l'heure actuelle, j'ai les deux types de tests, mais quand je dis "test mvn", il exécute uniquement les tests TestNG et non Junit. Je veux exécuter les deux l'un après l'autre. Une idée ?

36
ravinikam

Il existe un numéro open pour thi s, il n’existe donc aucun moyen élégant de le faire.

Il serait beaucoup plus simple pour vous de choisir un cadre et de vous y tenir.

Edit: Ma réponse précédente ne fonctionne pas car vous ne pouvez pas spécifier de dépendances dans l'exécution. J'ai essayé plusieurs approches, mais le mieux que je puisse gérer est de créer un profil pour la dépendance TestNG afin pouvez basculer entre les tests TestNG et JUnit, il ne semble pas y avoir de moyen d’exécuter les tests TestNG et Junit 4.

Un autre point à noter: vous pouvez lancer vos tests JUnit à partir de TestNG , mais je pense que cela ne fonctionne que pour les tests JUnit 3.

11
Rich Seller

Manière officielle avec sélection des fournisseurs .

Vous pouvez également spécifier plusieurs fournisseurs en tant que dépendances. Ils seront tous exécutés et produiront un rapport commun . Cela peut être particulièrement utile avec les fournisseurs externes, car il existe peu de cas d'utilisation pour combiner les fournisseurs inclus.

<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>

Plus d'informations à ce sujet: Mélanger les tests TestNG et JUnit dans un module Maven - édition 2013

Lien actuel pour cela dans les exemples de maven-surefire-plugin . Recherchez " Exécution de TestNG et JUnit Tests ".

Vous voudrez configurer le fournisseur de test pour ignorer les tests junit comme ceci:

<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>
40
MariuszS

J'ai une meilleure solution .

L'idée est de créer deux exécutions du maven-surefire-plugin, une pour JUnit, une pour TestNG. Vous pouvez désactiver TestNG ou JUnit par exécution en spécifiant des variables junitArtifactName ou testNGArtifactName non existantes:

<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>
12
lexicore

Il y a une autre issue pour ceci. Vous pouvez également demander à TestNG d’exécuter également des scénarios de test Junit.

<!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>

6
jean joseph

Grâce à ce lien ( http://jira.codehaus.org/browse/SUREFIRE-377 ), voici une solution à mon problème précédent (avoir 3 exécutions au lieu de 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>
5

Pour 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>

De même, utilisez la dépendance pour TestNG si nécessaire

2
sathish p

pour Junit cela a résolu mon problème

<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>
1
Mauricio

J'ai trouvé une solution pour exécuter les deux types de test avec TestNG sans modifier la configuration de votre outil de génération.

J'ai testé avec Gradle mais je devrais aussi travailler avec Maven.

Notez que cela exécutera les tests JUnit dans TestNG, mais pas l’inverse.

L'astuce consiste à utiliser les annotations des deux frameworks dans les classes de test et à utiliser les assertions TestNG pour la compatibilité 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);
    }
}

En utilisant ce hack, vous pouvez facilement exécuter des tests JUnit existants avec TestNG, en vous aidant à les migrer lorsque le temps le permet.

J'espère que ça aide!

1
jamming

J'ai trouvé que la solution était de forcer le plugin sure-fire à utiliser JUnit. Je l'ai fait en annulant le plugin surefire dans le projet spécifique comme suit. La dépendance oblige à utiliser 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>
1
Clayton

Basé sur les solutions précédentes. J'ai trouvé que cela fonctionnait mieux pour nous. TestNG essayait de lancer d’anciens tests JUnit. Nous avons évité cela en nommant tous les tests TestNG différemment (par exemple * TestNG.Java). Ci-dessous se trouve la configuration avec deux exécutions de 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>
1
chinto

si vous spécifiez simplement le fournisseur de test, il exécutera les tests Junit et les tests de test tous une fois. 
Il n’ya donc aucune restriction quant à la désignation des tests.

versions du plugin: 
surefire-plugin 2.16 (les fournisseurs junit47 et testng sont tous deux mis à la version 2.16) 
tester la dépendance 6.8.7 
Junit dependency 4.7

0
user200905
<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>

Il suffit ensuite d’exécuter: mvn test -Pjunit-tests (pour exécuter le test sur Junit) ou mvn test -PtestNG-tests (pour TestNG test).

0
MolodecSerg