매개변수화 테스트

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은 이를 두 개의 테스트로 실행합니다:

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

@ValueSource에 null을 전달하면 컴파일되지 않습니다:

@ParameterizedTest
@ValueSource(strings = {"", "jane doe", null}) // 컴파일 안 됨
void isValidUsername_returnsFalse(String username) {
    boolean actual = isValidUsername(username);

    assertFalse(actual);
}

대신 @NullSource를 사용하세요.

Java 테스트 소개

전체 ParameterizedTest 실행

@ValueSource에 null을 넣으면 컴파일되지 않습니다.

@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 테스트 소개

테스트당 여러 인자

@ValueSource의 또 다른 제한 — 테스트당 하나의 값만 전달 가능.

다음 메서드를 보세요:

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 테스트 소개

연습해 봅시다!

Java 테스트 소개

Preparing Video For Download...