きり丸の技術日記

技術検証したり、資格等をここに残していきます。

Javaで最近使っているParameterizedTest【2021年版】

※ JUnit5のアップデートを知るための記事ではありません。私の知識アップデートをお伝えする記事になっています。


以前、ParameterizedTestに関する記事を書きました。その時は、テストコードの表現力を意識して、ArgumentsSourceを使ったほうが良いという結論を出していました。

しかし、もっとよりよい表現ができるテストが書けることを知ったので、それをアップデートした記事となります。

環境

  • Java
    • 15

ParameterizedTestのテスト表現方法を変更する

ParameterizedTestにはname変数があります。デフォルトでは、「[{index}]{argumentsWithNames}」となります。

f:id:nainaistar:20210514190004p:plain

name変数に値を設定することで、テストを表現できます。

@ParameterizedTest(name = "契約日が{0}, 解約日が{1}の時、{2}")

f:id:nainaistar:20210514190017p:plain

staticが必要なクラスでstaticを使わずに済むようにする

デフォルトではテストのインスタンスはメソッドごとに作成します。しかし、TestInstanceアノテーションを使うことで、クラスごとの生成に変更することもできます。メリットとしては、staticでなければ使えないBeforeAllAfterAll、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

終わりに

ParameterizedTestname属性を追加するだけで、可読性が上がるので非常に便利です。以前のParameterizedTestも、値を一部だけ修正する方法が使えるので便利なんですがテスト結果の表示がちょっとだけイマイチでした。

ちゃんとテストを書きつつ、保守性が高いコードを書くためのテクニックを今後も磨いていきたいです。


この記事がお役に立ちましたら、各種SNSでのシェアや、今後も情報発信しますのでフォローよろしくお願いします。

類似

パラメータだけ変えて中身は同じテストをしたい(ParameterizedTest) nainaistar.hatenablog.com

参考

StackOverflow: What use is @TestInstance annotation in JUnit 5? stackoverflow.com

f:id:nainaistar:20210514190327p:plain