Frage

Gibt es eine Möglichkeit zu Gruppentests in JUnit, so dass ich nur ein paar Gruppen laufen kann?

Oder ist es möglich, einige Tests mit Anmerkungen versehen und sie dann global deaktivieren?

Ich bin mit JUnit 4 , kann ich TestNG nicht verwendet werden.

Bearbeiten @RunWith und @SuiteClasses funktioniert super. Aber ist es möglich, wie dies nur einige Tests in Testklasse mit Anmerkungen zu versehen? Oder muss ich ganze Testklasse mit Anmerkungen versehen?

War es hilfreich?

Lösung

Möchten Sie Gruppentests in einer Testklasse oder möchten Sie Gruppentestklassen? Ich werde diese zu übernehmen.

Es hängt davon ab, wie Sie Ihre Tests ausgeführt werden. Wenn Sie sie von Maven ausführen, ist es möglich, genau zu bestimmen, welche Tests Sie einschließen möchten. Siehe die Maven todsichere Dokumentation für diese.

Generell aber, was ich tue, ist, dass ich einen Baum von Testsuiten haben. Eine Testsuite in JUnit 4 sieht etwa so aus:

 @RunWith(Suite.class)
 @SuiteClasses(SomeUnitTest1.class, SomeUnitTest2.class)
 public class UnitTestsSuite {
 }
So

, vielleicht habe ich eine FunctionTestsSuite und UnitTestsSuite und dann eine AllTestsSuite, die die beiden anderen einschließt. Wenn Sie sie in Eclipse laufen bekommen Sie eine sehr schöne hierarchische Ansicht.

Das Problem bei diesem Ansatz ist, dass es eine Art langweilig ist, wenn Sie Tests schneiden in mehr als eine andere Art und Weise wollen. Aber es ist immer noch möglich (man kann zum Beispiel eine Reihe von Suiten, die auf Modul scheibe basiert, dann ein anderes Aufschneiden von der Art der Prüfung).

Andere Tipps

JUnit 4.8 unterstützt die Gruppierung:

public interface SlowTests {}
public interface IntegrationTests extends SlowTests {}
public interface PerformanceTests extends SlowTests {}

Und dann ...

public class AccountTest {

    @Test
    @Category(IntegrationTests.class)
    public void thisTestWillTakeSomeTime() {
        ...
    }

    @Test
    @Category(IntegrationTests.class)
    public void thisTestWillTakeEvenLonger() {
        ...
    }

    @Test
    public void thisOneIsRealFast() {
        ...
    }
}

Und schließlich

@RunWith(Categories.class)
@ExcludeCategory(SlowTests.class)
@SuiteClasses( { AccountTest.class, ClientTest.class })
public class UnitTestSuite {}

von hier genommen: https : //github.com/weld/core/blob/master/tests-arquillian/src/test/java/org/jboss/weld/tests/Categories.java

den global deaktivieren sie, JUnit zu behandeln (4.5+) hat zwei Möglichkeiten, eine ist die neue Methode assumeThat zu verwenden. Wenn Sie setzen, dass in der @BeforeClass (oder der @Before) eine Testklasse, und wenn die Bedingung fehlschlägt, wird es den Test ignorieren. In dem Zustand, können Sie eine Systemeigenschaft oder etwas anderes setzen, die ein- oder ausgeschaltet werden global kann.

Die andere Alternative ist einen benutzerdefinierten Läufer zu schaffen, das die globale Eigenschaft und Delegierten den entsprechenden Läufer versteht. Dieser Ansatz ist viel spröder (da die JUnit4 Innenläufer instabil sind und von Version Version geändert werden), aber es hat den Vorteil, dass eine Klassenhierarchie vererbt wird nach unten und in einer Unterklasse überschrieben werden. Es ist auch die einzige realistische Möglichkeit, dies zu tun, wenn Sie ältere JUnit38 Klassen unterstützen.

Hier ist ein Code der benutzerdefinierten Runner zu tun. In Bezug auf etwas getAppropriateRunnerForClass tun könnte, war die Art, wie ich es implementiert eine separate Anmerkung zu haben, die den benutzerdefinierten Läufer sagt, was mit laufen. Die einzige Alternative war eine sehr spröde Kopie Paste aus dem JUnit-Code.

private class CustomRunner implements Runner
 private Runner runner;

    public CustomRunner(Class<?> klass, RunnerBuilder builder) throws Throwable {
        if (!isRunCustomTests()) {
            runner = new IgnoredClassRunner(klass);
        } else {
            runner = getAppropriateRunnerForClass(klass, builder);
    }

    public Description getDescription() {
        return runner.getDescription();
    }

    public void run(RunNotifier notifier) {
        runner.run(notifier);
    }
}

EDIT: Der @RunWith Tag nur für eine ganze Klasse arbeitet. Ein Weg, um diese begrenz- zu arbeiten, ist die Testverfahren in eine statische innere Klasse zu bewegen und das mit Anmerkungen versehen. Auf diese Weise haben Sie den Vorteil der Anmerkung mit der Organisation der Klasse. Aber das tun wird nicht mit @Before oder @BeforeClass Tags helfen, werden Sie die in der inneren Klasse neu erstellen müssen. Es kann die äußere Klasse Methode nennen, aber es müsste seine eigene Methode als Haken haben.

Versuchen Sie JUnit Testgruppen . Aus der Dokumentation:

@TestGroup("integration")
public class MyIntegrationTest {
   @ClassRule
   public static TestGroupRule rule = new TestGroupRule();

   ...
}
  • Führen Sie eine einfache Testgruppe: -Dtestgroup = Integration
  • Ausführen mehrere Testgruppen: -Dtestgroup = Gruppe1, group2
  • Führen Sie alle Testgruppen: -Dtestgroup = all

In JUnit 5 können Sie @Tag für Filtertests, entweder in der Klasse oder Methode Ebene erklären; analoge Gruppen in TestNG oder Kategorien in JUnit 4 zu testen

Von den javadoc :

  

Tags werden verwendet, zu filtern, welche Tests für einen bestimmten Test durchgeführt werden   planen. Zum Beispiel kann ein Entwicklungsteam Tests mit Werten markiert solche   als „schnell“, „langsam“, „ci-Server“ usw. und dann eine Liste von Tags liefern zu   für den aktuellen Testplan verwendet werden, abhängig potenziell auf dem   aktuelle Umgebung.

Zum Beispiel könnten Sie eine Testklasse mit einem "slow" @Tag erklären, die für alle Methoden geerbt werden und es für einige Methoden außer Kraft setzen, wenn erforderlich:

import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;

@Tag("slow") 
public class FooTest{

   // 
   @Test
   void loadManyThings(){ 
        ...
   }

   @Test
   void loadManyManyThings(){ 
        ...
   }


   @Test
   @Tag("fast")
   void loadFewThings(){ 
        ...
   }

}

Sie könnten die gleiche Logik für andere Testklassen.
Auf diese Weise Testklassen (und Methoden zu) gehören zu einem bestimmten Tag.

Als gute Praxis statt Kopieren und Einfügen von @Tag("fast") und @Tag("slow") in den Testklassen können Sie benutzerdefinierte Annotationen zusammengesetzt erstellen.
Zum Beispiel:

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.junit.jupiter.api.Tag;

@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Tag("slow")
public @interface Slow {
}

und verwenden Sie es als:

@Test
@Slow
void slowProcessing(){ 
    ...
}   

So aktivieren oder Test mit einem bestimmten Tag während der Text Ausführung markiert deaktivieren können Sie auf der maven-todsichere-Plugin Dokumentation :

  

Um auch Tags oder Tag-Ausdrücke, Verwendung groups.

     

Um Tags oder Tag-Ausdrücke auszuschließen, verwenden entweder excludedGroups.

konfigurieren Sie einfach Ihre pom.xml das Plugin entsprechend Ihrer Anforderung (Beispiel des doc):

 <build>
     <plugins>
         ...
         <plugin>
             <groupId>org.apache.maven.plugins</groupId>
             <artifactId>maven-surefire-plugin</artifactId>
             <version>2.22.0</version>
             <configuration>
                 <groups>acceptance | !feature-a</groups>
                 <excludedGroups>integration, regression</excludedGroups>
             </configuration>
         </plugin>
     </plugins> 
</build> 

Zur Information: Die Testziel Dokumentation ist Nicht aktualisiert.

können Sie erstellen Test Suite Objekte, die Gruppen enthalten, von Tests. Alternativ können Sie die IDE (zB Eclipse) Unterstützung für das Ausführen alle Tests in einem bestimmten Paket enthalten haben.

Sie können Test-Suite verwenden ( http: //qaautomated.blogspot.in/2016/09/junit-test-suits-and-test-execution.html ) oder Sie können Junit Kategorien ( http://qaautomated.blogspot.in/2016/09/junit-categories.html ) für effektiv Ihre Testfälle zu gruppieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top