본문 바로가기

JAVA

효율적인 단위 테스트를 위한 무기! JUnit Parameterized Tests 활용법

728x90
반응형

단위 테스트는 소프트웨어 품질을 유지하는 데 필수적인 요소입니다. 특히, 여러 입력값에 대해 동일한 테스트를 반복해야 할 때는 Parameterized Tests가 매우 유용한 도구로 활용될 수 있습니다. 이 글에서는 JUnit의 Parameterized Tests에 대해 알아보고, 이를 도입했을 때의 장점과 간단한 코드 예제를 통해 실제로 어떻게 사용하는지 설명하겠습니다.

1. Parameterized Tests란?

Parameterized Tests테스트 메서드를 다양한 입력값으로 반복 실행할 수 있는 기능을 제공합니다. 일반적으로 동일한 로직에 대해 여러 가지 입력을 테스트해야 할 때, 각 테스트 케이스를 개별적으로 작성하는 대신, 파라미터를 지정해 반복적으로 테스트를 수행할 수 있습니다. 이를 통해 코드 중복을 줄이고, 테스트 가독성을 높일 수 있습니다.

Parameterized Tests의 동작 원리

Parameterized Test를 사용하면 한 번의 테스트 메서드에서 여러 가지 데이터 세트를 활용할 수 있습니다. 각 테스트 케이스에 대해 다른 입력을 적용하고 그에 따른 결과를 확인하는 방식으로, 반복적인 테스트를 보다 효율적으로 수행할 수 있습니다.

반응형

2. Parameterized Tests의 장점

Parameterized Tests를 도입하면 다음과 같은 이점이 있습니다.

2.1. 코드 중복 감소

같은 로직에 대해 다양한 값을 테스트할 때, 입력값마다 별도의 테스트 메서드를 작성하지 않아도 되므로 코드 중복을 줄일 수 있습니다. 이를 통해 테스트 코드가 더욱 간결해집니다.

2.2. 가독성 향상

여러 개의 테스트 메서드를 작성하는 대신, Parameterized Tests를 사용하면 테스트 케이스를 한눈에 파악할 수 있어 테스트 가독성이 높아집니다. 입력값과 기대 결과를 한 곳에서 관리하므로, 테스트 목적을 보다 쉽게 이해할 수 있습니다.

2.3. 유지보수성 개선

입력값이 추가되거나 수정될 때, 테스트 메서드를 하나만 수정하면 되므로 유지보수가 간편합니다. 각 테스트 케이스마다 메서드를 따로 작성하는 것에 비해 훨씬 효율적입니다.

3. JUnit에서 Parameterized Tests 사용법

JUnit 5에서는 @ParameterizedTest와 다양한 어노테이션을 활용해 Parameterized Tests를 작성할 수 있습니다. 여기에서는 간단한 예제를 통해 이를 어떻게 사용하는지 알아보겠습니다.

3.1. 간단한 예제: 덧셈 함수 테스트

우선, 테스트할 덧셈 함수를 작성해보겠습니다

public class Calculator {
    public int add(int a, int b) {
        return a + b;
    }
}

다음으로, @ParameterizedTest를 사용하여 여러 입력값에 대해 덧셈 결과를 테스트하는 코드를 작성합니다.

import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import static org.junit.jupiter.api.Assertions.assertEquals;

public class CalculatorTest {

    @ParameterizedTest
    @CsvSource({
        "1, 2, 3",
        "0, 5, 5",
        "-1, 1, 0",
        "10, 15, 25"
    })
    void testAdd(int a, int b, int expected) {
        Calculator calculator = new Calculator();
        assertEquals(expected, calculator.add(a, b));
    }
}

3.2. 코드 설명

  1. @ParameterizedTest: 이 어노테이션을 사용하면 메서드가 파라미터화된 테스트임을 나타냅니다.
  2. @CsvSource: 테스트에 사용할 여러 입력값을 정의합니다. 여기서는 a, b라는 두 숫자와 그 결과인 expected를 지정했습니다. CSV 형식으로 각 테스트 케이스의 데이터를 제공합니다.
  3. assertEquals(expected, calculator.add(a, b)): 주어진 입력값(a, b)에 대해 add() 메서드를 실행하고, 그 결과가 기대값(expected)과 같은지 확인합니다.
728x90

4. 다른 유용한 Parameterized Test 어노테이션

JUnit 5에서는 다양한 방법으로 파라미터를 제공할 수 있습니다. 다음은 자주 사용되는 몇 가지 어노테이션입니다.

4.1. @ValueSource

단일 파라미터를 사용해 테스트를 실행할 수 있습니다. 예를 들어, 짝수 여부를 확인하는 테스트를 작성할 수 있습니다.

@ParameterizedTest
@ValueSource(ints = {2, 4, 6, 8})
void testIsEven(int number) {
    assertTrue(number % 2 == 0);
}

4.2. @MethodSource

테스트 데이터가 복잡하거나 동적으로 생성되어야 하는 경우, 메서드를 통해 파라미터를 제공할 수 있습니다.

@ParameterizedTest
@MethodSource("stringProvider")
void testWithMethodSource(String argument) {
    assertNotNull(argument);
}

static Stream<String> stringProvider() {
    return Stream.of("apple", "banana", "cherry");
}

4.3. @EnumSource

열거형(enum)을 파라미터로 사용할 수 있습니다. 예를 들어, 특정 열거형 값들에 대해 테스트를 수행할 수 있습니다.

@ParameterizedTest
@EnumSource(TimeUnit.class)
void testWithEnumSource(TimeUnit timeUnit) {
    assertNotNull(timeUnit);
}

JUnit의 Parameterized Tests는 단위 테스트의 효율성과 가독성을 높여주는 매우 유용한 도구입니다. 이를 통해 코드 중복을 줄이고, 다양한 입력값에 대해 손쉽게 테스트할 수 있으며, 테스트 케이스의 유지보수도 간편해집니다.

특히, 여러 케이스에 대해 반복적으로 테스트를 수행해야 하는 경우, Parameterized Tests를 활용하면 보다 효율적이고 깔끔한 테스트 코드를 작성할 수 있습니다. 이번 블로그에서 소개한 방법들을 실제 프로젝트에서 활용해보세요. 단위 테스트가 더욱 강력해질 것입니다!

728x90
반응형