エンジニアの中村です。JavaでのテストフレームワークといえばJUnitですが、最新版のJUnit5がかなり使いやすくなっています。多くのJUnit5紹介記事がありますので、改めて私が細かく説明することもないかと思いますが、個人的に嬉しいと思った機能を中心に紹介したいと思います。初版がリリースされてから1年がすぎて、普通に使うには十分な環境になっているのではないかと思います。IDEAでもサポートされ、メソッド単位のテスト実行や実行したテストケースの一覧表示など、これまでのJUnit4と変わらずに使うことができます。Springのテストモージュルでも対応され、JUnit5向けのテスト拡張クラスが提供されています。私が簡易に試した限りではMockMVCなども問題なく使えました。IDEAでもサポートSpringのテストモジュールは標準はJUnit4だが、JUnit5対応もありMockMVCなども利用可能JUnit5のおすすめ機能紹介JUnit5はJUnit4に比べて色々な機能が変わっています。どの機能も、JUnit4のときに書きづらかったことを上手く改善するもので、「これがやりたかった」と思えるようなものです。多くの機能があるので全ては説明できませんが、個人的に特にありがたいと思えるものを以下で紹介します。@Nestedテストクラスの中で、インナークラスを使ってテストを階層化することができるようになりました。Enclosedを使うことで階層化自体はできていました。JUnit4の階層化は親クラスと子クラスが独立していて、別々のファイルに書くのと変わりがないようなものでした。それに対して、JUnit5の階層化は親クラス側のメンバ変数やBefore/After系メソッドなどが、子クラス側でも利用できます。下記にあるサンプルコードだと、FindOneクラスのテストメソッドにおいて、親クラス(HelloTest)のservice変数を使っています。HelloTest.teardown()の順番で実行されます。これにより、個別のコンテキストだけの変数や事前処理/事後処理を構造化して記述できるようになり、テストコードをかなり読みやすく作成できるようになっています。個人的には、この機能のためだけでもJUnit5を使いたいと思えるものです。Testは、一部の値だけが違うテストケースを一括して定義できる機能です。JUnit4でも同様の機能はありましたが、それよりもかなり簡単に、読みやすく実装できるようになっています。Testは、1つのクラスで1メソッドだけしか定義できないような感じのものでした。それがJUnit5では、テスト用のパラメータのリストをアノテーションで簡潔に記述し、テストメソッドの引数でパラメータを受け取るという方式になっています。@CsvSourceでテストケースを1行ずつ記述し、実行時にはその文字列を引数の型にあわせて型変換してくれます。@CsvSourceを用いた例ですが、これ以外にもテスト用パラメータを渡す方法は、何パターンも用意されています。実行すると以下のように表示され、CSVの1行ずつが個別のテストケースとして扱われていることがわかります。動的なテスト生成@Testアノテーションの代わりに@TestFactoryをつけたメソッドでテストケースをプログラムで生成することができます。メソッドの戻り値としてDynamicTest.dynamicTest()メソッドで生成したテストケース(DynamicTestクラスインスタンス)のStreamやコレクションを返すと、そのテストケース群を実行してくれます。ParameterizedTestはパラメータの違いだけでしたが、より柔軟なテストバリエーションを生成することができます。注意点として、生成した個々のテストケースの実行時にはテストクラスが個別には生成されず、@Before系、@After系も個別には実行されません。@TestFactoryの実行が@Testと同等に1つのテストケースとして実行されます。}));}AssertionJUnit5のassert系メソッドは基本的なものだけを提供し、適宜好きなアサーションモジュール(AssertJ、Hamcrestなど)を選択して利用することを推奨しています。Lambdaを使ったアサーションは便利なものがあります。assertAllは複数のアサーションの結果を一括で確認することができます。これでアサーションの結果を1つ直しては次のアサーションが失敗し、それを直すとまた次が、といったことを回避できます。assertThrowsは例外の発生を確認するassertメソッドです。JUnit4ではテストメソッドから例外で抜け出たときに検証する方式だったので、例外発生後の状態を確認するようなテストが書きにくかった面がありました。assertThrowsを使えばこの問題を解消することができます。exception.getMessage());}テストの拡張機能JUnit4ではテストの事前処理や事後処理などを汎用的に実装するための機能として、@RunWithや@Ruleなどのテスト拡張機能がありました。JUnit5では、これらのテスト拡張機能が廃止され、@ExtendWithに置き換わっています。@RunWithは、1クラスに1つしか指定できなかったため、複数の拡張を同時に使用することができませんでした。そのため、Springのための@RunWith(SpringRunner.class)を使うと@RunWith(Parameterized.class)が使えないなど、便利な機能を上手く活かしずらいことがありました。@ExtendWithは同じクラスに複数指定することができ、この手の問題が解消されました。アノテーションJUnit5では、アノテーションで設定をする方式になっています。このとき、複数のアノテーションをひとまとめにしたアノテーションを作ることができます。プロジェクト内でテスト実装時のルールを「決まったアノテーションをつける」というように活用することができます。テストクラスに対して、クラス継承を使わずに同じ設定を指定できるのも利点となります。}}JUnit4からの移行JUnit5を新規のプロジェクトで使い始めるのは困ることはないと思います。それに対して、ここでは既にJUnit4を使っている既存のプロジェクトへの導入方法を紹介します。JUnit4との共存JUnit5とJUnit4の共存状態を作るのは簡単です。以下のモジュールをすべて依存に含めるだけで対応完了です。共存する状態では、あるテストクラスはJUnit4で記述し、また別のクラスはJUnit5で記述する、ということができます。testなどのテスト実行コマンドでJUnit5が実行されるようになります。そのままではJUnit4で記述したテストクラスは実行されません。そこにjunit-vintage-engineモジュールを依存に含めると、JUnit4のテストも拾って実行してくれるようになります。この時のJUnit4のテストは、JUnit4のままで実行されるのでコードの書き換えなどは不要です。これにより、既存のJUnit4のテストコードはそのままで、新規テストクラスはJUnit5で実装できるという環境ができあがります。JUnit4からJUnit5へ書き換えるJUnit5の記述方法を丁寧に説明すると量が多くなりすぎるので、ざっくりとJUnit4を書き換えるイメージでその違いを説明します。テストのアノテーションを書き換えるJUnit5のアノテーションは、JUnit4のものとは別物になっています。これは共存して利用できるようにするために意図的に流用しなかったのだと思います。そのため、今までのJUnit4をJUnit5に書き換えるには、アノテーションを変更していく必要があります。基本的にはパッケージ名が変わっているのでそれを一括で置換します。その上で、一部のアノテーションの名称が変わっているのでそれを修正します。JUnit5のorg.junit.jupiter.api.Testアノテーションがついていれば、そのテストメソッドはJUnit5で動くことになります。@RunWith、@Ruleを@ExtendWithで置き換える@RunWith、@RuleはJUnit5では無くなったので、@ExtendWithに置き換える必要があります。これらのアノテーションの引数に指定するテスト拡張クラスには互換性がないので、拡張クラス自体をJUnit5流で実装しなおす必要があります。Springなどのフレームワークが提供していた拡張クラスは、フレームワーク側がJUnit5版の拡張クラスを提供してくれているかを確認し、置き換えることになります。まとめJUnit5の中で個人的に有り難い機能を挙げてみましたが、実際にはもっと多くの機能があります。Guideがかなり丁寧で内容も充実しているので、サンプルコードにざっと目を通してみるのをおすすめします。ユーザガイドJUnit5は、今までのJUnit4でちょうど困っていたようなポイントが解消され、とても書きやすく、また読みやすくテストを実装できるようになっていますので、ぜひ触ってみてください。エンジニア募集エムスリーでは自身で手を動かし、技術で医療の課題を解決するエンジニアを募集しています。07:00JUnit5を使おうTweet関連記事2019-12-20Scalaで参照透過に作用を扱うエムスリーエンジニアリンググループの冨岡です。AI・機械学習チームの笹川です。月別アーカイブ注目記事はてなブログをはじめよう!m3techさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。