• 2019年5月28日火曜日
アリスト戦記
アリスト戦記 https://blog.aristo-solutions.net/2019/05/junit5assertall.html

JUnit5のアサーションをグループ化する「assertAll」

JUnit5には「assertAll」というアサーションがある。

これは複数のアサーションをグループ化するものだ。
ユニットテストの本質である、値が期待通りかをチェックする機能ではなく、ソース整理の為の機能であると言える。

用途

出番が来るのは、テスト対象となるリターン値がString一発とかそういう分かり易いのではなく、複数パラメータを持っている場合だな。

例えば、以下のようなメソッドをテストしたいとする。

public Map<String, String> getSampleParam() {

   Map<String, String> map = new HashMap<String, String>();

   map.put("handle_name", "アリストマスター");
   map.put("real_name", "Tacy");

   return map;

}

リターン値はマップだから複数の値を照合しなければいけないわけだけど、これをどうやるか?

直球のやり方

普通のテストケース

まず、特に深い事を考えずに普通にテストケースを書くとこうなる。


@Test
public void test1() {

   Map<String, String> actual = getSampleParam();

   assertEquals("アリストマスター", actual.get("handle_name"));
   assertEquals("Tacy", actual.get("real_name"));

}

まあ、これでも別に問題は無いわけだが、テストがコケた時に少々不便がある。

コケた場合

テストを敢えてコケさせてみよう。

@Test
public void test1() {

   Map<String, String> actual = getSampleParam();

   assertEquals("にゃん", actual.get("handle_name"));
   assertEquals("ぽこ", actual.get("real_name"));

}

このテストケースの実行結果は以下のようになる。


ほら、結果が一個しか出てないでしょ?

普通にassertEqualsを連発した場合、最初にコケた時点で試験が終了する。

これが仕様なんだな。

assertAllを使ったやり方

では、assertAllを使ってコケさせてみよう。

コケた場合

assertAllを使うとこういう書き方になる。

@Test
public void test2() {

   Map<String, String> actual = getSampleParam();

   assertAll(
         () -> assertEquals("にゃん", actual.get("handle_name")),
         () -> assertEquals("ぽこ", actual.get("real_name")));

}

その実行結果がこちら。



結果が2つ出ている。
つまり、assertAllの中でコケた場合、テストが途中で終わらず最後までやってくれる。

コケた場合に全容がパッと見えて見易いというわけだ。

これがassertAllの機能だ。

見易さは大事

ここで訴えておきたいのは、ユニットテストは「ちゃんとテスト出来てれば良いじゃん!!」というものではないということだ。

直球のassertEquals連発方式でも別に品質が下がるなんてことは無い。
しかし、複数セットで1つのテストは、assertAllでグループ化しておいてくれた方が分かり易いし、見易い。
だからassertAllは使うべき。

こういう小さな改善を重ねていくのが大事なのだ。

0 件のコメント:

コメントを投稿