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

1概要

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

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

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

2カスタムログ

カスタムロギングを実装する前に、 mvn test コマンドを実行してデフォルトのログを調べてみましょう _: _

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() etcなどの他のメソッドをオーバーライドすることもできます(これらの他のメソッドの詳細については、http://javadox.com/org.testng/testng/6.8/org/testng/ITestListener.htmlを参照してください)[ここに])。

それでは、このリスナーを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 タグにリストする必要があります。

<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テンプレートをロードしました。 suitesToResults() 関数は、 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.まとめ

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

テストケースやスイートの書き方など、TestNGの詳細については、/testng[article]を参照してください。

いつものようにスニペットの実装はhttps://github.com/eugenp/tutorials/tree/master/testing-modules/testng[GitHubについて]で見つけることができます。