77 votes

Comment exécuter les tests JUnit par catégorie dans Maven ?

En utilisant JUnit 4.8 et le nouvel outil @Category existe-t-il un moyen de choisir un sous-ensemble de catégories à exécuter avec le plugin Surefire de Maven ?

Par exemple, j'ai :

@Test
public void a() {
}

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

Et j'aimerais exécuter tous les tests non lents comme dans : (notez que le -Dtest.categories a été inventé 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

Le fait est que je ne veux pas avoir à créer de suites de tests (Maven récupère simplement tous les tests unitaires du projet, ce qui est très pratique) et j'aimerais que Maven puisse sélectionner les tests par catégorie. Je pense que je viens d'inventer le -Dtest.categories, donc je me demandais s'il y a une facilité similaire que je peux utiliser ?

0 votes

Voir Mélange de testng et junit pour plus de détails. À partir de la version 2.11 de maven-surefire-plugin, les catégories sont prises en charge

0 votes

Ce n'est pas directement lié, mais c'est un moyen de calculer le compteur "Tests par catégorie". .

77voto

dmcnelis Points 2284

Maven a depuis été mis à jour et peut utiliser les catégories.

Un exemple de la Documentation Surefire :

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

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

8 votes

La version 2.11 n'a pas fonctionné pour moi, parce que Surefire continuait à ignorer les groupes que je spécifiais. La mise à jour vers la version 2.12.3 du plugin Surefire a fonctionné.

7 votes

Mais comment faire des configurations multiples pour des catégories différentes ? Par exemple, le PO 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 ?

1 votes

Attention ! La version 2.11 ignore les groupes ! L'exemple fourni sous maven.apache.org/surefire/maven-surefire-plugin/examples/ est toujours incorrecte !

50voto

Mark Butler Points 1463

Sur cette base article de blog - et en simplifiant - ajoutez ceci à 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 votes

La version 2.13 du plugin Surefire n'a pas fonctionné pour moi. J'ai eu cette erreur : "groups/excludedGroups require TestNG or JUnit48+ on project test classpath", bien que j'utilise Junit 4.11. La rétrogradation du plugin Surefire à la version 2.12.2 a résolu l'erreur.

0 votes

Cela a fonctionné pour moi, en utilisant la version 2.17 de Surefire. J'ai dû changer la dépendance org.apache.maven.surefire:surefire-junit47:2.13 en org.apache.maven.surefire:common-junit48:2.17.

0 votes

Joli. avec maven-surefire-plugin:2.2.22 vous n'avez pas besoin de la surefire-junit47 dépendance. Bien sûr, on peut exécuter mvn test -P SlowTests

24voto

Joel Points 338

J'ai eu un cas similaire où je voulais exécuter tous les tests SAUF une catégorie donnée (par exemple, parce que j'ai des centaines d'anciens tests non catégorisé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 votes

Comment configurer Hot pour qu'il ne fonctionne qu'avec un groupe spécifique ?

1 votes

@Francy il suffit d'exécuter avec le profil correspondant, de cet exemple : mvn test -P NonSlowTests

0 votes

Pouvez-vous exclure plusieurs groupes ?

6voto

Pascal Thivent Points 295221

Cette réponse est obsolète

Il semble que cela ne soit pas pris en charge, voir SUREFIRE-329 (même si cette question ne concerne pas JUnit 4.8, je recommande de voter/commenter cette question).

J'ai donc peur que vous deviez vous en remettre à des "solutions" telles que celui-ci pour l'instant.

1voto

Jesus Benito Points 76

Ce n'est 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. Vous n'utilisez pas Junit Categories cependant.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X