우테코 지원 과정

테스트 코드 기본

쥐4 2024. 10. 25. 15:14

1. 기본 어노테이션

1-1. @BeforeAll : 테스트 진행 전 한 번

1-2. @BeforeEach : 테스트 진행 전 매 메소드 마다

1-3. @Test : 테스트 메소드를 나타냄

1-4. @AfterEach : 테스트 진행 후 매 메소드 마다

1-5. @DisplayName : 테스트의 이름을 나타냄

2. 중첩 테스트 어노테이션

2-1. @Nested : 내부 클래스에 사용. 결합도가 높은 테스트 메서드들을 묶는 클래스에 사용

3. 단언문 메서드

3-1. assertAll

-여러 개의 단정문을 그룹화할 수 있음. 하나의 단정문이라도 실패하면, 실패

assertAll(
    () -> assertEquals(4, calculator.add(2, 2)),
    () -> assertEquals(6, calculator.subtract(10, 4)),
    () -> assertTrue(calculator.isPositive(5))
);

 

3-2. assertArrayEquals

-두 배열이 같은지 비교(요소와 길이)

int[] expected = {1, 2, 3};
int[] actual = {1, 2, 3};
assertArrayEquals(expected, actual);	//통과

 

3-3. assertEquals

-두 값이 같은지 비교

assertEquals(5, calculator.add(2, 3));

 

3-4. assertFalse

-false를 반환해야함

assertFalse(calculator.isNegative(5));

 

3-5. assertTrue

-True를 반환해야함

 

3-6. assertNull

-객체가 Null인지 판단

assertNull(user.getMiddleName());

 

3-7. assertTimeout

-지정된 시간 내에 작업 완료되야함

assertTimeout(Duration.ofSeconds(1), () -> {
    Thread.sleep(500);  // 1초 내에 작업이 완료되어야 합니다.
});

 

3-8. assertTimeoutPreemptively

-지정된 시간 내에 작업 완료되야함. 안돼면 그냥 작업 중단

assertTimeoutPreemptively(Duration.ofMillis(500), () -> {
    // 500ms 내에 실행이 완료되지 않으면 강제로 중단됩니다.
    Thread.sleep(1000);  
});

 

3-9. assertThrows

-특정 예외가 발생하는지 확인

assertThrows(IllegalArgumentException.class, () -> {
    calculator.divide(10, 0);  // 0으로 나누면 IllegalArgumentException 발생
});

4. 가정문

4-1. assumingThat

-특정 상황이 만족됐을 때(True일 때), 테스트를 실행한다.

    assumingThat(
        "PROD".equals(environment),
        () -> {
            // "PROD" 환경에서만 실행됨
            System.out.println("Running in production environment");
            assertEquals(42, calculateImportantValue());
        }
    );

5. 반복문

5-1. RepeatedTest

-하나의 테스트 메서드를 반복할 수 있다.(콘솔에서는 1/3, 2/3 이런식으로 보여준다.)

    @RepeatedTest(value = 3, name = "{displayName} {currentRepetition}/{totalRepetitions}")
    void testAddition(RepetitionInfo repetitionInfo) {
        int result = 2 + 3;
        assertEquals(5, result);
    }

6. 파라미터 설정

6-1. ValueSource

-파라미터로 받아줄 수 있다. 아래와 같이 반복문도 돌릴 수 있다.

    @ParameterizedTest
    @ValueSource(ints = {0, 2, 4, 6, 8, 10})
    void testEvenNumbers(int number) {
        assertTrue(isEven(number), number + " should be even");
    }

    boolean isEven(int number) {
        return number % 2 == 0;
    }
}

 

6-2. EnumSource

-파라미터로 Enum 전체를 받는다. 반복문도 역시 가능하다.

@ParameterizedTest
@EnumSource(value = Day.class, names = {"MONDAY", "FRIDAY"})
void testIsSpecificWeekday(Day day) {
    assertTrue(day == Day.MONDAY || day == Day.FRIDAY);
}

 

6-3. CsvSource

-텍스트 파라미터 형식

    @ParameterizedTest
    @CsvSource({
        "1, 1, 2",
        "2, 3, 5",
        "3, 7, 10",
        "4, 6, 10"
    })
    void testAddition(int a, int b, int expectedResult) {
        assertEquals(expectedResult, add(a, b));
    }

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