Ich habe einige Tage im Stackoverflow gesucht und versucht, eine ganze Testklasse erneut auszuführen, und nicht nur einen @Test
Schritt. Viele sagen, dass dies mit TestNG nicht unterstützt wird, und IRetryAnalyzer
während einige Problemumgehungen veröffentlicht haben, funktionieren diese nicht wirklich. Hat es jemand geschafft? Und nur um die Gründe dafür zu klären, um Antworten zu vermeiden, die besagen, dass dies nicht absichtlich unterstützt wird: TestNG ist ein Tool nicht nur für Entwickler. Dies bedeutet, dass dies auch von SW-Testern für e2e-Tests verwendet wird. E2e-Tests können Schritte enthalten, die jeweils vom vorherigen abhängen. Ja, es ist gültig, die gesamte Testklasse erneut auszuführen, anstatt einfach @Test
, was einfach über möglich ist IRetryAnalyzer
.
Ein Beispiel für das, was ich erreichen möchte, wäre:
public class DemoTest extends TestBase {
@Test(alwaysRun = true, description = "Do this")
public void testStep_1() {
driver.navigate().to("http://www.stackoverflow.com");
Assert.assertEquals(driver.getCurrentUrl().contains("stackoverflow)"));
}
@Test(alwaysRun = true, dependsOnMethods = "testStep_1", description = "Do that")
public void testStep_2() {
driver.press("button");
Assert.assertEquals(true, driver.elementIsVisible("button"));
}
@Test(alwaysRun = true, dependsOnMethods = "testStep_2", description = "Do something else")
public void testStep_3() {
driver.press("button2");
Assert.assertEquals(true, driver.elementIsVisible("button"));
}
}
Nehmen wir an, das testStep_2
schlägt fehl, ich möchte es erneut ausführen class DemoTest
und nicht nurtestStep_2
quelle
Antworten:
Okay, ich weiß, dass Sie wahrscheinlich eine einfache Eigenschaft wünschen, die Sie in Ihrer @BeforeClass oder ähnlichem angeben können, aber wir müssen möglicherweise warten, bis diese implementiert ist. Zumindest konnte ich es auch nicht finden.
Das Folgende ist höllisch hässlich, aber ich denke, es macht den Job, zumindest in kleinem Maßstab. Es bleibt abzuwarten, wie es sich in komplexeren Szenarien verhält. Vielleicht kann dies mit der Zeit zu etwas Besserem verbessert werden.
Okay, also habe ich eine Testklasse erstellt, die Ihrer ähnlich ist:
Ich habe die
Listener
in der Superklasse nur für den Fall, dass ich dies auf andere Klassen ausweiten möchte, aber Sie können den Listener auch in Ihrer Testklasse einstellen.Drei der 4 oben genannten Methoden haben a
RetryAnalyzer
. Ich habe dastestStep_4
ohne gelassen , um sicherzustellen, dass das, was ich als nächstes mache, den Rest der Ausführung nicht beeinträchtigt. SaidRetryAnalyzer
wird nicht wirklich Wiederholungs (beachten Sie, dass die Methode zurückgibtfalse
), aber es wird folgendes tun:Dadurch wird eine Ausführung innerhalb Ihrer Ausführung erstellt. Der Bericht wird nicht durcheinander gebracht, und sobald er fertig ist, wird Ihre Hauptausführung fortgesetzt. Aber es wird die Methoden innerhalb dieser Gruppe "wiederholen".
Ja, ich weiß, ich weiß. Dies bedeutet, dass Sie Ihre Testsuite für immer in einer ewigen Schleife ausführen werden. Deshalb die
RetryAnnotationTransformer
. Darin entfernen wir den RetryAnalyzer aus der zweiten Ausführung dieser Tests:Jetzt haben wir das letzte unserer Probleme. Unsere ursprüngliche Testsuite weiß nichts über diese "Wiederholungsausführung" dort. Hier wird es wirklich hässlich. Wir müssen unserem Reporter erzählen, was gerade passiert ist. Und das ist der Teil, den ich Sie ermutige, sich zu verbessern. Mir fehlt die Zeit, um etwas Schöneres zu tun, aber wenn ich kann, werde ich es irgendwann bearbeiten.
Zunächst müssen wir wissen, ob die Ausführung von retryTestNG erfolgreich war. Es gibt wahrscheinlich eine Million Möglichkeiten, dies besser zu machen, aber im Moment funktioniert dies. Ich habe einen Listener nur für die Wiederholung der Ausführung eingerichtet. Sie können es
TestRetry
oben sehen und es besteht aus folgenden Elementen:Jetzt wird der Listener der Hauptsuite, den Sie oben in der Superklasse gesehen
TestConfig
haben, sehen, ob der Lauf stattgefunden hat und ob er gut gelaufen ist, und den Bericht aktualisieren:Der Bericht sollte nun 3 bestandene Tests (da sie wiederholt wurden) und einen fehlgeschlagenen Test anzeigen, da er nicht Teil der anderen 3 Tests war:
Ich weiß, dass es nicht das ist, wonach Sie suchen, aber ich helfe Ihnen, bis Sie die Funktionalität zu TestNG hinzufügen.
quelle