wake-up-neo.com

Wie führe ich JUnit-Tests nach Kategorie in Maven aus?

Verwenden von JUnit 4.8 und dem neuen @Category Anmerkungen, gibt es eine Möglichkeit, eine Untergruppe von Kategorien auszuwählen, die mit dem Surefire-Plugin von Maven ausgeführt werden sollen?

Zum Beispiel habe ich:

@Test
public void a() {
}

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

Und ich möchte alle nicht langsamen Tests wie folgt ausführen: (Beachten Sie, dass die Kategorie -Dtest.categories von mir erstellt wurde ...).

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

Der Punkt ist also, dass ich keine Testsuiten erstellen muss (Maven greift einfach alle Komponententests im Projekt auf, was sehr praktisch ist) und ich möchte, dass Maven die Tests nach Kategorie auswählen kann. Ich glaube, ich habe gerade die Kategorie -Dtest.categories erfunden. Ich habe mich also gefragt, ob es eine ähnliche Funktion gibt, die ich verwenden kann.

69
Ran

Maven wurde inzwischen aktualisiert und kann Kategorien verwenden.

Ein Beispiel aus der Surefire-Dokumentation:

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

Dadurch wird jede Klasse mit der Annotation @Category(com.mycompany.SlowTests.class) ausgeführt.

74
dmcnelis

Basierend auf diesem Blogpost - und vereinfachend - füge dies zu deiner pom.xml hinzu:

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

dann in der Befehlszeile

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

Ich hatte einen ähnlichen Fall, in dem ich alle Tests mit Ausnahme einer bestimmten Kategorie ausführen wollte (zum Beispiel, weil ich hunderte von nicht kategorisierten Legacy-Tests habe und nicht jede von ihnen ändern kann/will).

Das maven todsichere Plugin erlaubt das Ausschließen von Kategorien, zum Beispiel:

<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

Sie können verwenden

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

Aber stellen Sie sicher, dass Sie das Maven-todsichere Plugin richtig konfigurieren

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

Siehe Dokumente in: https://maven.Apache.org/surefire/maven-surefire-plugin/examples/junit.html

9
paucls

Ich habe viel Zeit bei dem Fehler "Für groups/excludedGroups ist TestNG oder JUnit48 + auf dem Projekttestklassenpfad erforderlich" verloren, weil ich dachte, ich verwende eine schlechte Version von junit oder eine schlechte Version des todsicheren Plugins oder eine Kombination, die nicht passt.

Es war nichts davon: In meinem Projekt hatte ich ein "config" -Modul, das vor dem Modul erstellt wurde, das ich testen wollte. Dieses Modul hatte keine junit-Abhängigkeit -> es hatte keine junit auf dem Klassenpfad ...

Dieser Fehler kann anderen helfen ...

5
Remy

Nicht genau dasselbe, aber mit dem todsicheren Plugin können Testklassen basierend auf dem Dateinamen ausgewählt werden. Sie verwenden Junit Categories jedoch nicht.

Ein Beispiel für die Ausführung von DAO-Tests.

<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