JUnit 5 TestWatcher API

  • link:/category/testing/ [テスト]

  • JUnit

1. 概要

単体テストの場合、定期的にテストメソッドの実行結果を処理したい場合があります。 このクイックチュートリアルでは、* http://junit.org/junit5/ [JUnit] *が提供するTestWatcher APIを使用してこれを実現する方法を見ていきます。
JUnitを使用したテストの詳細なガイドについては、https://www.baeldung.com/junit-5 [JUnit 5のガイド]をご覧ください。

*2. TestWatcher API *

*要するに、https://junit.org/junit5/docs/current/api/org/junit/jupiter/api/extension/TestWatcher.html [_TestWatcher_]インターフェースはhttps://www.baeldungのAPIを定義しています。テスト結果を処理したいcom / junit-5-extensions [extensions] *。 このAPIを考える1つの方法は、個々のテストケースのステータスを取得するためのフックを提供することです。
しかし、実際の例に飛び込む前に、*一歩下がって_TestWatcher_インターフェースのメソッドを簡単に要約しましょう*:
  • [ソース、java、gutter:、true]

testAborted​(ExtensionContext context, Throwable cause)
 +中止されたテストの結果を処理するために、_testAborted_メソッドをオーバーライドできます。 名前が示すように、このメソッドはテストが中止された後に呼び出されます。
*  [ソース、java、gutter:、true]
testDisabled​(ExtensionContext context, Optional reason)
 +無効化されたテストメソッドの結果を処理する場合は、_testDisabled_メソッドをオーバーライドできます。 このメソッドには、テストが無効になっている理由も含まれる場合があります。
*  [ソース、java、gutter:、true]
testFailed(ExtensionContext context, Throwable cause)
 +テストの失敗後に追加の処理を行いたい場合は、_testFailed_メソッドの機能を実装するだけです。 このメソッドには、テストの失敗の原因が含まれる場合があります。
*  [ソース、java、gutter:、true]
testSuccessful(ExtensionContext context)
+最後になりましたが、成功したテストの結果を処理したい場合は、_testSuccessful_メソッドを単純にオーバーライドします。
すべてのメソッドに_ExtensionContext_が含まれていることに注意してください。 これは、現在のテストが実行されたコンテキストをカプセル化します。

3. Mavenの依存関係

まず、例に必要なプロジェクトの依存関係を追加しましょう。 +メインのJUnit 5ライブラリ_junit-jupiter-engine_の他に、_junit-jupiter-api_ライブラリも必要です。
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-api</artifactId>
    <version>5.4.2</version>
    <scope>test</scope>
</dependency>
いつものように、https://search.maven.org/classic/#search%7Cga%7C1%7Cg%3A%22org.junit.jupiter%22%20AND%20a%3A%22junit-jupiterから最新バージョンを入手できます。 -api%22 [Maven Central]。

4. _TestResultLoggerExtension_の例

_TestWatcher_ APIの基本的な理解ができたので、実際の例を見ていきましょう。
*結果を記録し、テストの概要を提供するための簡単な拡張機能を作成することから始めましょう*。 この場合、拡張機能を作成するには、_TestWatcher_インターフェイスを実装するクラスを定義する必要があります。
public class TestResultLoggerExtension implements TestWatcher, AfterAllCallback {
    private List<TestResultStatus> testResultsStatus = new ArrayList<>();

    private enum TestResultStatus {
        SUCCESSFUL, ABORTED, FAILED, DISABLED;
    }

    //...
}
*すべての拡張インターフェイスと同様に、_TestWatcher_インターフェイスはメインの_Extension_インターフェイスも拡張します*。これはマーカーインターフェイスのみです。 この例では、_AfterAllCallback_インターフェイスも実装します。
拡張機能には、_TestResultStatus_のリストがあります。これは、テスト結果のステータスを表すために使用する単純な列挙です。

* 4.1。 テスト結果の処理*

それでは、個々の単体テストメソッドの結果を処理する方法を見てみましょう。
@Override
public void testDisabled(ExtensionContext context, Optional<String> reason) {
    LOG.info("Test Disabled for test {}: with reason :- {}",
      context.getDisplayName(),
      reason.orElse("No reason"));

    testResultsStatus.add(TestResultStatus.DISABLED);
}

@Override
public void testSuccessful(ExtensionContext context) {
    LOG.info("Test Successful for test {}: ", context.getDisplayName());

    testResultsStatus.add(TestResultStatus.SUCCESSFUL);
}
拡張機能の本体を埋め、* _ testDisabled()_および_testSuccessful()_メソッドをオーバーライドすることから始めます*。
ささいな例では、テストの名前を出力し、テストのステータスを_testResultsStatus_リストに追加します。
*他の2つのメソッド_testAborted()_および_testFailed()_:についても、この方法で続けます。*
@Override
public void testAborted(ExtensionContext context, Throwable cause) {
    LOG.info("Test Aborted for test {}: ", context.getDisplayName());

    testResultsStatus.add(TestResultStatus.ABORTED);
}

@Override
public void testFailed(ExtensionContext context, Throwable cause) {
    LOG.info("Test Aborted for test {}: ", context.getDisplayName());

    testResultsStatus.add(TestResultStatus.FAILED);
}

* 4.2。 テスト結果の要約*

この例の最後の部分では、* _ afterAll()_メソッドをオーバーライドします*:
@Override
public void afterAll(ExtensionContext context) throws Exception {
    Map<TestResultStatus, Long> summary = testResultsStatus.stream()
      .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));

    LOG.info("Test result summary for {} {}", context.getDisplayName(), summary.toString());
}
簡単に要約すると、_afterAll_メソッドは、すべてのテストメソッドが実行された後に実行されます。 このメソッドを使用して、非常に基本的な概要を出力する前に、テスト結果のリストにあるさまざまな_TestResultStatus_をグループ化します。
ライフサイクルコールバックの詳細なガイドについては、https://www.baeldung.com/junit-5-extensions [JUnit 5拡張機能のガイド]をご覧ください。

5. テストの実行

*この最後から2番目のセクションでは、単純なログ拡張機能を使用して、テストからの出力がどのようになるかを確認します。*
拡張機能を定義したので、最初に標準の_ @ ExtendWith_アノテーションを使用して登録します。
@ExtendWith(TestResultLoggerExtension.class)
class TestWatcherAPIUnitTest {

    @Test
    void givenFalseIsTrue_whenTestAbortedThenCaptureResult() {
        Assumptions.assumeTrue(false);
    }

    @Disabled
    @Test
    void givenTrueIsTrue_whenTestDisabledThenCaptureResult() {
        Assert.assertTrue(true);
    }

    //...
*次に、テストクラスを単体テストで満たし、無効化されたテスト、中止されたテスト、成功したテストの混合を追加します。*

* 5.1。 出力の確認*

単体テストを実行すると、各テストの出力が表示されるはずです。
INFO  c.b.e.t.TestResultLoggerExtension -
    Test Successful for test givenTrueIsTrue_whenTestAbortedThenCaptureResult()
...
Test result summary for TestWatcherAPIUnitTest {ABORTED=1, SUCCESSFUL=1, DISABLED=2}
*当然、すべてのテスト方法が完了すると、要約も印刷されます。*

6. 落とし穴

この最後のセクションでは、_TestWatcher_インターフェースを操作する際に注意すべき微妙な点をいくつか見てみましょう。
  • TestWatcher拡張機能の実行に影響を与えることは許可されていません
    テスト;これは、* _ TestWatcher_から例外がスローされた場合、実行中のテストまで伝播されないことを意味します*

  • 現在、このAPIは_ @ Test_の結果を報告するためにのみ使用されています
    メソッドと_ @ TestTemplate_メソッド

  • デフォルトでは、testDisabled_メソッドに理由が提供されない場合、
    次に、テストメソッドの完全修飾名の後に「_is @Disabled
    」が続きます

7. 結論

要約すると、このチュートリアルでは、JUnit 5 _TestWatcher_ APIを使用してテストメソッドの実行結果を処理する方法を示しました。
サンプルの完全なソースコードは、https://github.com/eugenp/tutorials/tree/master/testing-modules/junit-5-advanced [over on GitHub]にあります。