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について]で見つけることができます。