Mavenプラグインテスト-現代の方法で-パート3


Mavenビルドのログ出力をチェックしながら、基本的な統合テストを行う方法を見ました.
この第3部では、Mavenが統合テスト中にどのようにデフォルトで呼び出されるか、どのようにその行動に影響を与えるかについて飛び込みます.
次の基本的な統合テストを始めましょう(現在テスト中のプロジェクトを無視します)
@MavenJupiterExtension
class BaseIT {

  @MavenTest
  void the_first_test_case(MavenExecutionResult result) {
     ...
  }
}
上記のテストでは、デフォルトで次のオプションを使用してApache Mavenを実行します
  • --batch-mode
  • --show-version
  • --errors
  • つまり、統合テストフレームワーク内の各実行は次のように行われます.
    mvn --batch-mode --show-version --errors
    
    それぞれの統合テストケースのローカルキャッシュを正しく動作させるためには、統合テストフレームワークを追加します.-Dmaven.repo.local=... それぞれの呼び出しにも.これは次の結果を得るために必要です.
    .
    └──target/
       └── maven-it/
           └── org/
               └── it/
                   └── FirstMavenIT/
                       └── the_first_test_case/
                           ├── .m2/
                           ├── project/
                           │   ├── src/
                           │   ├── target/
                           │   └── pom.xml
                           ├── mvn-stdout.log
                           ├── mvn-stderr.log
                           └── mvn-arguments.log
    
    オプション-Dmaven.repo.local=... 現在変更できません.使用するコマンドライン引数はmvn-arguments.log 後で分析することができるファイル.結局、統合テストのコマンドラインは次のようになります.
    mvn -Dmaven.repo.local=<Directory> --batch-mode --show-version --errors package
    
    使用されるゴールpackage ) そして、それが変わることができる方法は、シリーズのパートIVで扱われます.
    これまでのところ、とても良いが、時々、あるいは、よりしばしば頻繁に、統合テストとの関係で特にMaven呼び出しに他のコマンドラインオプションを加えるのに必要です.
    時々、あなた自身のプラグイン/拡張はデバッグレベルに関するいくつかの役に立つ情報を印刷するでしょう、しかし、それをテストする方法?私たちは、統合テストのために使用されるオプションがデバッグオプションを含んでいない前に言及しました.
    我々は今、これを介して必要性を表現することができますbasic_configuration_with_debug ):
    @MavenJupiterExtension
    class FailureIT {
      ...
      @MavenTest
      @MavenOption(MavenCLIOptions.DEBUG)
      void basic_configuration_with_debug(MavenExecutionResult result) {
        assertThat(result)
            .isSuccessful()
            .out()
            .info()
            .containsSubsequence(
                "--- maven-enforcer-plugin:3.0.0-M1:enforce (enforce-maven) @ basic_configuration_with_debug ---",
                "--- jacoco-maven-plugin:0.8.5:prepare-agent (default) @ basic_configuration_with_debug ---",
                "--- maven-resources-plugin:3.1.0:resources (default-resources) @ basic_configuration_with_debug ---",
                "--- maven-compiler-plugin:3.8.1:compile (default-compile) @ basic_configuration_with_debug ---",
                "--- maven-resources-plugin:3.1.0:testResources (default-testResources) @ basic_configuration_with_debug ---",
                "--- maven-compiler-plugin:3.8.1:testCompile (default-testCompile) @ basic_configuration_with_debug ---",
                "--- maven-surefire-plugin:3.0.0-M4:test (default-test) @ basic_configuration_with_debug ---",
                "--- maven-jar-plugin:3.2.0:jar (default-jar) @ basic_configuration_with_debug ---",
                "--- maven-site-plugin:3.9.1:attach-descriptor (attach-descriptor) @ basic_configuration_with_debug ---"
            );
        assertThat(result)
            .isSuccessful()
            .out()
            .warn()
            .containsSubsequence(
                "Neither executionException nor failureException has been set.",
                "JAR will be empty - no content was marked for inclusion!");
    
        assertThat(result)
            .isSuccessful()
            .out()
            .debug()
            .containsSubsequence(
                "Created new class realm maven.api",
                "Project: com.soebes.itf.maven.plugin.its:basic_configuration_with_debug:jar:1.0",
                "Goal:          org.apache.maven.plugins:maven-resources-plugin:3.1.0:resources (default-resources)"
            );
    
      }
    }
    
    を使用することによって@MavenOption(..) 自動的に他のすべての以前のコマンドラインオプションはもう使用されません.この例では、最終的なコマンドラインはテストケースのためにこのように見えますbasic_configuration_with_debug :
    mvn -Dmaven.repo.local=<path> --debug package
    
    デバッグ出力を有効にすると、デバッグ出力をチェックすることができます.
    assertThat(result)
        .isSuccessful()
        .out()
        .debug()
        .containsSubsequence(
            "Created new class realm maven.api",
            "Project: com.soebes.itf.maven.plugin.its:basic_configuration_with_debug:jar:1.0",
            "Goal:          org.apache.maven.plugins:maven-resources-plugin:3.1.0:resources (default-resources)"
        );
    
    閉じるこの動画はお気に入りから削除されています--batch-mode オプション--show-version だけでなく--error テストケースのオプションは、以下のように追加しなければなりません:
      @MavenTest
      @MavenOption(MavenCLIOptions.BATCH_MDOE)
      @MavenOption(MavenCLIOptions.SHOW_VERSION)
      @MavenOption(MavenCLIOptions.ERRORS)
      @MavenOption(MavenCLIOptions.DEBUG)
      void basic_configuration_with_debug(MavenExecutionResult result) {
      ...
      }
    
    その結果、あなたのMavenコマンドラインは現在、補足を含む前に見えます--debug オプション:
    mvn -Dmaven.repo.local=<Directory> --batch-mode --show-version --errors --debug package
    
    これは、簡単にテストケースのコマンドラインオプションを@MavenOption 注釈.
    Mavenのコマンドラインオプションには補足情報が必要です--log-file <arg> これには、ログファイルの名前が必要です.どうやってこれを表現できるの@MavenOption 注釈?これは以下のように簡単に実現できます.
      @MavenTest
      @MavenOption(QUIET)
      @MavenOption(SHOW_VERSION)
      @MavenOption(value = LOG_FILE, parameter = "test.log")
      void basic_configuration_with_debug(MavenExecutionResult result) {
      ...
      }
    
    上記の例で見ることができるように、あなたはvalue 注釈の.オプションのパラメータはparameter . この場合、静的インポートを使用して読みやすくしました.あなたは
    このような静的輸入なしのコース作業(好みの問題)
      @MavenTest
      @MavenOption(MavenCLIOptions.QUIET)
      @MavenOption(MavenCLIOptions.SHOW_VERSION)
      @MavenOption(value = MavenCLIOptions.LOG_FILE, parameter = "test.log")
      void basic_configuration_with_debug(MavenExecutionResult result) {
      ...
      }
    
    それで、いくつかのテストケースのために同じコマンドラインオプションを使用することについてはどうですか?コマンドラインオプションを単に次のようにテストクラスレベルに追加できます.
    @MavenJupiterExtension
    @MavenOption(MavenCLIOptions.FAIL_AT_END)
    @MavenOption(MavenCLIOptions.NON_RECURSIVE)
    @MavenOption(MavenCLIOptions.ERRORS)
    @MavenOption(MavenCLIOptions.DEBUG)
    class FailureIT {
    
      @MavenTest
      void case_one(MavenExecutionResult project) {
        ..
      }
    
      @MavenTest
      void case_two(MavenExecutionResult result) {
        ..
      }
    
      @MavenTest
      void case_three(MavenExecutionResult result) {
        ..
      }
    
      @MavenTest
      void case_four(MavenExecutionResult result) {
        ..
      }
    
    }
    
    これはそれぞれのテストケースに対して(case_one , case_two , case_three and case_four ) コマンドラインオプションの同じセットが使用されます.それとは別に、コマンドラインオプションを一度だけ定義するのはずっと便利です
    すべてのテストケースに対してではなく.
    ちょっと待って.実行したいcase_four 別のコマンドラインオプションで?OK問題は、次の例のように、特定のテストケースにコマンドラインオプションを設定するだけです.
    @MavenJupiterExtension
    @MavenOption(MavenCLIOptions.FAIL_AT_END)
    @MavenOption(MavenCLIOptions.NON_RECURSIVE)
    @MavenOption(MavenCLIOptions.ERRORS)
    @MavenOption(MavenCLIOptions.DEBUG)
    class FailureIT {
    
      @MavenTest
      void case_one(MavenExecutionResult project) {
        ..
      }
    
      @MavenTest
      void case_two(MavenExecutionResult result) {
        ..
      }
    
      @MavenTest
      void case_three(MavenExecutionResult result) {
        ..
      }
    
      @MavenTest
      @MavenOption(MavenCLIOptions.DEBUG)
      void case_four(MavenExecutionResult result) {
        ..
      }
    
    }
    
    テストケースcase_four はクラスレベルで定義されたコマンドラインオプションを継承しない.それはテストケース自体で定義されたものだけを使用するでしょう.
    今、通常の開発者の質問:私は本当に怠惰な私はすべてのこれらの4つを書きたくないMavenOption 各テストクラスの注釈.特に、これらのコマンドラインオプションを変更する必要がある場合は、各テストクラスを1つずつ行ってください.
    もちろん、その問題に対するより便利な解決策があります.これをメタアノテーションと呼ぶ.我々は、単に私たちが呼び出すメタアノテーションを作成することができますMavenTestOptions . このメタアノテーションは次のようになります.
    @Target({ElementType.METHOD, ElementType.TYPE})
    @Retention(RUNTIME)
    @Inherited
    @MavenOption(MavenCLIOptions.FAIL_AT_END)
    @MavenOption(MavenCLIOptions.NON_RECURSIVE)
    @MavenOption(MavenCLIOptions.ERRORS)
    @MavenOption(MavenCLIOptions.DEBUG)
    public @interface MavenTestOptions {
    }
    
    このメタアノテーションは、このように前の例のテストクラスを変更するために使用できます.
    @MavenJupiterExtension
    @MavenTestOptions
    class FailureIT {
    
      @MavenTest
      void case_one(MavenExecutionResult project) {
        ..
      }
    
      @MavenTest
      void case_two(MavenExecutionResult result) {
        ..
      }
    
      @MavenTest
      void case_three(MavenExecutionResult result) {
        ..
      }
    
      @MavenTest
      @MavenOption(MavenCLIOptions.DEBUG)
      void case_four(MavenExecutionResult result) {
        ..
      }
    
    }
    
    以上をもう少し改善することができる.注釈を統合できます@MavenJupiterExtension このように私たちの自己定義メタ注釈にexample project メタ注釈という名前を付けました@MavenITExecution一つのプロジェクトで異なる例を挙げる)
    @Target({ElementType.METHOD, ElementType.TYPE})
    @Retention(RUNTIME)
    @Inherited
    @MavenJupiterExtension
    @MavenOption(MavenCLIOptions.FAIL_AT_END)
    @MavenOption(MavenCLIOptions.NON_RECURSIVE)
    @MavenOption(MavenCLIOptions.ERRORS)
    @MavenOption(MavenCLIOptions.DEBUG)
    public @interface MavenTestOptions {
    }
    
    これに基づいてテストケースを変更できます.
    @MavenTestOptions
    class FailureIT {
    
      @MavenTest
      void case_one(MavenExecutionResult project) {
        ..
      }
    
      @MavenTest
      void case_two(MavenExecutionResult result) {
        ..
      }
    
      @MavenTest
      void case_three(MavenExecutionResult result) {
        ..
      }
    
      @MavenTest
      @MavenOption(MavenCLIOptions.DEBUG)
      void case_four(MavenExecutionResult result) {
        ..
      }
    
    }
    
    閉じるこの動画はお気に入りから削除されていますIntegration Testing Framework あなたは、相談することができますusers guide . あなたがリリースの状態を知っているような場合はrelease notes .
    あなたがアイデア、提案やバグを見つけた場合file in an issue on github .
    例のユースケースの例はfound on GitHub .