Reihenfolge der Ausführung von Tests in TestNG


76

Wie kann ich die Reihenfolge der Ausführung von Tests in TestNG anpassen?

Zum Beispiel:

public class Test1 {
  @Test
  public void test1() {
      System.out.println("test1");
  }

  @Test
  public void test2() {
      System.out.println("test2");
  }

  @Test
  public void test3() {
      System.out.println("test3");
  }
}

In der obigen Suite ist die Reihenfolge der Ausführung von Tests beliebig. Für eine Ausführung kann die Ausgabe sein:

test1
test3
test2

Wie führe ich die Tests in der Reihenfolge aus, in der sie geschrieben wurden?

Antworten:


84

Das wird funktionieren.

@Test(priority=1)
public void Test1() {

}

@Test(priority=2)
public void Test2() {

}

@Test(priority=3)
public void Test3() {

}

priorityfördert die Ausführungsreihenfolge, garantiert jedoch nicht, dass die vorherige Prioritätsstufe abgeschlossen wurde. test3könnte beginnen, bevor test2abgeschlossen ist. Wenn eine Garantie benötigt wird, deklarieren Sie eine Abhängigkeit.

Im Gegensatz zu den Lösungen, die Abhängigkeiten deklarieren, werden Tests, die verwendet prioritywerden, auch dann ausgeführt, wenn ein Test fehlschlägt. Dieses Problem mit Abhängigkeiten kann @Test(...alwaysRun = true...)laut Dokumentation umgangen werden .


65

In TestNG verwenden Sie abhängige Methoden und / oder abhängige Gruppen:

@Test(groups = "a")
public void f1() {}

@Test(groups = "a")
public void f2() {}

@Test(dependsOnGroups = "a")
public void g() {}

In diesem Fall wird g () erst ausgeführt, nachdem f1 () und f2 () abgeschlossen und erfolgreich waren.

In der Dokumentation finden Sie viele Beispiele: http://testng.org/doc/documentation-main.html#test-groups


Die Lösung von Cedric weist jedoch einige Nachteile bei der Arbeit mit dem TestNG Eclipse Plugin auf. 5.9.0.4, da vor jedem TestCase-Lauf die Meldung angezeigt wird, dass Gruppen von diesem Plugin nicht unterstützt werden.
Honzajde

1
dependsOnGroupsist äußerst nützlich, aber es scheint mir, dass TestNG ignoriert, prioritywenn beide miteinander kombiniert werden.
G. Demecki

29

Um ein bestimmtes Szenario anzusprechen:

@Test
public void Test1() {

}

@Test (dependsOnMethods={"Test1"})
public void Test2() {

}

@Test (dependsOnMethods={"Test2"})
public void Test3() {

}

7

Wenn Sie die @Test(priority = )Option in TestNG nicht verwenden möchten , können Sie die Javaassist- Bibliothek und die TestNGs verwenden IMethodInterceptor, um die Tests in der Reihenfolge zu priorisieren, in der die Testmethoden in der Testklasse definiert sind. Dies basiert auf der hier bereitgestellten Lösung .

Fügen Sie diesen Listener Ihrer Testklasse hinzu:

package cs.jacob.listeners;

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.NotFoundException;

import org.testng.IMethodInstance;
import org.testng.IMethodInterceptor;
import org.testng.ITestContext;

public class PriorityInterceptor implements IMethodInterceptor {
    public List<IMethodInstance> intercept(List<IMethodInstance> methods, ITestContext context) {

    Comparator<IMethodInstance> comparator = new Comparator<IMethodInstance>() {
        private int getLineNo(IMethodInstance mi) {
        int result = 0;

        String methodName = mi.getMethod().getConstructorOrMethod().getMethod().getName();
        String className  = mi.getMethod().getConstructorOrMethod().getDeclaringClass().getCanonicalName();
        ClassPool pool    = ClassPool.getDefault();

        try {
            CtClass cc        = pool.get(className);
            CtMethod ctMethod = cc.getDeclaredMethod(methodName);
            result            = ctMethod.getMethodInfo().getLineNumber(0);
        } catch (NotFoundException e) {
            e.printStackTrace();
        }

        return result;
        }

        public int compare(IMethodInstance m1, IMethodInstance m2) {
        return getLineNo(m1) - getLineNo(m2);
        }
    };

    IMethodInstance[] array = methods.toArray(new IMethodInstance[methods.size()]);
    Arrays.sort(array, comparator);
    return Arrays.asList(array);
    }
}

Dies ermittelt im Wesentlichen die Zeilennummern der Methoden und sortiert sie nach aufsteigender Reihenfolge ihrer Zeilennummer, dh nach der Reihenfolge, in der sie in der Klasse definiert sind.


1
Dies ist die echte Lösung, wenn Sie ein paar Hundert Tests von junit
Vitali Carbivnicii

Dies löst das Problem der Beibehaltungsreihenfolge für den Fall, dass Sie das Abhängigkeitsflag im Code nicht verwenden.
Ankit Gupta

6
@Test(dependsOnMethods="someBloodyMethod")

3
Ich möchte darauf hinweisen, dass dies keine besonders hilfreiche Antwort ist - ich schlage vor, Ihre Antworten etwas detaillierter zu erweitern!

6

Benutze das:

public class TestNG
{
        @BeforeTest
        public void setUp() 
        {
                   /*--Initialize broowsers--*/

        }

        @Test(priority=0)
        public void Login() 
        {

        }

        @Test(priority=2)
        public void Logout() 
        {

        }

        @AfterTest
        public void tearDown() 
        {
                //--Close driver--//

        }

}

Normalerweise bietet TestNG eine Reihe von Anmerkungen, die wir @BeforeSuite, @BeforeTest, @BeforeClasszum Initialisieren von Browsern / Setups verwenden können.

Wir können Priorität zuweisen, wenn Sie eine Anzahl von Testfällen in Ihr Skript geschrieben haben und gemäß der zugewiesenen Priorität ausführen möchten. Verwenden Sie dann: @Test(priority=0)ab 0,1,2,3 ....

In der Zwischenzeit können wir die Anzahl der Testfälle gruppieren und durch Gruppierung ausführen. dafür werden wir verwenden@Test(Groups='Regression')

Am Ende können wir wie beim Schließen der Browser @AfterTest, @AfterSuite, @AfterClassAnmerkungen verwenden.


4

Wenn ich Ihre Frage richtig verstehe, indem Sie Tests in einer bestimmten Reihenfolge ausführen möchten, kann TestNG IMethodInterceptor verwendet werden. Unter http://beust.com/weblog2/archives/000479.html erfahren Sie, wie Sie diese nutzen können.

Wenn Sie eine Vorinitialisierung durchführen möchten, besuchen Sie IHookable http://testng.org/javadoc/org/testng/IHookable.html und den zugehörigen Thread http://groups.google.com/group/testng-users/browse_thread/. thread / 42596505990e8484 / 3923db2f127a9a9c? lnk = gst & q = IHookable # 3923db2f127a9a9c


2

Huckepack von der Antwort von user1927494: Wenn Sie einen einzelnen Test vor allen anderen ausführen möchten, können Sie Folgendes tun:

@Test()
public void testOrderDoesntMatter_1() {
}

@Test(priority=-1)
public void testToRunFirst() {
}

@Test()
public void testOrderDoesntMatter_2() {
}

2

Durch Angabe der Testmethoden, die in testNg.xml ausgeführt werden sollen, können die Testfälle in der gewünschten Reihenfolge ausgeführt werden

<suite>
<test name="selenium1">
 		<classes>
			<class name="com.test.SeleniumTest" >
			    <methods><include name="methodB"></include>
			        <include name="methodA"></include>
			    </methods>    
			 </class>
		</classes>
 
	</test>
</suite>


1

Durch Verwendung des Prioritätsparameters für @Test können wir die Reihenfolge der Testausführung steuern.


2
Leider nicht in TestNG.
Mariusz Jamro

@MariuszJamro Ich verstehe nicht warum? PriorityParameter gab es 2012 noch nicht?
G. Demecki

1

Die Reihenfolge der Methoden in der Klassendatei ist nicht vorhersehbar. Sie müssen daher entweder Abhängigkeiten verwenden oder Ihre Methoden explizit in XML aufnehmen.

Standardmäßig führt TestNG Ihre Tests in der Reihenfolge aus, in der sie in der XML-Datei enthalten sind. Wenn Sie möchten, dass die in dieser Datei aufgeführten Klassen und Methoden in einer unvorhersehbaren Reihenfolge ausgeführt werden, setzen Sie das Attribut keep-order auf false


1

Ich habe das gleiche Problem festgestellt. Der mögliche Grund liegt in der parallelen Ausführung von testng. Die Lösung besteht darin, die Option "Priorität" hinzuzufügen oder einfach die Datei "keep-order =" true "in Ihrer Datei" testng.xml "zu aktualisieren.

<test name="Firefox Test" preserve-order="true">

1
erve-order = "true" ist die Standardeinstellung in testng.xml und funktioniert nur für die Reihenfolge, die Sie in testng.xml definiert haben. Die Lösung für Ihr Problem fügt also nur @Tests Priorität hinzu
Kiran

1

Eine Antwort mit einer wichtigen Erklärung:

Es gibt zwei Parameter von " TestNG ", die die Reihenfolge der Ausführung der Tests bestimmen sollen:

@Test(dependsOnGroups= "someGroup")

Und:

@Test(dependsOnMethods= "someMethod")

In beiden Fällen hängen diese Funktionen von der Methode oder Gruppe ab.

Aber die Unterschiede:

In diesem Fall:

@Test(dependsOnGroups= "someGroup")

Die Methode ist von der gesamten Gruppe abhängig, sodass diese Methode nicht unbedingt unmittelbar nach der Ausführung der abhängigen Funktion ausgeführt wird. Sie kann jedoch später im Lauf und sogar nach anderen Testläufen auftreten.

Es ist wichtig zu beachten, dass für den Fall, dass dieser Parameter mehr als eine Verwendung innerhalb derselben Testgruppe enthält, dies ein sicheres Rezept für Probleme ist, da die abhängigen Methoden der gesamten Testgruppe zuerst und erst dann ausgeführt werden Methoden, die von ihnen abhängen.

In diesem Fall jedoch:

@Test(dependsOnMethods= "someMethod")

Selbst wenn dieser Parameter innerhalb derselben Testgruppe mehrmals verwendet wird, wird die abhängige Methode weiterhin ausgeführt, nachdem die abhängige Methode sofort ausgeführt wurde.

Hoffe es ist klar und hilf.


0

Es gibt Möglichkeiten, Tests in einer bestimmten Reihenfolge auszuführen. Normalerweise müssen Tests jedoch wiederholbar und unabhängig sein, um sicherzustellen, dass nur die gewünschte Funktionalität getestet wird und nicht von Nebenwirkungen des Codes außerhalb der getesteten Funktionen abhängig ist.

Um Ihre Frage zu beantworten, müssen Sie weitere Informationen bereitstellen, z. B. WARUM es wichtig ist, Tests in einer bestimmten Reihenfolge auszuführen.


19
Es gibt viele Situationen, in denen Abhängigkeiten nützlich sind, insbesondere für die Integration und Funktionstests. Beispiel: Testen einer Website: Sie möchten zuerst die Anmeldeseite und dann die nächste Seite usw. testen. Das ständige Löschen und Wiederherstellen des Status von Grund auf ist unpraktisch und führt zu sehr langsamen Tests. Abhängigkeiten bieten Ihnen auch eine viel bessere Diagnose, z. B. "1 Test fehlgeschlagen, 99 Tests übersprungen" anstelle der herkömmlichen "100 Tests fehlgeschlagen". Dies hilft nicht zu erkennen, dass all diese Fehler tatsächlich darauf zurückzuführen sind, dass ein Test fehlgeschlagen ist.
Cedric Beust

0

Falls Sie zusätzliche Dinge wie verwenden dependsOnMethods, möchten Sie möglicherweise den gesamten @ Test-Fluss in Ihrer testng.xml-Datei definieren. AFAIK, die in Ihrer Suite-XML-Datei (testng.xml) definierte Reihenfolge überschreibt alle anderen Bestellstrategien.


0

Verwenden Sie: keep-order = "true" enabled = "true", um Testfälle in der von Ihnen geschriebenen Weise auszuführen.

<suite name="Sanity" verbose="1" parallel="" thread-count="">   
<test name="Automation" preserve-order="true"  enabled="true">
        <listeners>
            <listener class-name="com.yourtest.testNgListner.RetryListener" />
        </listeners>
        <parameter name="BrowserName" value="chrome" />
        <classes>
            <class name="com.yourtest.Suites.InitilizeClass" />
            <class name="com.yourtest.Suites.SurveyTestCases" />
            <methods>
                <include name="valid_Login" />
                <include name="verifyManageSurveyPage" />
                <include name="verifySurveyDesignerPage" />
                <include name="cloneAndDeleteSurvey" />
                <include name="createAndDelete_Responses" />
                <include name="previewSurvey" />
                <include name="verifySurveyLink" />
                <include name="verifySurveyResponses" />
                <include name="verifySurveyReports" />
            </methods>
        </classes>
    </test>
</suite>

-5

Tests wie Unit-Tests? Wozu? Tests MÜSSEN unabhängig sein, sonst können Sie einen Test nicht einzeln durchführen. Wenn sie unabhängig sind, warum überhaupt eingreifen? Plus - was ist eine "Bestellung", wenn Sie sie in mehreren Threads auf mehreren Kernen ausführen?


2
Es ist tatsächlich durchaus möglich, Abhängigkeiten und Parallelität zu mischen. Schauen Sie sich diesen Artikel an, um herauszufinden, wie TestNG dies tut: beust.com/weblog/2009/11/28/hard-core-multicore-with-testng
Cedric Beust

Menschen verwenden JUnit für viele andere Dinge als Unit-Tests. Fast alle diese zusätzlichen Anwendungen haben Zeiten, in denen Sie Dinge in einer bestimmten Reihenfolge erledigen müssen. Dies ist eine der wichtigsten Gründe für die Entwicklung von TestNG, BTW.
Jeffiekins
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.