(4.7.1)を利用してJUnit5の公式ガイドの内容を実践してみる。Java、Eclipse、JUnitに関連した技術情報のブログです。(4.7.1)を利用してJUnit5の公式ガイドの内容を実践してみる。ユニットテストスポンサードリンクいよいよJUnit5が本格的に利用できる環境が整ってきました。Guide」の内容をより実践的で、読んで理解できるようにした内容となります。One」も4.7.1に対応したプロダクトがリリースされていますが、Mac環境でJUnit5を利用すると異常終了するので、オリジナルのEclipseを前提に説明させていただきます。(私の環境の問題かもしれませんので、Mac使いの方で正常に動作する方がいればコメントいただければ幸いです。)本エントリーの内容は以下の通りです。JUnit5のAnnotationJUnit4もある段階からアノテーションベースのプロダクトとなっており、アノテーションこそが肝であると言えます。JUnit5も同様で、アノテーションベースのプロダクトとなっています。利用可能なアノテーションの概要は以下の通りです。JUnit4のorg.junit.runners.Parameterizedに相当、パタメータで指定を変更してテストを実行することができます。テストを繰り返し実行したいときに利用します。動的テスト機能を利用するときに指定します。実行時にテストを生成し実行します。テストクラスのライフサイクルを指定できます。指定しない場合はJUnit4と同様にテストメソッド毎にインスタンスが生成されます。テストの表示名称を指定します。各テストメソッドの実行前に呼び出したいメソッドに付与します。JUnit4の@Before相当です。各テストメソッドの実行後に呼び出したいメソッドに付与します。JUnit4の@After相当です。任意のテストクラスの実行前に呼び出したいstaticメソッドに付与します。JUnit4の@BeforeClass相当です。任意のテストクラスの実行後に呼び出したいstaticメソッドに付与します。JUnit4の@AfterClass相当です。ネストされたstaticでないテストクラスであることを示します。@BeforeAllメソッドと@AfterAllメソッドは@Nestedテストクラスでは使用できません。テストのフィルタリングをするためのタグを指定します。JUnit4のCategoriesに相当します。テストを無効化するときに付与します。4の@Ignoreに相当します。カスタム拡張を登録するために利用します。実際の利用方法プロジェクトの作成とライブラリの追加プロジェクトを作成します。プロジェクト名にJUnit5Sampleと入力し「Finish」をクリックします。次にJUnit5のライブラリの参照を追加します。プロジェクトを選択して、マウスの右クリックメニューの「Properties」をクリックします。Library...」ボタンをクリックします。「JUnit」を選択し「Next>」をクリックします。「JUnit5」が選択されていることを確認後に「Finish」をクリックします。Close」をクリックします。Case」をクリックします。NameにFirstJUnit5Testsと入力し「Finish」をクリックします。生成されたファイルの中身を以下のように書き換えます。1);}}公式のサンプルとまった同じです。この例ではassertEqualsを利用して、「1+1は2になる」との検証を行っています。FirstJUnit5Testsを実行すると、@Testが付与されたmyFirstTestがUnitで実行されます。実行後の画面は以下のようになります。JUnitのお決まりのテストが成功すればグリーンバー、失敗すればレッドバーになるとの仕様となります。@BeforeAll、@BeforeEach、@AfterEach、@AfterAll@BeforeAll、@BeforeEach、@AfterEach、@AfterAllの各アノテーションの利用例は以下のようになります。{System.out.println("tearDownAll");}}テストメソッドはsucceedingTestとfailingTestですので実行するとEclipseのコンソールに以下の文字列が表示されます。View」-「Console」をクリックすると表示できます。@DisplayName@DisplayNameの利用例は以下のようになります。{}}実行すると結果は以下のようになります。@DisplayNameでDisplayNameが指定されているテストは指定値が、指定されていない場合はテストメソッド名が表示されていることが確認できます。一時的に実行対象から除外したい場合などに、対象のテストメソッドに付与します。DisplayNameDemo.javaのtestWithDisplayNameContainingSpecialCharactersに@Disabledを付与してみます。{}}実行結果は以下のようになります。testWithDisplayNameContainingSpecialCharactersの部分が白いアイコンで表現されています。skipped)とtestWithDisplayNameContainingSpecialCharactersをスキップしたことが見てとれます。@Tag利用シーンとしては、@TagでPTとITを指定しておいて、よし!、PTだけ実行することが考えられます。公式ではFASTとSLOW(明示的にこの文言はないですが)が例としてあげられていますが・・・@Tag(“model”)@Tag(“dao”)@Tag(“service”)@Tag(“controller”)なんかも付与しておくと色々便利かと思います。利用例は以下の通りです。Configurations..」をクリックします。package)を選択し、「Test」タグにある「Configure..」ボタンをクリックします。Tags」をチェックし、実行したいタグをその下のテキストボックスに入力し「OK」をクリックします。最後に「Run」をクリックします。タグ:fastを指定したので、@Tag(“fast”)が付与されているTaggingDemoクラスが実行されました。今度はテストメソッドに付与されているタグを指定して実行してみます。先ほどと同様の操作でsalariesを指定して実行すると以下のような結果となります。うんうん、ちゃんと指定したタグが付与されたテストメソッドだけが実行されました。Tags」ともに複数の値が指定可能ですのでGradleとCIツールを併用してテストを定期的に実行する環境を構築する際にはとても便利だと言えます。メタアノテーションを作成し利用することでタグの付与が楽になります。@TestInstanceテストクラスのライフサイクルを指定できます。指定可能な値はLifecycle.PER_CLASSとLifecycle.PER_METHODの2つです。@TestInstanceを指定しない場合は、Lifecycle.PER_METHODがデフォルトで、メソッド毎にテストクラスのインスタンスが生成されます。StandardTests.javaにどのインスタンスが利用されているかが分かるようにhashCodeの出力を追加してみます。{System.out.println("tearDownAll");}}実行するとコンソールに以下の内容が表示されました。hashCode:1497973285tearDownAllsucceedingTest実行時のインスタンスのハッシュコードは1486371051failingTest1497973285実行時のインスタンスのハッシュコードは1497973285と出力されており、Lifecycle.PER_METHODのライフサイクルで動作していることが見てとれます。今度は@TestInstance(Lifecycle.PER_CLASS)をクラスに付与してみます。{System.out.println("tearDownAll");}}実行結果は以下のようになりました。hashCode:655381473tearDownAllsucceedingTest実行時のインスタンスのハッシュコードfailingTest1497973285実行時のインスタンスのハッシュコードはともに655381473と出力されており、Lifecycle.PER_CLASSのライフサイクルで動作していることが見てとれます。@Nested字面通りネストしたテストを作成するときに利用します。@Nestedの例は以下の通りです。{System.out.println("WhereNew.whereNewTest");}}}実行結果は以下の通りです。コンソールの出力内容は以下の通りです。hashCode:1318822808TestingAStackDemo.tearDownAllとなっており、ルート(TestingAStackDemo)の@BeforeAllネスト1階層目(WhenNew)の@BeforeEach実際のテスト対象クラス(AfterPushing)の@BeforeEachテスト対象メソッドルート(TestingAStackDemo)の@AfterEachルート(TestingAStackDemo)の@AfterAllとの順番で呼び出されていることが見てとれます。@RepeatedTest繰り返し同じテストを実行したいときに利用します。@RepeatedTestの利用例は以下の通りです。repeatedCounter);}}繰り返し実行されていることを確認するために@TestInstance(Lifecycle.PER_CLASS)をテストクラスに付与しテストメソッドでrepeatedCounterをインクリメント、標準出力にrepeatedCounterを出力しています。(staticなカウンタ追加で確認できるので余分なステップが多いですね・・・)実行時のコンソールの出力は以下の通りです。repeatedCounter=10うんうん、繰り返し実行されていますね。上記の例ではrepeatedCounterとのインスタンスメンバを用意して、実行回数をカウントしましたが、JUnitがこの部分を用意してくれています。{displayName}、{currentRepetition}、{totalRepetitions}を埋め込むことで実現可能です。{displayName}は、@DisplayNameで指定したDisplayName{currentRepetition}は、現在の実行回数{totalRepetitions}は、@RepeatedTestのvalueで指定した値がそれぞれ展開されます。実装例は以下の通りです。{System.out.println(testInfo.getDisplayName());}}実行結果は以下の通りです。featureで、まだ実験的な位置づけとなりますので、今後拡張されていくようです。doubleの単一パラメータのみテストが実装可能となります。@ParameterizedTestと@ValueSourceの利用例は以下の通りです。argument);assertNotNull(argument);}}実行結果は以下の通りです。argument=200実行結果に表示されるテストケースの文言が、引数のパラメタとなるので可読性としては良くありません。@ParameterizedTestのnameで表示される文言を指定することで解消できます。argument);assertNotNull(argument);}}実行結果は以下の通りです。argumentとなります。...​は@CsvSourceのところで利用例をあげさせていただきます。@CsvSource@ValueSourceの各パラメタの要素がStringのCSVになったアノテーションとなります。利用例は以下の通りです。second);assertNotNull(first);assertNotNull(second);}実行結果は以下の通りです。@ParameterizedTestのnameで指定している{0}にパラメタCSVの第一要素が、{1}に第二要素が展開されていることが確認できます。カンマを含んだ文字列を指定したい場合は以下のように指定します。second);assertNotNull(first);assertNotNull(second);}@CsvFileSourceCSVファイルを指定できるアノテーションです。利用例は以下の通りです。second);}実行するまえにsrc直下にtwo-column.csvファイルを以下の内容で作成しておきます。3実行結果は以下の通りです。うんうん、CSVファイルの中身をパラメタとしたテストが実行されていることが確認できました。脇道にそれますが、@CsvFileSourceや@CsvSourceを利用してパラメタをクラスにマッピングすれば、テストコードの実装時の生産性向上に大きく寄与すると思いますので、簡単な例を作成してみました。testData.getSecond());}}CsvTestData.javaは以下の通りです。{}}csvtestdata.csvの中身は以下の通りです。second=3CSVにフィールド名=値とのデータを作成しておき、リフレクションでインスタンス生成と値のセットを行い生成したインスタンスに対して検証を行っています。リフレクション部分を共通化すれば実際の業務でも利用できると思います。きれいにしてみました。testData;}}@EnumSource名前のとおりですが、Enumをパラメタに指定してテストを実行するときに利用します。シンプルな利用例は以下の通りです。{assertNotNull(timeUnit);}}実行結果は以下の通りです。TimeUnitで定義されている全ての値を引数としてテストが実行されていることが確認できます。特定の値だけのテストの例は以下の通りです。“HOURS”以外の値を指定したテストメソッドとなります。testWithEnumSourceIncludeの実行結果は以下の通りです。testWithEnumSourceExcludeの実行結果は以下の通りです。@ArgumentsSourceArgumentsProviderインターフェースを実装したクラスを@ArgumentsSourceで指定することで、テストデータの再利用性を高めることができます。利用例は以下の通りです。"bar").map(Arguments::of);}}}実行結果は以下の通りです。@TestFactoryJavaには、C#のデリゲートやRubyのブロックなどに相当する考え方が存在しないので、JUnit4以前では、コンパイル時にテストメソッドを確定する必要がありました。(イマイチな言い回しですね・・・)@TestFactoryを利用すればコンパイル時ではなく、実行時までテストメソッドの確定を遅延させることができます。逆にコンパイルは通るけど、前提条件に依存せずに。絶対に失敗すテストを書くこともできます。@TestFactoryをうまく利用するとテスト実装時の生産性が格段に向上すると言えます。テストしている内容の見通しが悪くなるので、複雑なテストには不向きであるとも言えます。@TestFactoryの利用例は以下の通りです。assertFalse(input.isEmpty())))))));}}dynamicTestsWithInvalidReturnTypeが全体に失敗する例となります。org.junit.jupiter.api.DynamicNode.だそうです。実行結果は以下の通りです。実際には何に使うねん!、と思い例を考えてみました。ユニットテスト時にはよくはprivateメソッドをリフレクション経由で参照したり、更新したりしますよね。このような時に、対象クラスのフィールド名をリテラルでテストに埋め込むのが嫌なので、対象クラスにフィールド名を保持するメンバを設けることにしています。例としては以下のようになります。"password";}これぐらいだったらgetter、setter書けよ!!って思うのですが、例ですので・・・このFIELD_NAME_IDとFIELD_NAME_PASSWORDに定義している文字列に対応するフィールドが存在しているか、とのテストを@TestFactoryを利用して実装してみました。dynamicTests;}}実行結果は以下の通りです。うんうん、ダイナミックなテストの感じがまあまあ出ている例になったのではないでしょうか。@ExtendWtih@ExtendWtihを利用すると色々テストを拡張できます。@ExtendWtihで拡張インターフェースを指定することでテストの動作を拡張可能です。@ExtendWtihで指定可能なインターフェースJUnit5が提供している拡張インターフェースは以下の通りです。ObjectExecutionConditionExecutionConditionの利用例として、今日が1日だったらテストを実行し、それ以外は実行しない例を作成してみました。ExecutionConditionの実装クラスは以下の通りです。1");}}@ExtendWith(MonthlyExecutionCondition.class)を付与するクラスは以下の通りです。{System.out.println("testContainerExecutionCondition");}}上記の例ではクラスに@ExtendWith(MonthlyExecutionCondition.class)を付与していますが、メソッドにも付与できます。実行結果は以下の通りです。今日は1日ではないのでテストが実行されませんでした。実行結果のtestContainerExecutionConditionは白いアイコンで表現されており、@Disabledと同様の結果となりました。AfterAllCallback「@ExtendWtihで指定可能なインターフェース」で記載させていただいた通りですが、任意のタイミングで処理を行いたい場合に利用します。各インターフェースを利用する例は以下の通りです。{System.out.println("tearDownAll");}}各インターフェースの実装クラスは以下の通りです。{System.out.println("AfterAllCallbackImpl.afterEach");}}実行時のコンソール出力は以下の通りです。Eclipse[2:プリミティブ型(基本データ型)とは]他のプログラミング言語と同様に、Javaにもデータ型が存在します。リリースさ記事を読むEclipse(4.3,4.4)のJava言語のリファクタリング機能の使い方[リファクタリングの説明と「名前変更」と「移動」]本エントリーでは、Eclipse(4.3,4.4)の「リファクタリング」機能の使い方を説明させていた記事を読むJUnit入門その8[Eclipse4.4のJUnitプラグインのテストケースのカバレッジをEclEmmaを利用して測定してみる]今回は「EclEmma」を使って、テストのカバレッジの測定を行うエントリーとなります。WebDriverでJava/Junit4を利用したテス記事を読むEclipseの使い方(Windows環境のEclipse4.3、Eclipse4.4)Eclipse4.4.0よりJDK8を正式サポートするそうです。Eclipseトップレベルプ記事を読むEclipseの使い方(Eclipse4.4のブックマーク機能とタスク機能)今回は、Eclipseのブックマーク機能とタスク機能の説明をさせていただきます。64bitとなります。コメントをキャンセルメールアドレスが公開されることはありません。(4.7.1)を利用してJUnit5の公式ガイドの内容を実践してみる。JUnit5が本格的に利用できる環境が整ってきました。(4.7.1)を利用してJUnit5の公式ガイドの内容を実践してみる。Java、Eclipse、JUnitに関連した技術情報のブログです。