Wiederholung fehlgeschlagener Tests in TestNG

In diesem Beitrag erfahren Sie, wie Sie fehlgeschlagene Testfälle mit TestNG wiedergeben können. Wir werden zwei Ansätze untersuchen, um dies zu erreichen, nämlich die Verwendung der Datei testng-failed.xml und die Implementierung des testNG IRetryAnalyzer.
Inhaltsübersicht
Neustart fehlgeschlagener Tests mit der Datei testng-failed.xml
Wann ist sie zu verwenden?
Manchmal müssen wir als Testautomatisierer nur die vom Testautomatisierungswerkzeug gemeldeten fehlgeschlagenen Tests ausführen, nachdem wir einige Fehler behoben haben. Wenn Sie nur fehlgeschlagene Tests durchführen, können Sie die Fehlerbehebung schnell überprüfen.
Wie kann dies erreicht werden?
Es ist relativ einfach, nur fehlgeschlagene Tests auszuführen, da TestNG hierfür eine natürliche Unterstützung bietet. Wenn eine Testsuite mit der Datei testng.xml ausgeführt wird, wird die Datei testng-failed.xml nach der Ausführung des Tests im Ordner test-output erstellt. Später können wir diese Datei genau wie die Datei testng.xml ausführen. Da in dieser Datei nur fehlgeschlagene Tests gespeichert werden, werden bei der Ausführung dieser Datei nur fehlgeschlagene Tests ausgeführt.
Automatische Wiederholung von fehlgeschlagenen Tests mit IRetryAnalyzer
Wann ist sie zu verwenden?
Manchmal erscheinen im Testausführungsbericht Fehler, die nicht durch Probleme in der Anwendung verursacht werden. Die Ursache für diese Probleme kann mit der Einrichtung der Testumgebung oder mit einem gelegentlichen Serverproblem zusammenhängen. Um sicherzustellen, dass es sich bei den im Testbericht gemeldeten Fehlern um echte und nicht nur um Einzelfälle handelt, können wir die fehlgeschlagenen Testfälle erneut ausführen, um falsch negative Testergebnisse in den Testberichten auszuschließen.
Wie kann dies erreicht werden?
Um fehlgeschlagene Testfälle während des eigentlichen Testlaufs automatisch zu wiederholen, müssen wir die von TestNG bereitgestellte Schnittstelle IRetryAnalyzer implementieren. Die Schnittstelle IRetryAnalyzer bietet Methoden zur Steuerung der Wiederholung von Testläufen. Hier wird die retry()-Methode von IRetryAnalyzer außer Kraft gesetzt, um sicherzustellen, dass der Test im Falle eines Fehlers mit der angegebenen Wiederholungsgrenze durchgeführt wird. Dank der Kommentare in dem Schnipsel ist das verständlich.
Schnipsel
package com.artoftesting.test;
import org.testng.IRetryAnalyzer;
import org.testng.ITestResult;
public class RetryAnalyzer implements IRetryAnalyzer {
//Counter to keep track of retry attempts
int retryAttemptsCounter = 0;
//The max limit to retry running of failed test cases
//Set the value to the number of times we want to retry
int maxRetryLimit = 1;
//Method to attempt retries for failure tests
public boolean retry(ITestResult result) {
if (!result.isSuccess()) {
if(retryAttemptsCounter < maxRetryLimit){
retryAttemptsCounter++;
return true;
}
}
return false;
}
}
In diesem Beispiel erstellen wir eine Dummy-Testmethode und lassen sie absichtlich mit der Methode assert.fail() fehlschlagen. Hier setzen wir das retryAnalyzer-Attribut der @Test-Annotation mit Hilfe der oben erstellten Klasse RetryAnalyzer.class.
@Test(retryAnalyzer = RetryAnalyzer.class)
public void intentionallyFailingTest(){
System.out.println("Executing Test");
Assert.fail("Failing Test");
}
Test-Ausgang
===============================================
Test-Suite
Durchgeführte Tests insgesamt: 2, Fehlschläge: 1, Übersprungene Tests: 1
===============================================
Hier können wir sehen, dass die Anzahl der Durchläufe der Methode mit 2 angezeigt wird, mit einem Fehler und einem Überspringen. Wenn die Testmethode zum ersten Mal fehlschlägt, wird sie als übersprungen markiert, und der Test wird dann aufgrund der in RetryAnalyzer vorgesehenen Logik erneut ausgeführt.
Jetzt gibt es nur noch ein Problem: Wir müssen das Attribut retryAnalyzer in jeder @Test-Anmerkung festlegen. Um dies zu bewerkstelligen, können wir die Schnittstelle IAnnotationTransformer implementieren. Diese Schnittstelle bietet die Möglichkeit, die testNG-Anmerkung im laufenden Betrieb zu ändern. Wir erstellen also eine Klasse, die die Schnittstelle IAnnotationTransformer implementiert, und legen RetryAnalyzer für @Test-Annotationen fest.
package com.ittester.test;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import org.testng.IAnnotationTransformer;
import org.testng.IRetryAnalyzer;
import org.testng.annotations.ITestAnnotation;
public class FailureRetryListener implements IAnnotationTransformer {
//Overriding the transform method to set the RetryAnalyzer
public void transform(ITestAnnotation testAnnotation, Class testClass,
Constructor testConstructor, Method testMethod) {
IRetryAnalyzer retry = testAnnotation.getRetryAnalyzer();
if (retry == null)
testAnnotation.setRetryAnalyzer(RetryAnalyzer.class);
}
}
Nachdem der Listener erstellt wurde, können wir ihn in der Datei testNG.xml wie folgt angeben
<listeners>
<listener class-name="com.ittester.test.FailureRetryListener"/>
</listeners>
Jetzt müssen wir retryAnalyzer nicht mehr in jeder @Test-Anmerkung festlegen. Wenn wir einen Hörer in der Datei testng.xml angegeben haben, funktioniert er für alle Tests.
PS: Wenn Sie die Wiederholungsfunktionalität nur einer begrenzten Anzahl von Testmethoden hinzufügen möchten, setzen Sie einfach die @Test-Annotation mit dem retryAnalyzer-Attribut unter Verwendung der RetryAnalyzer.class.