パラメータ化テスト

Javaによるテスト入門

Maria Milusheva

Senior Software Engineer

例: ユーザー名の検証

第1章のユーザー名検証の例を思い出してください。

public static boolean isValidUsername(String username) {
    if (username == null || username.isEmpty() || username.contains(" ")) {
        return false;
    }
    return username.length() >= 3;
}
Javaによるテスト入門

例: 繰り返しの検証テスト

テストは次のようでした。

@Test
void isValidUsername_returnsFalse() {
    String username = "____";

    boolean actual = isValidUsername(username);

    assertFalse(actual);
}

これを3つ書く必要はありません。

1 https://en.wikipedia.org/wiki/Don%27t_repeat_yourself
Javaによるテスト入門

パラメータ化テスト: 構文

@Test の代わりに @ParameterizedTest を使います。

インポート元:

import org.junit.jupiter.params.ParameterizedTest;

さらに @ValueSource が必要です。

インポート元:

import org.junit.jupiter.params.provider.ValueSource;
Javaによるテスト入門

パラメータ化テスト: 例

@ParameterizedTest
@ValueSource(strings = {"", "jane doe"}) // 注意: "strings" であり String ではない
void isValidUsername_returnsFalse(String username) { // テストは引数を取れる
    boolean actual = isValidUsername(username);

    assertFalse(actual);
}

Junit はこれを2件のテストとして実行します。

Tests run: 2, Failures: 0, Errors: 0, Skipped: 0
All tests passed!
Javaによるテスト入門

@ValueSource の制限

@ValueSource は特定の型に限定されます。

@ValueSource(bytes = {1, 2, 3, 42})
@ValueSource(shorts = {100, 200, 300})
@ValueSource(ints = {1, 2, 3, 42})
@ValueSource(longs = {1000L, 2000L, 3000L})
@ValueSource(floats = {1.0f, 3.14159f, 2.71828f})
@ValueSource(doubles = {3.14, 2.71828, 1.4142})
@ValueSource(chars = {'a', 'b', 'c', 'Z'})
@ValueSource(booleans = {true, false})
@ValueSource(strings = {"Hello", "JUnit", "5", "Parameter"})
@ValueSource(classes = {String.class, Integer.class, ValueSourceExamples.class})
1 https://junit.org/junit5/docs/5.7.1/api/org.junit.jupiter.params/org/junit/jupiter/params/provider/ValueSource.html
Javaによるテスト入門

@NullSource

@ValueSourcenull は渡せません。コンパイルできません。

@ParameterizedTest
@ValueSource(strings = {"", "jane doe", null}) // コンパイル不可
void isValidUsername_returnsFalse(String username) {
    boolean actual = isValidUsername(username);

    assertFalse(actual);
}

代わりに @NullSource を使用します。

Javaによるテスト入門

ParameterizedTest 全体の実行

@ValueSourcenull を渡すとコンパイルできません。

@ParameterizedTest
@NullSource // null の入力ケースを追加
@ValueSource(strings = {"", "jane doe"})
void isValidUsername_returnsFalse(String username) {
    boolean actual = isValidUsername(username);

    assertFalse(actual);
}
Tests run: 3, Failures: 0, Errors: 0, Skipped: 0
All tests passed!
Javaによるテスト入門

1テストで複数引数

@ValueSource の別の制限:テストごとに1値しか渡せません。

次のメソッドを考えます。

int countLetters(String input) {
    if (input != null) {
        return input.length();
    }
    return 0;
}
Javaによるテスト入門

@CsvSource

複数値には @CsvSource を使用します(CSV = カンマ区切り値)。

@ParameterizedTest
@CsvSource({"Hello World, 11", "DataCamp, 8", "'', 0", ", 0"})
void countLetters_countsLetters(String input, int expected) {
    int actual = countLetters(input);

    assertEquals(expected, actual);
}

", 0" は null と 0 になります。空文字を入力するには、JUnit 5.10 では "'', 0" を使います。

@CsvSource has similar type limitations as @ValueSource.

Javaによるテスト入門

注意: Source アノテーションのインポート

すべての @____Source アノテーションは次からインポートできます。

import org.junit.jupiter.params.provider.*;
Javaによるテスト入門

Let's practice!

Javaによるテスト入門

Preparing Video For Download...