「@ParameterizedTest」を利用してバリデーションのテストを効率化します。
@ParameterizedTestとは
複数のパラメータをテストメソッドに渡して、複数回テストすることが可能になります。
なので、インプットによって条件分岐があるコードのテスト等で複数テストメソッドを用意することなく一つのテストメソッドでカバレッジを満たすことできます。
テストコード
以下のメソッドのテストコードをかくとします。
public String outPutInfo(String name, int age) {
String resultMessage = "";
if(age < 20) {
resultMessage = name + "さんは20歳未満です";
} else {
resultMessage = name + "さんは20歳以上です";
}
return resultMessage;
}
このメソッドの場合、カバレッジを満たすには20歳以上の場合とそれ以外の場合の2メソッドをつくる必要があります。
@ParameterizedTestを利用すると1メソッドですみます。
package com.example.demo;
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
class DemoApplicationTests {
private final DemoApplication target = new DemoApplication();
@Nested
class outPutInfo {
// @ParameterizedTestを利用する
@ParameterizedTest
@CsvSource({
// 氏名, 年齢, 出力結果
"taro, 19, taroさんは20歳未満です",
"hanako, 20, hanakoさんは20歳以上です"
})
void 年齢によっての出力パターン(String name, int age, String expectedResult) {
String result = target.outPutInfo(name, age);
assertEquals(expectedResult, result);
}
// @ParameterizedTestを利用しない
@Test
void 年齢が20歳未満のパターン() {
String result = target.outPutInfo("taro", 19);
assertEquals("taroさんは20歳未満です", result);
}
@Test
void 年齢が20歳以上のパターン() {
String result = target.outPutInfo("hanako", 20);
assertEquals("hanakoさんは20歳以上です", result);
}
}
}
「@ParameterizedTest」を利用した場合、複数パターンのパラメータを「@CsvSource」を利用していて検証結果もパラメータとして渡しています。
「@CsvSource」は複数パラメータをコンマ区切りで表現できるので引数が複数あるテスト等に便利です。「@CsvSource」のより詳細な使い方やそれ以外の「@ValueSource」等については参考文献を参照ください。
参考までにテスト実行後の結果です。
参考文献
・JUnit5 公式
https://junit.org/junit5/docs/current/user-guide/#writing-tests-parameterized-tests