Rapports personnalisés avec TestNG

Rapports personnalisés avec TestNG

1. Vue d'ensemble

Dans cet article, nous allons parler de la création d'une journalisation et de rapports personnalisés à l'aide de TestNG.

TestNG fournit sa propre fonctionnalité de création de rapports - générer des rapports aux formats HTML / XML. Si les tests sont exécutés en utilisant lesmaven-surefire-plugin,, le rapport prendra la forme par défaut définie par le plugin. Outre les rapports intégrés, il fournit un mécanisme permettant de personnaliser facilement les informations consignées et les rapports générés.

Si vous souhaitez commencer avec les bases de TestNG, consultezthis article.

2. Journalisation personnalisée

Avant de mettre en œuvre la journalisation personnalisée, examinons les journaux par défaut en exécutant la commandemvn test:

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.

Ces journaux ne nous fournissent aucune information sur l'ordre d'exécution, ni sur le moment où un test particulier a été lancé / terminé, etc.

Si nous voulons connaître le résultat de chaque exécution avec des données personnalisées, nous pouvons implémenter nos propres journaux et rapports. TestNG permet d'implémenter des rapports et une journalisation personnalisés.

Simply put, we can either implement the org.testng.ITestListener interface for logging or the org.testng.IReporter interface for reporting. Ces classes implémentées sont notifiées pour les événements tels que le début, la fin, l'échec, etc. des tests et des suites.

Allons-y et implémentons une simple journalisation personnalisée:

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());
    }

    //...
}

Remarquez comment nous avons remplacé la méthodeonFinish(), qui sera appelée lorsque toutes les exécutions de test seront terminées et que toutes les configurations seront terminées. De même, nous pouvons remplacer d'autres méthodes - telles queonTestStart(), onTestFailure() etc (et trouver des détails sur ces autres méthodeshere).

Incluons maintenant cet écouteur dans la configuration XML:


    
        
    
    
        
        
        
            
        
    

Une fois exécuté, le programme d'écoute sera appelé pour chaque événement et enregistrera les informations comme nous l'avons mis en œuvre. Cela peut être utile pour déboguer notre test.

Les journaux de sortie:

...
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
...

Les journaux personnalisés nous fournissent des informations manquantes dans les journaux par défaut.

3. Rapports personnalisés

Lorsque nous exécutons des tests à l'aide du plugin, il génère des rapports aux formats HTML / XML dans le répertoiretarget/surefire-reports:

image

Si nous voulons exécuter une suite de tests particulière en utilisant un fichier XML TestNG, nous devons la lister dans la balise surefire-pluginconfiguration:


    
        
            src\test\resources\parametrized_testng.xml
        
    

Après la journalisation personnalisée, essayons maintenant de créer des rapports personnalisés dans lesquels nous implémentons l'interfaceorg.testng.IReporter et remplaçons la méthodegenerateReport():

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);
}

La méthode substituée prend trois arguments:

  • xmlSuite – contient une liste de toutes les suites mentionnées dans le fichier XML

  • suites – un objet de liste, contenant toutes les informations sur l'exécution du test

  • outputDirectory – le chemin du répertoire où les rapports sont générés

Nous avons utilisé la méthodeinitReportTemplate() pour charger un modèle HTML, la fonctionsuiteToResults() qui invoque la fonctionresultsToRow() pour gérer les éléments internes de la génération du rapport:

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());
    };
}

etsaveReportTemplate() pour enregistrer le résultat complet.

Incluez le rapporteur dans le fichier de configuration XML:


    
        
    
    
        
        
            
        
    

Voici le résultat de nos rapports:

image

Par rapport au rapport HTML sure-fire par défaut, ce rapport donne une image claire et nette du résultat, dans un seul tableau. Ce qui est plus pratique et facile à lire.

4. Conclusion

Dans ce rapide didacticiel, nous avons appris à générer des rapports de test avec le plug-in Surefire Maven. Nous avons également examiné la possibilité de personnaliser les journaux et de générer des rapports personnalisés avec TestNG. Pour plus de détails sur TestNG, comme comment écrire des scénarios de test, des suites, etc. se référer à notre introduction

Pour plus de détails sur TestNG, comme comment écrire des cas de test, des suites, commencez certainement par notre introductionarticle.

Comme toujours, l'implémentation des extraits de code peut être trouvéeover on GitHub.