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.
Was ist das erwartete Verhalten? Ihre aktuelle Suite-Datei enthält alles, also wird alles ausgeführt. – juherr
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
@Jeyabal, benutzt du Maven? –