TestNGを使ったカスタムレポート

TestNGを使用したカスタムレポート

1. 概要

この記事では、TestNGを使用してカスタムロギングとレポートを生成する方法について説明します。

TestNGには独自のレポート機能があり、HTML / XML形式でレポートを生成します。 maven-surefire-plugin,を使用してテストを実行すると、レポートはプラグインで定義されたデフォルトの形式になります。 組み込みのレポートとは別に、ログ情報と生成されたレポートを簡単にカスタマイズするためのメカニズムを提供します。

TestNGの基本から始めたい場合は、this articleを確認してください。

2. カスタムロギング

カスタムロギングを実装する前に、mvn 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.

これらのログは、実行順序や特定のテストがいつ開始/完了したかなどの情報を提供しません。

各実行の結果とカスタムデータを知りたい場合は、独自のログとレポートを実装できます。 TestNGは、カスタムレポートとログを実装する方法を提供します。

Simply put, we can either implement the org.testng.ITestListener interface for logging or the org.testng.IReporter interface for reporting.これらの実装されたクラスは、テストとスイートの開始、終了、失敗などのイベントについて通知を受けます。

先に進んで、いくつかの簡単なカスタムロギングを実装しましょう。

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

    //...
}

onFinish()メソッドをオーバーライドしたことに注目してください。このメソッドは、すべてのテストの実行が完了し、すべての構成が完了したときに呼び出されます。 同様に、onTestStart(), onTestFailure()などの他のメソッドをオーバーライドできます(これらの他のメソッドhereの詳細を見つけることができます)。

次に、このリスナーをXML構成に含めましょう。


    
        
    
    
        
        
        
            
        
    

実行されると、リスナーはすべてのイベントで呼び出され、実装時に情報を記録します。 これは、テスト実行のデバッグに役立つ場合があります。

出力ログ:

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

カスタムログでは、デフォルトのログに情報がありません。

3. カスタムレポート

プラグインを使用してテストを実行すると、target/surefire-reportsディレクトリにHTML / XML形式のレポートが生成されます。

image

TestNG XMLファイルを使用して特定のテストスイートを実行する場合は、surefire-pluginconfigurationタグにリストする必要があります。


    
        
            src\test\resources\parametrized_testng.xml
        
    

カスタムロギングの後、org.testng.IReporterインターフェイスを実装し、generateReport()メソッドをオーバーライドするカスタムレポートを作成してみましょう。

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

オーバーライドされたメソッドは3つの引数を取ります。

  • xmlSuite –には、XMLファイルに記載されているすべてのスイートのリストが含まれています

  • suites –は、テスト実行に関するすべての情報を保持するリストオブジェクトです。

  • outputDirectory –レポートが生成されるディレクトリパス

initReportTemplate()メソッドを使用してHTMLテンプレートをロードしました。suiteToResults()関数は、resultsToRow()関数を呼び出して、レポート生成の内部を処理します。

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

完全な結果を保存するためのsaveReportTemplate()

XML構成ファイルにレポーターを含めます。


    
        
    
    
        
        
            
        
    

レポートの出力は次のとおりです。

image

デフォルトの確実なHTMLレポートと比較して、このレポートは、単一の表で結果の明確で鮮明な画像を提供します。 より便利で読みやすいです。

4. 結論

このクイックチュートリアルでは、Surefire Mavenプラグインを使用してテストレポートを生成する方法について学びました。 また、ログをカスタマイズし、TestNGでカスタマイズされたレポートを生成することも検討しました。 テストケース、スイートなどの作成方法など、TestNGの詳細については 私たちの紹介を参照してください

テストケースやスイートの作成方法など、TestNGの詳細については、紹介のarticleから始めてください。

いつものように、スニペットの実装はover on GitHubで見つけることができます。