1. 概要

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

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

TestNGの基本から始めたい場合は、この記事をチェックしてください。

2. カスタムロギング

カスタムログを実装する前に、 mvn test command を実行してデフォルトのログを調べてみましょう。

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.

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

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

簡単に言えば、ロギング用のorg.testng.ITestListenerインターフェース、またはレポート用のorg.testng.IReporterインターフェースのいずれかを実装できます。これらの実装されたクラスは、テストの開始、終了、失敗などのイベントについて通知を受け取ります。スイート。

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

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()などの他のメソッドをオーバーライドできます(これらの他のメソッドの詳細については、ここを参照してください)。

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

<suite name="My test suite">
    <listeners>
        <listener class-name="com.baeldung.reports.CustomisedListener" />
    </listeners>
    <test name="numbersXML">
        <parameter name="value" value="1" />
        <parameter name="isEven" value="false" />
        <classes>
            <class name="baeldung.com.ParametrizedTests" />
        </classes>
    </test>
</suite>

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

出力ログ:

...
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形式のレポートが生成されます。

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

<configuration>
    <suiteXmlFiles>
        <suiteXmlFile>
            src\test\resources\parametrized_testng.xml
        </suiteXmlFile>
    </suiteXmlFiles>
</configuration>

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

public void generateReport(
  List<XmlSuite> xmlSuites, 
  List<ISuite> suites, String outputDirectory) {
 
    String reportTemplate = initReportTemplate();

    String body = suites
      .stream()
      .flatMap(suiteToResults())
      .collect(Collectors.joining());

    String report
      = reportTemplate.replaceFirst("</tbody>", String.format("%s</tbody>", body));
    saveReportTemplate(outputDirectory, report);
}

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

  • xmlSuite – には、XMLファイルに記載されているすべてのスイートのリストが含まれています
  • suites –リストオブジェクト。テスト実行に関するすべての情報を保持します。
  • outputDirectory –レポートが生成されるディレクトリパス

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

private Function<ISuite, Stream<? extends String>> suiteToResults() {
    return suite -> suite.getResults().entrySet()
      .stream()
      .flatMap(resultsToRows(suite));
}

private Function<Map.Entry<String, ISuiteResult>, 
  Stream<? extends String>> resultsToRows(ISuite suite) {
    return e -> {
        ITestContext testContext = e.getValue().getTestContext();

        Set<ITestResult> failedTests 
          = testContext.getFailedTests().getAllResults();
        Set<ITestResult> passedTests 
          = testContext.getPassedTests().getAllResults();
        Set<ITestResult> skippedTests 
          = testContext.getSkippedTests().getAllResults();

        String suiteName = suite.getName();

        return Stream
          .of(failedTests, passedTests, skippedTests)
          .flatMap(results ->
            generateReportRows(e.getKey(), suiteName, results).stream());
    };
}

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

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

<suite name="suite">
    <listeners>
        <listener class-name="com.baeldung.reports.CustomisedReports" />
    </listeners>
    <test name="test suite">
        <classes>
	    <class name="baeldung.com.RegistrationTest" />
            <class name="baeldung.com.SignInTest" />
        </classes>
    </test>
</suite>

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

デフォルトの確実なHTMLレポートと比較すると、このレポートは、結果の明確で鮮明な画像を1つのテーブルに表示します。 これはより便利で読みやすいです。

4. 結論

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

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

いつものように、スニペットの実装はGitHubにあります。