6
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ひとりJUnitAdvent Calendar 2022

Day 6

JUnit5の@ParameterizedTestでテストの表示名を整える

Posted at

はじめに

ひとりJUnitアドベントカレンダー5日目の記事です。
クロアチア戦見ながら書こうと思ったのに全然進まなくて困った。日本代表お疲れ様でした。

@ParameterizedTest実行時のテスト名は元々いい感じ

そうなんです。デフォルトでもややいい感じなんです。
例えば、@ValueSourceStringを受け取って暗黙の型変換する時は以下のような表示。

  @ParameterizedTest
  @ValueSource(strings = {"Bob", "Tom"})
  void test(Student student) {
    System.out.println(student);
  }

image.png
テストのindexと、その時に引数で渡される値が並んでいますね。

引数二つ+@MethodSourceの時は以下のような表示です。

  @ParameterizedTest
  @MethodSource("studentProvider")
  void test(Student student, int number) {
    System.out.println(student);
    System.out.println(number);
  }

  static Stream<Arguments> studentProvider() {
    return Stream.of(
        arguments(new Student("Bob"), 25),
        arguments(new Student("John"), 30)
    );
  }

image.png
indexとtoString()した結果が表示されます。
toString()をLombokなどで実装していない場合はクラス名@hashCodeが出ます。

さらにいい感じになるポテンシャル

秘めていなくもないです。正直デフォルトのままで十分感はありますが。

上の画像でtest(Student, int)と表示されている部分は@DisplayName
[1] Student(name=Bob), 25と表示されている部分は@ParameterizedTestで、
それぞれ表示内容を指定できます。

また、@ParameterizedTestで指定する方では以下の変数も使えます。

{}の中に入れる文字 表示内容
index そのテストが繰り返し中の何番目のテストか(1始まり)
数字 そのテストに渡される第(n+1)引数
arguments そのテストに渡される引数をカンマ区切りで結合したもの

説明だとわかりにくいので実例ですが、
以下のように二つのアノテーションに値を渡してみます。

  @DisplayName("DisplayNameに設定した値はここに表示")
  @ParameterizedTest(name = "index -> {index}, 数字 -> {0}, arguments -> {arguments}")
  @MethodSource("studentProvider")
  void test(Student student, int number) {
    System.out.println(student);
    System.out.println(number);
  }

実行結果は以下の通り。
image.png
{index}はテストのindex、{数字}は引数の内容、
{arguments}は全引数に、それぞれ置き換えられています。

正直、ある程度の可読性は引数の変数名やテストメソッド名で担保してほしいと思うので、
この機能の活用にどれほどの情熱を傾けるかはそれはそれで考える余地がありそうですが、
例として以下のケースを考えてみます。

  @ParameterizedTest
  @CsvSource(value = {"152, 10, 200", "2635, 100, 3000", "4239, 10, 4200"})
  void roundTest(int base, int target, int expected) {
    assertThat(hogeService.round(base, target), is(expected));
  }

roundという言葉の通り、四捨五入を行う処理のテストです。
こちらのテスト、デフォルトでの実行結果は以下になります。
image.png
まあ確かに、これだけでは何をやってるのかさっぱりわかりません。

そこで、ちょっと記述はゴテゴテしますが、
以下のようにアノテーションをふんだんに活用してみると・・・

  @DisplayName("四捨五入のテスト")
  @ParameterizedTest(name = "ケース{index} {0}を{1}の位で四捨五入すると{2}になること")
  @CsvSource(value = {"152, 10, 200", "2635, 100, 3000", "4239, 10, 4200"})
  void roundTest(int base, int target, int expected) {
    assertThat(hogeService.round(base, target), is(expected));
  }

実行結果はこんな感じ。
image.png
よくわかりますね。

別で作ったテストケースがあってそれと見比べたいとか、
何かしらのテスト記録をどこかしらに提出しないといけないとか、
常に広く使えるというわけではないものの、特定の場面では結構輝きそうな気がしました。

IDEで見ている分には恩恵を感じなかったためあまり推していませんでしたが、
CI/CDの通知のような、実際に落ちたテストコードをすぐに参照できず、
どのテストが落ちたのかを少量の情報から端的に知りたい場面では有用かもしれません。

6
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?