有名なJavaユニットテストフレームワークであるJunit 4は、長い間外出されてきました。当時、私はJunit 5がベータ版であることがわかったので、Junit 5を紹介するために記事を書くつもりでした。しかし、それはまだベータ版であるため、一部の部分は完璧ではなく、私は少し怠zyであり、それらをうまく書いていません。私は最近この事件を突然思い出しました。公式ウェブサイトで確認したとき、9月10日にJunit 5の公式バージョンがついに登場したことがわかりました!それから私はたまたま再び記事を書き、最新のJunitフレームワークを紹介しました。
フレームワーク構造
Junit 4と比較して、Junit 5の構造は非常に明確で、カスタムプラグイン、IDEテスト実行などの拡張機能を適切にサポートします。これはプロジェクト構造から見ることができます。
Junitプラットフォーム
このグループのパッケージ名はorg.junit.platformです。名前からわかるように、このグループの主な機能は、テストフレームワークの基本的なプラットフォームとして機能することです。このパッケージの下のモジュールには、基本的なAPI、実行エンジンとエグゼキューター、基本的なコマンドライン実行関数、コマンドラインインターフェイス、MavenおよびGradleテストプラグイン、その他の基本機能が含まれます。
Junit Jupiter
JupiterはJunit 5のコード名です。このパッケージの下のモジュールには、Junit 5の主な機能が含まれています。Junit5を使用する場合は、このモジュールのセットを含める必要があります。
Junit Vintage
ヴィンテージは、Junitの古いバージョンのコード名です。このパッケージの下のモジュールを使用すると、新しいJunitプラットフォームで古いJunit 3と4のテストを実行できます。
クラスライブラリをインポートします
Junit 5はまだベータ段階にありますが、公式文書にはMavenとGradleにJunit 5を統合した例があります。しかし、公式バージョンでは、この部分の内容が消え、サンプルプロジェクトへの2つのリンクのみを残して、それを参照してみましょう(コピーと貼り付け)。
Mavenを使用します
Junit5-Maven-Consumerは、公式のMavenの例です。私はもともとここに関連するPOM構成を投稿するつもりでしたが、Mavenの構成が長すぎることを見たとき、私はそれを忘れたほうがよいでしょう。要件がある場合は、このプロジェクトのPOM構成を自分で確認してください。
Gradleを使用します
Gradleを使用する場合、この問題ははるかに簡単です。 Junit5-gradle-sumerサンプルプロジェクトには詳細な説明もあります。
まず第一に、GradleはデフォルトでJunit 5をサポートしていないため、Junit Platform Gradleプラグインをサポートするために有効にする必要があります。
buildscript {repositries {mavencentral()}依存関係{classpath 'org.junit.platform:junit-platform-gradle-plugin:1.0.0'}}プラグインを適用する: 'org.junit.platform.gradle.plugin'次に、このGradleプラグインの構成があります。デフォルトでは、すべてのエンジンとタグが実行されます。特定のエンジンとタグのみのテストを実行することを選択したい場合は、以下を除外して、自分のニーズに応じて変更できます。もちろん、これらの高度な要件がない場合は、この部分を削除できます。
junitplatform {// platformversion '1.0.0' filters {engines {// include 'junit-jupiter'、 'junit-vintage' //除外「カスタムエンジン」}タグ{//「高速」除外「slow」} // includeclassnamepattern '。*test'} file( 'build/test-results/junit-platform')//これはデフォルトです// logmanager 'org.apache.logging.log4j.jul.logmanager'}Junit 5テストのみを実行する必要がある場合は、次の2つの依存関係をインポートするだけです。 Junitプラットフォームの依存関係は自動的にインポートされます。
依存関係{testCompile( "org.junit.jupiter:junit-jupiter-api:5.0.0")testruntime( "org.junit.jupiter:junit-jupiter-engine:5.0.0")}新しいプラットフォームで古いJunit 3および4のテストを実行する場合は、次の依存関係をインポートする必要があります。
依存関係{testCompile( "junit:junit:4.12")testruntime( "org.junit.vintage:junit-vintage-engine:4.12.0")}テストを書きます
Junit 4テスト
以前のすべての構成が完了した場合は、今すぐテストの書き込みを開始できます。まず、古いJunit 4テストを確認しましょう。
public class junit4test {@beforeclass public static void init(){system.out.println( "before class");}@afterclass public static void clean(){system.out.println( "after class");} {system.out.println( "after");}@public void test1(){system.out.println( "test 1");}@test public void test2(){System.out.println( "test 2");}}}}Gradleテストとその他のコマンドを使用して、このテストを実行します。結果はこれに似ています。
ClassBeForetest 1Test 2 Afterクラスの前
Junit 5テスト
同等のJunit 5テストの書き方を見てみましょう。最も明白な変化は見ることができます。まず、いくつかの注釈がより有名な名前に改名されました。もう1つのポイントは、テスト方法がパブリックメソッドである必要がないため、キーボードを数回少なく入力できることです。
public class junit5test {@beforeall static void beforeall(){system.out.println( "before all");}@afterall static void afterall(){after "after");} {system.out.println( "effore");}@test void test1(){system.out.println( "test 1");}@test void test2()void test2(){system.out.println( "test 2");}}}}アサーションを書く
テストケースが正しいことを確認するには、いくつかの主張を書く必要があります。 Junit 5には、テストケースを書くのに役立つ多くの主張が付いています。さらに、これらのアサーションには、Java 8の使用に非常に適したLambda式を受け入れることができる過負荷バージョンが付属しています。もちろん、私は個人的には、Asrtjがより便利だと思います。
Static org.junit.assert.asserttrueをインポート; Intemptic static org.junit.junit.api.assertions。*; public class assertiondemo {@test void testAssertion(){assertequals(10、10); asserttrue(true); Assertequals(100、100、「2つの等しい数字」); assertall( "number"、() - > assertequals( "name"、 "name")、() - > assertequals(500、500)); assertthrows(nivalidparameterexception.class、() - > {new newidparameterexception();}); int result = asserttimeout(duration.ofseconds(5)、() - > {int i = 0、j = 0; Assertequals(100、result); }}依存関係インジェクション
これで、テストクラスのコンストラクターとテスト方法の両方がパラメーターを受け入れることができます。パラメーター溶液インターフェイスは、実行時にパラメーターを注入する方法を定義します。いくつかの組み込みにより、テストケースのランタイムに関する情報を取得できます。
最初はTestInfoparameterResolverです。メソッドにタイプのtestInfoのインスタンスがある場合、Junit 5フレームワークはインスタンスを自動的に挿入します。このインスタンスのいくつかの方法では、テストクラスおよびテスト方法の名前、表示名、ラベル、その他の情報を取得できます。
public class Class DependencyInjectionDemo {@test @displayname( "依存関係噴射")@tag( "test")void testdisplayname(testinfo testinfo){assertequals( "依存関係インジェクション"、testinfo.getdisplayname(); Assertequals(collections.singleton( "test")、testinfo.gettags()); }}また、後で導入されるrepetitionInfoparameterreSolverなどの組み込みパラメーターパーサーもあります。
一般的な注釈
表示名
テストランナーとテストレポートによって表示されるテストクラスとテスト方法にカスタム名を追加できます。表示名は変数名のように表示されません。スペースを含む長い弦、または絵文字の絵文字でさえあります。
@displayname( "テストクラスは表示名を指定できます")パブリッククラスdisplaynamedemo {@test @displayname( "テストメソッドもディスプレイ名を指定できます")void testwithdisplayname(){} @test @test @displayname( "ディスプレイ名はまた、emoticonsを含む可能性があります。 {}}テストを無効にします
@Disabled Annotationは、テストクラスまたはテスト方法で使用でき、対応するテストを無効にすることができます。
@disabledpublic class disabledtestdemo {@test // @disabled void testdisabled(){}}テストを繰り返します
テスト方法を複数回実行する必要がある場合は、@RepeateDTESTアノテーションを使用してください。
public class RepeatedTestDemo {@RepeatEdTest(10)void testRepeated10Times(){}}また、インスタンスのrepetitionInfoを挿入して、現在の繰り返しと繰り返しの総数を確認することもできます。
public class RepeatedTestDemo {@beforeeach void beforeeach(RepetitionInfo info){system.out.printf( "%d -%d/n"、info.getCurrentrepetition()、info.getTotalRepetitions();}@RepeateDTest(10)void testRepeated10times(){){)タグが付属しています
Gradleの構成を導入したとき、構成内の特定のラベルをフィルタリングすることを選択できると言いました。また、コードにタグを提供することも非常に簡単です。@Tag Annotationを使用するだけです。
@tag( "taggedtest")public class tagdemo {@test @tag( "taggedtest1")void testwithtag1(){} @test @tag( "taggedtest2")void testwithtag2(){}}}}ネストされたテスト
特定のテスト間の包含関係を示すために、ネストされたテストが必要になる場合があります。ネストされたテストでは、@Nested Annotationを使用します。
@displayname( "out outer test")public class Nesteddemo {@test void testouter(){} @nested @displayname( "inner test")class innertestdemo {@test void testinner(){}}}}}静的な内部クラスのみがネストされた注釈を使用できることに注意する必要があります。さらに、Javaでは内部クラスに静的な方法があることを許可していないため、@beforeallおよび@afterallアノテーションを持つことはできません。この制限を突破したい場合は、ネストされた内部クラスに@testinstance(lifecycle.per_class)注釈を追加する必要があります。詳細については、テストインスタンスライフサイクルを参照してください。
IDEサポート
Junit 5は今出てきましたが。ただし、さまざまなツールチェーンのサポートは維持されていません。現在、IntellijのアイデアとEclipse 4.7(酸素)のみがJunit 5をサポートしています。したがって、正式な状況にある場合は、Junit 4を使用する方が安全です。
よくある質問
@Testアノテーションの異なるバージョンを区別します
この記事を書いていたように、テストの例で問題が発生しました。テストを渡すことができず、以下のエラーメッセージが表示されます。
障害(1):junit vintage:yitian.study.test.assertiondemo:initializationerror classsource [classname = 'yitian.study.test.assertiondemo'、fileposition = null] => java.lang.except
英語の良い学生はそれを認識できるはずです。このエラーメッセージには、テスト方法が公開されている必要があると述べています。しかし、前述のように、Junit 5がこの制限をキャンセルしたのに、なぜこのエラーがまだ発生するのですか?私は注意深く見て、エラーを見つけました。 Junit 4が過去に多く使用されていたため、IDEは@Test Annotationのデフォルトで自動的に完了したためです。
Import org.junit.test;
このパッケージは、Junit 4に基づく@Testアノテーションです。Junit5を使用する場合は、次の@Testアノテーションが必要です。
org.junit.jupiter.api.testをインポートします。
変更した後、テストを再度実行してください。実際に問題はありませんでした。もちろん、学習と使用のために、Junit 4パッケージも参照するため、この競合が発生します。特別なニーズがない場合は、混乱を防ぐためにJunit 5 jarパッケージのみをインポートすることをお勧めします。もちろん、それらをすべてインポートすることは問題ありませんが、それらを区別するように注意する必要があり、Junit 5テストにJunit 4アノテーションを書かないでください。最後に、テストの例を添付します。興味のある人は見ることができます。
要約します
上記は、Junit5関連のコンテンツに関するこの記事の内容全体であり、誰にとっても役立つことを願っています。興味のある友人は、このサイトの他の関連トピックを引き続き参照できます。欠点がある場合は、それを指摘するためにメッセージを残してください。このサイトへのご支援をありがとうございました!