2010-06-23 4 views
54

En utilisant JUnit 4.8 et les nouvelles annotations @Category, existe-t-il un moyen de choisir un sous-ensemble de catégories à exécuter avec le plugin Surefire de Maven?Comment lancer les tests JUnit par catégorie dans Maven?

Par exemple, j'ai:

@Test 
public void a() { 
} 

@Category(SlowTests.class) 
@Test 
public void b() { 
} 

J'aimerais exécuter tous les tests non-lents comme dans: (notez que le -Dtest.categories a été faite par moi ...).

mvn test -Dtest.categories=!SlowTests // run non-slow tests 
mvn test -Dtest.categories=SlowTests // run only slow tests 
mvn test -Dtest.categories=SlowTests,FastTests // run only slow tests and fast tests 
mvn test // run all tests, including non-categorized 

Ainsi, le point est que je ne veux pas avoir à créer des suites de test (Maven prend juste place tous les tests unitaires dans le projet qui est très pratique) et je voudrais Maven pour être en mesure de choisir les tests par catégorie. Je pense que je viens de faire le -Dest.categories, donc je me demandais s'il y a un service similaire que je peux utiliser?

+0

Voir [Mélange testng et JUnit] (http://stackoverflow.com/questions/9172820/mix-testng-junit-avec-maven-surefire-plugin-version-2-11-et-supérieur-pour-integ) pour plus de détails. De la version 2.11 de maven-surefire-plugin les catégories sont soutenues –

Répondre

1

Pas exactement la même chose mais en utilisant le plugin surefire, les classes de test peuvent être choisies en fonction du nom du fichier. Cependant, vous n'utilisez pas les catégories Junit.

Un exemple pour exécuter uniquement des tests DAO.

<executions> 
    <execution> 
    <id>test-dao</id> 
     <phase>test</phase> 
      <goals> 
      <goal>test</goal> 
     </goals> 
      <configuration> 
      <excludes> 
       <exclude>none</exclude> 
      </excludes> 
      <includes>     
       <include>**/com/proy/core/dao/**/*Test.java</include> 
      </includes> 
     </configuration> 
    </execution> 

http://maven.apache.org/plugins/maven-surefire-plugin/examples/inclusion-exclusion.html

67

Maven a depuis été mis à jour et peuvent utiliser des catégories.

Un exemple de la Surefire documentation:

<plugin> 
     <artifactId>maven-surefire-plugin</artifactId> 
     <version>2.11</version> 
     <configuration> 
     <groups>com.mycompany.SlowTests</groups> 
     </configuration> 
</plugin> 

Cela exécutera une classe avec l'annotation @Category(com.mycompany.SlowTests.class)

+7

La version 2.11 n'a pas fonctionné pour moi, parce que Surefire a continué à ignorer les groupes que j'ai spécifiés. Mise à niveau vers le plugin surefire version 2.12.3 a fait l'affaire –

+5

Comment peut-on faire plusieurs configurations pour différentes catégories cependant? Autrement dit, l'OP voulait pouvoir spécifier une catégorie sur la ligne de commande, mais si la catégorie est spécifiée dans le POM, comment en spécifier une sur la ligne de commande? –

+0

Attention! La version 2.11 ignore les groupes! L'exemple fourni sous http://maven.apache.org/surefire/maven-surefire-plugin/examples/junit.html#Using_JUnit_Categories est toujours incorrect! – Heezer

38

Sur la base de cette blog post - et en simplifiant - ajouter à votre pom.xml:

<profiles> 
    <profile> 
     <id>SlowTests</id> 
     <properties> 
      <testcase.groups>com.example.SlowTests</testcase.groups> 
     </properties> 
    </profile> 
    <profile> 
     <id>FastTests</id> 
     <properties> 
      <testcase.groups>com.example.FastTests</testcase.groups> 
     </properties> 
    </profile> 
</profiles> 

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-surefire-plugin</artifactId> 
      <version>2.13</version> 
      <dependencies> 
       <dependency> 
        <groupId>org.apache.maven.surefire</groupId> 
        <artifactId>surefire-junit47</artifactId> 
        <version>2.13</version> 
       </dependency> 
      </dependencies> 
      <configuration> 
       <groups>${testcase.groups}</groups> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 

puis à la ligne de commande

mvn install -P SlowTests 
mvn install -P FastTests 
mvn install -P FastTests,SlowTests 
+0

La version 2.13 du plugin surefire ne fonctionnait pas pour moi. J'ai cette erreur: "groups/excludedGroups nécessite TestNG ou JUnit48 + sur le chemin de classe de test de projet", bien que j'utilise Junit 4.11. Le déclassement du plugin surefire en 2.12.2 a résolu l'erreur. –

+0

Cela a fonctionné pour moi, en utilisant la version 2.17 de Surefire. Je devais changer la dépendance de org.apache.maven.surefire: surefire-junit47: 2.13 en org.apache.maven.surefire: common-junit48: 2.17. – Kkkev

+0

courir deux profils togather ne fonctionnait pas pour moi –

5

Vous pouvez utiliser

mvn test -Dgroups="com.myapp.FastTests, com.myapp.SlowTests" 

mais assurez-vous que vous configurez correctement le plugin Maven Surefire

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <version>2.11</version> 
    <dependencies> 
    <dependency> 
     <groupId>org.apache.maven.surefire</groupId> 
     <artifactId>surefire-junit47</artifactId> 
     <version>2.12.2</version> 
    </dependency> 
    </dependencies> 
</plugin> 

Voir docs dans: https://maven.apache.org/surefire/maven-surefire-plugin/examples/junit.html

16

J'ai eu un cas similaire où je veux exécuter tous les tests SAUF une catégorie donnée (par exemple, parce que j'ai des centaines de tests non catégorisés hérités, et je ne peux pas/ne veux pas modifier chacun d'entre eux)

Le plugin Maven Surefire permet d'exclure des catégories, par exemple:

<profiles> 
    <profile> 
     <id>NonSlowTests</id> 
     <build> 
      <plugins> 
       <plugin> 
        <groupId>org.apache.maven.plugins</groupId> 
        <artifactId>maven-surefire-plugin</artifactId> 
        <configuration> 
         <excludedGroups>my.category.SlowTest</excludedGroups> 
        </configuration> 
       </plugin> 
      </plugins> 
     </build> 
    </profile> 
</profiles> 
+0

Chaud seriez-vous configuré pour exécuter seulement un groupe spécifique? – 2Big2BeSmall

+1

@Francy exécutez simplement avec le profil correspondant, à partir de cet exemple: mvn test -P NonSlowTests – Joel

+0

Pouvez-vous exclure plusieurs groupes? –

3

J'ai perdu beaucoup de temps sur cette erreur « groupes/excludedGroups nécessitent TestNG ou JUnit48 + sur classpath test du projet » parce que je pensais que j'utilisais une mauvaise version de junit, ou une mauvaise version du plugin surefire, ou une combinaison qui ne convient pas.

Ce n'était pas le cas: dans mon projet, j'avais un module "config" qui était construit avant le module que je voulais tester. Ce module avait aucune dépendance JUnit -> il y avait pas JUnit sur le chemin de classe ...

Cette erreur peut aider les autres ...

Questions connexes