Benutzerdefiniertes Reporting mit TestNG

Benutzerdefiniertes Reporting mit TestNG

1. Überblick

In diesem Artikel werden wir das Generieren von benutzerdefinierten Protokollen und Berichten mit TestNG erläutern.

TestNG bietet eine eigene Berichtsfunktion, mit der Berichte in den Formaten HTML / XML erstellt werden können. Wenn Tests mitmaven-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 Siethis article.

2. Benutzerdefinierte Protokollierung

Bevor wir die benutzerdefinierte Protokollierung implementieren, schauen wir uns die Standardprotokolle an, indem wirmvn test Befehl: ausführen

Tests run: 11, Failures: 1, Errors: 0, Skipped: 0,
  Time elapsed: 1.21 sec <<< FAILURE!
- in TestSuite
whenCalledFromSuite_thanOK(example.com.RegistrationTest)
Time elapsed: 0.01 sec  <<< FAILURE!
java.lang.AssertionError: Test Failed due to some reason
    at example.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 Auskunft ü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, benutzerdefinierte Berichte und Protokollierungen zu implementieren.

Simply put, we can either implement the org.testng.ITestListener interface for logging or the org.testng.IReporter interface for reporting. 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 dieonFinish()-Methode überschrieben haben, die aufgerufen wird, wenn alle Testausführungen abgeschlossen und alle Konfigurationen abgeschlossen sind. Ebenso können wir andere Methoden überschreiben - wieonTestStart(), onTestFailure() usw. (und Details zu diesen anderen Methodenhere finden).

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


    
        
    
    
        
        
        
            
        
    

Nach der Ausführung wird der Listener bei jedem Ereignis aufgerufen und protokolliert die von uns implementierten Informationen. Dies kann nützlich sein, um die 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 in HTML / XML-Formaten im Verzeichnistarget/surefire-reportsgeneriert:

image

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


    
        
            src\test\resources\parametrized_testng.xml
        
    

Versuchen wir nun nach der benutzerdefinierten Protokollierung, einige benutzerdefinierte Berichte zu erstellen, in denen wir dieorg.testng.IReporter-Schnittstelle implementieren und diegenerateReport()-Methode ü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 –ist ein Listenobjekt, das alle Informationen zur Testausführung enthält

  • outputDirectory –ist der Verzeichnispfad, in dem Berichte generiert werden

Wir haben die MethodeinitReportTemplate()verwendet, um eine HTML-Vorlage zu laden, die FunktionsuiteToResults(), die die FunktionresultsToRow()aufruft, um die Interna der Berichterstellung zu verarbeiten:

private Function> suiteToResults() {
    return suite -> suite.getResults().entrySet()
      .stream()
      .flatMap(resultsToRows(suite));
}

private Function,
  Stream> 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());
    };
}

undsaveReportTemplate() zum Speichern des vollständigen Ergebnisses.

Binden Sie den Reporter in die XML-Konfigurationsdatei ein:


    
        
    
    
        
        
            
        
    

Hier ist die Ausgabe unserer Berichte:

image

Im Vergleich zum Standard-HTML-Bericht von sure-fire liefert dieser Bericht ein klares und klares Bild des Ergebnisses in einer einzigen Tabelle. Welches ist bequemer und einfach zu lesen.

4. Fazit

In diesem kurzen Tutorial haben wir gelernt, wie man Testberichte mit dem Surefire Maven Plugin erstellt. Wir haben uns auch mit dem Anpassen der Protokolle und dem Generieren angepasster Berichte mit TestNG befasst. Weitere Informationen zu TestNG finden Sie unter Schreiben von Testfällen, Suites usw. Siehe unsere Einführung

Für weitere Details zu TestNG, z. B. zum Schreiben von Testfällen und Suites, beginnen Sie auf jeden Fall mit unseren einleitendenarticle.

Wie immer kann die Implementierung der Snippetsover on GitHub gefunden werden.