web-dev-qa-db-fra.com

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

Utilisation de JUnit 4.8 et du nouveau @Category annotations, existe-t-il un moyen de choisir un sous-ensemble de catégories à exécuter avec le plug-in Surefire de Maven?

Par exemple, j'ai:

@Test
public void a() {
}

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

Et je voudrais exécuter tous les tests non lents comme dans: (notez que -Dtest.categories a été composé 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

Donc, le fait est que je ne veux pas avoir à créer de suites de tests (Maven ne prend que tous les tests unitaires du projet, ce qui est très pratique) et j'aimerais que Maven puisse choisir les tests par catégorie. Je pense que je viens de créer les -Dtest.categories, donc je me demandais s'il y avait une installation similaire que je pouvais utiliser?

69
Ran

Depuis, Maven a été mis à jour et peut utiliser des 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>

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

74
dmcnelis

Sur la base de cela article de blog - et 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 sur la ligne de commande

mvn install -P SlowTests
mvn install -P FastTests
mvn install -P FastTests,SlowTests
46
Mark Butler

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 classés hérités, et je ne peux/ne veux pas modifier chacun d'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>
20
Joel

Vous pouvez utiliser

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

Mais assurez-vous de configurer 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 les documents dans: https://maven.Apache.org/surefire/maven-surefire-plugin/examples/junit.html

9
paucls

J'ai perdu beaucoup de temps sur cette erreur "les groupes/groupes exclus nécessitent TestNG ou JUnit48 + sur le chemin de classe de test du projet" parce que je pensais utiliser une mauvaise version de junit, ou une mauvaise version du plugin surefire, ou une combinaison qui ne correspond pas.

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

Cette erreur peut aider les autres ...

5
Remy

Pas exactement la même chose mais en utilisant le plugin surefire, les classes de test peuvent être choisies en fonction du nom de 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

1
Jesus Benito