2017-02-22 5 views
2

Ich möchte meine Tests gefiltert nach Methoden sowie Gruppen durchführen. Ist das in TestNG möglich?TestNG Ausführung von Methoden sowie Gruppen

Zum Beispiel. Ich habe unter zwei TestNG-Klassen mit zwei Methoden.

Class - SampleJ1 
Methods - Test1(group=sanity), Test2(group=regression), Test3, Test4, Test5 
Class - SampleJ2 
Methods - Test1(group=sanity), Test2(group=regression), Test3, Test4, Test5 

Mein Automatisierungsframework generiert TestNG XML-Datei. Wenn ich eine XML-Datei mit den folgenden Daten erstelle, sollte sie nur die Sicherheitsgruppe der erwähnten Methoden ausführen.

<groups> 
    <run> 
    <include name="sanity" /> 
    </run> 
</groups> 
<test thread-count="12" name="Browser"> 
    <classes> 
    <class name="SampleJ1"> 
     <include method="Test1"/> 
     <include method="Test2"/> 
     <include method="Test3"/> 
     <include method="Test4"/> 
    </class> 
    <class name="SampleJ2"> 
     <include method="Test1"/> 
     <include method="Test2"/> 
     <include method="Test3"/> 
     <include method="Test4"/> 
    </class> 
    </classes> 
</test> 

Bitte lassen Sie mich wissen, wenn dies möglich ist.

+0

Was ist das erwartete Verhalten? Ihre aktuelle Suite-Datei enthält alles, also wird alles ausgeführt. – juherr

+0

Ya. Tatsächlich wird es ausführen, was auch immer die Methoden, die ich eingeschlossen habe. ODER, es wird ausführen, was immer die Gruppen, die ich erwähnt habe. Meine Frage ist, gibt es eine Möglichkeit, beides zu mischen? Hier in diesem Beispiel möchte ich nur die Gruppensanität für die Methoden ausführen, die ich eingeschlossen habe. – Jeyabal

+0

@Jeyabal, benutzt du Maven? –

Antwort

0

Soweit ich verstehe, möchten Sie Testmethoden filtern, die nach ihren Namen und Gruppen ausgeführt werden, zu denen sie gehören. Erstens gibt es dafür im reinen TestNG keine spezielle Lösung (sonst hätten einige TestNG-Experten wie @juherr geantwortet). Das Überspringen von Testmethoden mit einer Implementierung des InvokedMethodListener würde Protokolle hinterlassen, die Sie wahrscheinlich nicht möchten.

Ich sehe zwei Möglichkeiten.

In der ersten könnten Sie eine @Factory Methode implementieren, die Ihre Testklassen mit Set<Method> oder Set<String> als Konstruktor Parameter instanziieren könnte. In jeder Ihrer Testklassen würden Sie überprüfen, ob die auszuführende Methode (oder ihre String Darstellung) in der Set ist. @Before annotiert oder beforeInvocation Methoden würde die Logik behandeln, ob bestimmte Methode ausgeführt wird oder nicht. Darüber hinaus würde testng.xml<groups> Elemente angeben, die ausgeführt werden sollen. Dies kann wiederum den Nachteil haben, Skipped: x in Ihren Protokollen und Berichten zu hinterlassen. Die zweite Option wäre, Maven zusammen mit seiner Surefire Plugin gut zu nutzen. (Wenn Sie kein Build-Tool wie Gradle oder Maven verwenden, sollten Sie es sicher versuchen). Wenn Sie mit Maven testen, können Sie angeben, welche Gruppen und welche Testmethoden ausgeführt werden sollen. Ihre pom.xml sollte ähnlich wie folgt gestaltet sein:

<!-- modelVersion, groupId, etc. --> 
<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-surefire-plugin</artifactId> 
      <version>2.19.1</version> 
      <configuration> 
       <suiteXmlFiles> 
        <suiteXmlFile>src/test/resources/testng.xml</suiteXmlFile> 
       </suiteXmlFiles> 
      </configuration> 
     </plugin> 
     <!-- (...) --> 
    </plugins> 
    <!-- (...) --> 
</build> 
<dependencies> 
    <dependency> 
     <groupId>org.testng</groupId> 
     <artifactId>testng</artifactId> 
     <version>6.10</version> 
    </dependency> 
    <!-- (...) --> 
</dependencies> 

Sag mal, haben Sie eine Test-Klasse wie folgt aus:

public class TestClass { 

    @Test(groups = {"firstGroup"}) 
    public void firstMethod(Method method) { 
     assertEquals(1, 1); 
     System.out.println(method.getName()); 
    } 

    @Test(groups = {"secondGroup"}) 
    public void secondMethod(Method method) { 
     assertEquals(1, 1); 
     System.out.println(method.getName()); 
    } 

    @Test(groups = {"secondGroup"}) 
    public void thirdMethod(Method method) { 
     assertEquals(1, 1); 
     System.out.println(method.getName()); 
    } 

    @Test(groups = {"secondGroup"}) 
    public void fourthMethod(Method method) { 
     assertEquals(1, 1); 
     System.out.println(method.getName()); 
    } 
} 

In Ihrem testng.xml können Sie die Informationen platzieren, die Gruppen auszuführen:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> 
<suite name="Default Suite Name"> 
    <groups> 
     <run> 
      <include name="secondGroup"/> 
     </run> 
    </groups> 
    <test name="Default Test Name"> 
     <classes> 
      <class name="TestClass"/> 
     </classes> 
    </test> 
</suite> 

und führen dann ein Maven Ziel zu entscheiden, welche Methoden, die Sie ausführen:

mvn clean -Dtest=TestClass#thirdMethod+secondMethod test 

Syntax für mehrere Methoden und mehrere Klassen finden Sie here.
Ausgang:

Running TestClass 
secondMethod 
thirdMethod 
Tests run: 2, Failures: 0, Errors: 0, Skipped: 0 

Das vierte Verfahren wurde nicht ausgeführt, auch wenn es zum secondGroup gehört. Wenn es viele Methoden zum Ausführen gibt, können Sie ein benutzerdefiniertes Bash-Skript dafür schreiben.

Es war (zumindest für mich) nicht möglich, Gruppen mit Maven und Methoden mit TestNG zu filtern.

+0

Vielen Dank für solch eine detaillierte Erklärung. – Jeyabal

Verwandte Themen