Mavenプラグインテスト-現代の方法で-パート3
24111 ワード
Mavenビルドのログ出力をチェックしながら、基本的な統合テストを行う方法を見ました.
この第3部では、Mavenが統合テスト中にどのようにデフォルトで呼び出されるか、どのようにその行動に影響を与えるかについて飛び込みます.
次の基本的な統合テストを始めましょう(現在テスト中のプロジェクトを無視します)
つまり、統合テストフレームワーク内の各実行は次のように行われます.
これまでのところ、とても良いが、時々、あるいは、よりしばしば頻繁に、統合テストとの関係で特にMaven呼び出しに他のコマンドラインオプションを加えるのに必要です.
時々、あなた自身のプラグイン/拡張はデバッグレベルに関するいくつかの役に立つ情報を印刷するでしょう、しかし、それをテストする方法?私たちは、統合テストのために使用されるオプションがデバッグオプションを含んでいない前に言及しました.
我々は今、これを介して必要性を表現することができます
Mavenのコマンドラインオプションには補足情報が必要です
このような静的輸入なしのコース作業(好みの問題)
すべてのテストケースに対してではなく.
ちょっと待って.実行したい
今、通常の開発者の質問:私は本当に怠惰な私はすべてのこれらの4つを書きたくない
もちろん、その問題に対するより便利な解決策があります.これをメタアノテーションと呼ぶ.我々は、単に私たちが呼び出すメタアノテーションを作成することができます
あなたがアイデア、提案やバグを見つけた場合file in an issue on github .
例のユースケースの例はfound on GitHub .
この第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 .
Reference
この問題について(Mavenプラグインテスト-現代の方法で-パート3), 我々は、より多くの情報をここで見つけました https://dev.to/khmarbaise/maven-plugin-testing-in-a-modern-way-part-iii-16jcテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol