Benutzerdefinierte Berichterstellung mit TestNG

1. Übersicht

In diesem Artikel wird das Generieren von benutzerdefinierten Protokollen und Berichten mit TestNG erläutert.

TestNG bietet eine eigene Berichtsfunktion, mit der Berichte in HTML- / XML-Formaten erstellt werden können. Wenn Tests mit dem Maven-Surefire-Plugin ausgeführt werden, nimmt der Bericht die vom Plugin definierte Standardform an. Neben der integrierten Berichterstellung bietet es einen Mechanismus zur einfachen Anpassung protokollierter Informationen und generierter Berichte.

Wenn Sie mit den TestNG-Grundlagen beginnen möchten, lesen Sie diesen Artikel.

2. Benutzerdefinierte Protokollierung

Bevor wir die benutzerdefinierte Protokollierung implementieren, sehen wir uns die Standardprotokolle an, indem wir den Befehl mvn test ausführen :

Tests run: 11, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 1.21 sec <<< FAILURE! - in TestSuite whenCalledFromSuite_thanOK(baeldung.com.RegistrationTest) Time elapsed: 0.01 sec <<< FAILURE! java.lang.AssertionError: Test Failed due to some reason at baeldung.com.RegistrationTest.whenCalledFromSuite_thanOK( RegistrationTest.java:15) Results : Failed tests: RegistrationTest.whenCalledFromSuite_thanOK:15 Test Failed due to some reason Tests run: 11, Failures: 1, Errors: 0, Skipped: 0 [ERROR] There are test failures.

Diese Protokolle geben uns keine Informationen über die Ausführungsreihenfolge oder darüber, wann ein bestimmter Test gestartet / abgeschlossen wurde usw.

Wenn wir das Ergebnis jedes Laufs zusammen mit einigen benutzerdefinierten Daten wissen möchten, können wir unsere eigenen Protokolle und Berichte implementieren. TestNG bietet eine Möglichkeit zum Implementieren von benutzerdefinierten Berichten und zur Protokollierung.

Einfach ausgedrückt können wir entweder die Schnittstelle org.testng.ITestListener für die Protokollierung oder die Schnittstelle org.testng.IReporter für die Berichterstellung implementieren. Diese implementierten Klassen werden für Ereignisse wie Start, Ende, Fehler usw. von Tests und Suites benachrichtigt.

Lassen Sie uns eine einfache benutzerdefinierte Protokollierung implementieren:

public class CustomisedListener implements ITestListener { // ... @Override public void onFinish(ITestContext testContext) { LOGGER.info("PASSED TEST CASES"); testContext.getPassedTests().getAllResults() .forEach(result -> {LOGGER.info(result.getName());}); LOGGER.info("FAILED TEST CASES"); testContext.getFailedTests().getAllResults() .forEach(result -> {LOGGER.info(result.getName());}); LOGGER.info( "Test completed on: " + testContext.getEndDate().toString()); } //... } 

Beachten Sie, wie wir die onFinish () -Methode überschrieben haben, die aufgerufen wird, wenn alle Testausführungen abgeschlossen und alle Konfigurationen abgeschlossen sind. Ebenso können wir andere Methoden überschreiben, z. B. onTestStart (), onTestFailure () usw. (und Details zu diesen anderen Methoden finden Sie hier).

Nehmen wir nun diesen Listener in die XML-Konfiguration auf:

Nach der Ausführung wird der Listener bei jedem Ereignis aufgerufen und protokolliert Informationen, wie wir sie implementiert haben. Dies kann nützlich sein, um unsere Testausführung zu debuggen.

Die Ausgabeprotokolle:

... INFO CUSTOM_LOGS - Started testing on: Sat Apr 22 14:39:43 IST 2017 INFO CUSTOM_LOGS - Testing: givenNumberFromDataProvider_ifEvenCheckOK_thenCorrect INFO CUSTOM_LOGS - Tested: givenNumberFromDataProvider_ifEvenCheckOK_thenCorrect Time taken:6 ms INFO CUSTOM_LOGS - Testing: givenNumberObjectFromDataProvider_ifEvenCheckOK_thenCorrect INFO CUSTOM_LOGS - Failed : givenNumberObjectFromDataProvider_ifEvenCheckOK_thenCorrect INFO CUSTOM_LOGS - PASSED TEST CASES INFO CUSTOM_LOGS - givenNumberFromDataProvider_ifEvenCheckOK_thenCorrect INFO CUSTOM_LOGS - FAILED TEST CASES INFO CUSTOM_LOGS - givenNumberObjectFromDataProvider_ifEvenCheckOK_thenCorrect INFO CUSTOM_LOGS - Test completed on: Sat Apr 22 14:39:43 IST 2017 ...

Die benutzerdefinierten Protokolle geben uns fehlende Informationen in den Standardprotokollen.

3. Benutzerdefinierte Berichte

Wenn wir Tests mit dem Plugin ausführen, werden Berichte im HTML / XML-Format im Verzeichnis target / surefire-reports generiert :

Wenn wir eine bestimmte Testsuite mit einer TestNG-XML-Datei ausführen möchten, müssen wir sie im Konfigurations- Tag des todsicheren Plugins auflisten:

   src\test\resources\parametrized_testng.xml   

Lassen Sie uns nach der benutzerdefinierten Protokollierung versuchen, einige benutzerdefinierte Berichte zu erstellen, in denen wir die Schnittstelle org.testng.IReporter implementieren und die Methode generateReport () überschreiben :

public void generateReport( List xmlSuites, List suites, String outputDirectory) { String reportTemplate = initReportTemplate(); String body = suites .stream() .flatMap(suiteToResults()) .collect(Collectors.joining()); String report = reportTemplate.replaceFirst("", String.format("%s", body)); saveReportTemplate(outputDirectory, report); }

Die überschriebene Methode akzeptiert drei Argumente:

  • xmlSuite - enthält eine Liste aller in der XML-Datei genannten Suites
  • Suites - Ein Listenobjekt, das alle Informationen zur Testausführung enthält
  • outputDirectory - Der Verzeichnispfad, in dem Berichte generiert werden

Wir nutzten die initReportTemplate () Methode , um eine HTML - Vorlage laden suiteToResults () Funktion , die die ruft resultsToRow () Funktion , die Interna der Erstellung des Berichts zu handhaben :

private Function
    
      suiteToResults() { return suite -> suite.getResults().entrySet() .stream() .flatMap(resultsToRows(suite)); } private Function
     
       resultsToRows(ISuite suite) { return e -> { ITestContext testContext = e.getValue().getTestContext(); Set failedTests = testContext.getFailedTests().getAllResults(); Set passedTests = testContext.getPassedTests().getAllResults(); Set skippedTests = testContext.getSkippedTests().getAllResults(); String suiteName = suite.getName(); return Stream .of(failedTests, passedTests, skippedTests) .flatMap(results -> generateReportRows(e.getKey(), suiteName, results).stream()); }; }
     
    

und saveReportTemplate () zum Speichern des vollständigen Ergebnisses.

Fügen Sie den Reporter in die XML-Konfigurationsdatei ein:

Hier ist die Ausgabe unserer Berichte:

Im Vergleich zum standardmäßigen sicheren HTML-Bericht liefert dieser Bericht ein klares und klares Bild des Ergebnisses in einer einzigen Tabelle. Welches ist bequemer und leicht zu lesen.

4. Fazit

In diesem kurzen Tutorial haben wir gelernt, wie Sie mit dem Surefire Maven-Plugin Testberichte erstellen. Wir haben uns auch mit dem Anpassen der Protokolle und dem Generieren von benutzerdefinierten Berichten mit TestNG befasst. Weitere Informationen zu TestNG wie das Schreiben von Testfällen, Suiten usw. finden Sie in unserer Einführung

Weitere Informationen zu TestNG, z. B. zum Schreiben von Testfällen und Suiten, finden Sie in unserem Einführungsartikel.

Wie immer ist die Implementierung der Snippets auf GitHub zu finden.