테스트 코드 기본
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;
}