2010-04-19 13 views
58

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

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, die Reihenfolge der Ausführung von Tests ist beliebig. Für eine Ausführung kann der Ausgang sein:

test1 
test3 
test2 

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

Antwort

-5

Tests wie Komponententests? Wozu? Tests MÜSSEN unabhängig sein, sonst ... Sie können keinen Test einzeln ausführen. Wenn sie unabhängig sind, warum stören sie überhaupt? Plus - Was ist eine "Bestellung", wenn Sie sie in mehreren Threads auf mehreren Kernen ausführen?

+2

Es ist eigentlich durchaus möglich, Abhängigkeiten und Parallelität zu mischen, werfen Sie einen Blick auf diesen Artikel, um herauszufinden, wie TestNG es tut: http: // beust.com/weblog/2009/11/28/hardcore-multicore-mit-testng/ –

+0

Die Leute benutzen JUnit für viele Dinge außer Unit-Tests. Fast alle diese zusätzlichen Anwendungen haben Zeiten, in denen Sie Dinge in einer bestimmten Reihenfolge tun müssen. Dies ist eine der Hauptgründe für die Entwicklung von TestNG, BTW. – Jeffiekins

0

Es gibt Möglichkeiten, Tests in einer bestimmten Reihenfolge auszuführen. Normalerweise müssen Tests jedoch wiederholbar und unabhängig sein, um zu garantieren, dass sie nur die gewünschte Funktionalität testen und nicht von Nebeneffekten des Codes abhängig sind, die außerhalb des Tests liegen.

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

+16

Es gibt viele Situationen, in denen Abhängigkeiten nützlich sind, insbesondere für die Integration und das Funktionstesten. Zum Beispiel, testen Sie eine Website: Sie möchten zuerst die Anmeldeseite und dann die nächste Seite usw. testen ... Das Löschen und Wiederherstellen des Zustands von Grund auf ist unpraktisch und führt zu sehr langsamen Tests. Auch Abhängigkeiten geben Ihnen viel bessere Diagnose, wie "1 Test fehlgeschlagen, 99 Tests übersprungen" anstelle der traditionellen "100 Tests fehlgeschlagen", die nicht hilft zu erkennen, dass alle diese Fehler tatsächlich sind, weil ein Test fehlgeschlagen ist. –

52

In TestNG, verwenden Sie dependsOnMethods und/oder dependsOnGroups:

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

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

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

In diesem Fall g() wird erst nach f1 laufen() und f2() abgeschlossen haben und es gelang ihm.

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

+1

'dependsOnGroups' ist sehr nützlich, aber es scheint mir, dass TestNG 'Priorität' ignoriert, wenn beide zusammen kombiniert werden. –

+0

Cedrics Lösung hat jedoch einige Nachteile beim Arbeiten mit dem TestNG Eclipse Plugin, ver. 5.9.0.4 wie es vor jeder Ausführung des Testfalles angezeigt wird, wird angezeigt, dass Gruppen von diesem Plugin nicht unterstützt werden. – honzajde

4

Wenn ich Ihre Frage richtig, dass Sie verstehen Tests in einer bestimmten Reihenfolge ausgeführt werden soll, TestNG IMethodInterceptor verwendet werden kann. Werfen Sie einen Blick auf http://beust.com/weblog2/archives/000479.html, wie Sie sie nutzen können.

Wenn Sie etwas Vorinitialisierung ausführen möchten, werfen Sie einen Blick auf IHookable http://testng.org/javadoc/org/testng/IHookable.html und zugehörige Thread http://groups.google.com/group/testng-users/browse_thread/thread/42596505990e8484/3923db2f127a9a9c?lnk=gst&q=IHookable#3923db2f127a9a9c

1

Durch Priorität Paramenter mit für @Test wir die Reihenfolge der Testausführung steuern.

+2

Leider nicht in TestNG. –

+0

@MariuszJamro Ich verstehe nicht warum? Parameter "Priorität" gab es 2012 noch nicht? –

4
@Test(dependsOnMethods="someBloodyMethod") 
+3

Ich möchte darauf hinweisen, dass dies keine besonders hilfreiche Antwort ist - ich schlage vor, die Antworten etwas ausführlicher zu erläutern! – Zyerah

19

bestimmtes Szenario in Frage zu beantworten:

@Test 
public void Test1() { 

} 

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

} 

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

} 
60

Dies funktioniert.

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

} 

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

} 

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

} 

priority fördert Auftragsausführung garantiert aber nicht die vorherige Prioritätsstufe abgeschlossen hat. test3 könnte beginnen, bevor test2 abgeschlossen wird. Wenn eine Garantie erforderlich ist, deklarieren Sie eine Abhängigkeit.

Im Gegensatz zu den Lösungen, die Abhängigkeiten deklarieren, werden Tests ausgeführt, die priority verwenden, auch wenn ein Test fehlschlägt. Dieses Problem mit Abhängigkeiten kann mit @Test(...alwaysRun = true...) nach documentation gelöst werden.

1

Piggy aus der von user1927494 Antwort sichern, Falls Sie einen einzigen Test vor allen anderen ausführen möchten, können Sie dies tun:

@Test() 
public void testOrderDoesntMatter_1() { 
} 

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

@Test() 
public void testOrderDoesntMatter_2() { 
} 
3

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

Fügen Sie diese Zuhörer auf Ihre Testklasse:

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); 
    } 
} 

Diese im Grunde die Zeilennummern der Methoden findet und sortiert sie nach der Reihenfolge ihrer Zeilennummer, dh die Reihenfolge aufsteigend, durch die sie in die definiert sind Klasse.

+1

Dies ist die echte Lösung, wenn Sie ein paar Hunderte von Tests von junit migrieren müssen – realcnbs

1

mit den Testmethoden Angeben in testNg.xml ausgeführt werden wir die Testfälle in gewünschter Reihenfolge

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

1

Die Reihenfolge der Methoden in der Klassendatei ist unberechenbar ausführen kann, so dass Sie Sie müssen entweder Abhängigkeiten verwenden oder Ihre Methoden explizit in XML einschließen.

Standardmäßig führt TestNG Ihre Tests in der Reihenfolge durch, in der sie in der XML-Datei enthalten sind. Wenn Sie die Klassen und Methoden in dieser Datei aufgelistet werden sollen in einer unpredictible Reihenfolge ausgeführt werden, stellen die wahren Ordnung

4

Verwendung auf false führen dies:

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 liefert TestNG Anzahl der Anmerkungen, Wir können @BeforeSuite, @BeforeTest, @BeforeClass für die Initialisierung von Browsern/Setup verwenden.

Wir können Priorität zuweisen, wenn Sie Anzahl der Testfälle in Ihrem Skript geschrieben haben, und wollen als pro zugewiesenen Priorität auszuführen dann verwenden: @Test(priority=0) ab 0,1,2,3 ....

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

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

1

Ich habe das gleiche Problem konfrontiert, der mögliche Grund ist aufgrund der parallelen Ausführung von Tests und die Lösung besteht darin, Priority Option hinzufügen oder einfach preserve-order = "true" in Ihrer testng.xml zu aktualisieren.

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

preserve-order = "true", ist standardmäßig in testng.xml und es funktioniert nur für die Reihenfolge, die Sie nur in testng.xml definiert Lösung für Ihr Problem fügt nur @Tests Priorität hinzu – Kiran

0

Falls Sie passieren wie dependsOnMethods zusätzliches Material zu verwenden, sollten Sie den gesamten @Test Fluss in Ihrer testng.xml Datei definieren. AFAIK, die in Ihrer XML-Suite-Datei (testng.xml) definierte Reihenfolge überschreibt alle anderen Bestellstrategien.

Verwandte Themen