※ JUnit5のアップデートを知るための記事ではありません。私の知識アップデートをお伝えする記事になっています。
以前、ParameterizedTestに関する記事を書きました。その時は、テストコードの表現力を意識して、ArgumentsSource
を使ったほうが良いという結論を出していました。
しかし、もっとよりよい表現ができるテストが書けることを知ったので、それをアップデートした記事となります。
環境
- Java
- 15
ParameterizedTestのテスト表現方法を変更する
ParameterizedTest
にはname変数があります。デフォルトでは、「[{index}]{argumentsWithNames}」となります。
name変数に値を設定することで、テストを表現できます。
@ParameterizedTest(name = "契約日が{0}, 解約日が{1}の時、{2}")
staticが必要なクラスでstaticを使わずに済むようにする
デフォルトではテストのインスタンスはメソッドごとに作成します。しかし、TestInstance
アノテーションを使うことで、クラスごとの生成に変更することもできます。メリットとしては、staticでなければ使えないBeforeAll
やAfterAll
、ParameterizedTestで使用したいMethodSource
等を使用できるようになります。
個人的にはNested
と組み合わせて使用でき、ネストしたクラス内に処理を閉じさせることができる点が好きです。
@Nested @TestInstance(TestInstance.Lifecycle.PER_CLASS) class CanExpire { @MethodSource(value = "canExpire") @ParameterizedTest(name = "契約日が{0}, 解約日が{1}の時、{2}") void test_01(LocalDate start, LocalDate end, boolean result) { // 省略 } private Stream<Arguments> canExpire() { return Stream.of(); } }
※ なお、Java17からは不要になったようです。
JUnitのNestedなMethodSourceの注意点 - 日々常々
具体的にTestInstanceを変更するメリットを知りたい人は、参考先のStackOverflowを読んでください。
ソースコード
テストコード: github.com
終わりに
ParameterizedTest
のname
属性を追加するだけで、可読性が上がるので非常に便利です。以前のParameterizedTestも、値を一部だけ修正する方法が使えるので便利なんですがテスト結果の表示がちょっとだけイマイチでした。
ちゃんとテストを書きつつ、保守性が高いコードを書くためのテクニックを今後も磨いていきたいです。
この記事がお役に立ちましたら、各種SNSでのシェアや、今後も情報発信しますのでフォローよろしくお願いします。
類似
パラメータだけ変えて中身は同じテストをしたい(ParameterizedTest) nainaistar.hatenablog.com
参考
StackOverflow: What use is @TestInstance annotation in JUnit 5? stackoverflow.com