< 내용은 다시 공부할 때 개선할 예정 >
JUnit5의 구성요소
-> JUnit 플랫폼 : 테스팅 프레임워크를 구동하기 위한 런처와 테스트 엔진을 위한 API를 제공 ( JRE 라고 생각하면 됨 )
-> JUnit 주피터 : JUnit 5를 위한 테스트 API와 실행 엔진을 제공 ( JDK 라고 생각하면 됨 )
-> JUnit 빈티지 : JUnit 3, 4로 작성된 테스트 코드를 JUnit 5 플랫폼에서 실행되도록 모듈을 제공
JUnit5로 TDD를 한다면 JUnit 플랫폼, 주피터 라이브러리를 추가하면 됨
JUnit 3, 4로 작성된 코드가 있을 경우에만 JUnit 빈티지 라이브러리를 추가하면 됨
메이븐 maven-surefire-plugin 2.22.0 이상, gradle 4.6 이상부터 JUnit 5 플랫폼 라이브러리를 지원하므로 메이븐이나 그레이들은 해당 버전 이상으로 사용하거나 JUnit 4 버전 등으로 낮춰 사용해야함
JUnit 버전별 메이븐, 그레이들 설정이 다를 수 있으므로 버전별 JUnit 설정은 다음을 참고
-> https://junit.org/junit5/docs/버전/user-guide/
JUnit 5.3 버전의 설정 : https://junit.org/junit5/docs/5.3.0/user-guide/
@Test 애너테이션을 붙인 메서드(테스트 케이스)는 접근 제어자가 private 이면 안됨
assertEquals와 같이 결과를 비교하는 메서드는 아래와 같음
1. assertEquals(expected, actual) : 실제 값이 기대하는 값과 같은지 검사
2. assertNotEquals(unexpected, actual) : 실제 값이 기대하는 값과 다른지 검사
3. assertSame(expected, actual) : 두 객체가 동일한 객체인지 검사
4. assertNotSame(expected, actual) : 두 객체가 다른 객체인지 검사
5. assertTrue(boolean condition) : 값이 true인지 검사
6. assertFalse(boolean condition) : 값이 false인지 검사
7. assertNull(actual) : 값이 null인지 검사
8. assertNotNull(actual) : 값이 null이 아닌지 검사
9. fail() : 테스트 실패로 처리
10. assertThrows(예외 클래스, 실행할 메서드)
11. assertDoesNotThrow(실행할 메서드)
assertThrows 예시)
assertThrows(IllegalArgumentException.class, () -> {
AuthService authService = new AuthService();
String id = null;
String pw = null;
authService.authenticate(id, pw);
});
실행할 메서드의 원래 형태는 다음과 같은 함수형 인터페이스임
package org.jnit.jupiter.api.function;
public interface Executable {
void execute() throws Throwable;
}
경우에 따라 여러 결과 비교 중 실패한 것이 있는지 확인하고 싶을 때는 assertAll 을 사용함
assertAll(
() -> assertEquals(expected, actual),
() -> assertEquals(expected, actual),
() -> assertEquals(expected, actual)
);
assertAll 메서드는 Executable을 가변 인자로 받아 여러 결과 비교를 실행함
테스트 케이스의 라이프 사이클
1. @BeforeEach 애너테이션이 붙은 메서드 실행
2. 테스트 케이스 실행
3. @AfterEach 애너테이션이 붙은 메서드 실행
@BeforeEach, @BAfterEach 애너테이션은 테스트 케이스 마다 반복적으로 호출됨
한번에 여러 테스트 케이스를 실행시키는데 테스트 케이스가 실행되기 전, 후에 최초로 딱 한번만 호출되도록 하려면 @BeforeAll, @AfterAll 애너테이션을 사용해야함
테스트 케이스간 서로 의존하면 안됨
테스트 케이스간 서로 의존한다면 테스트를 잘못하고 있는 것
( JUnit는 테스트 메서드간 실행 순서를 지정할 순 있지만 사용하지 않는 것이 좋음 )
예)
1. 파일 생성 테스트 케이스
2. 생성된 파일 읽기 테스트 케이스
가 있다면 (2)는 (1)이 반드시 선행되야함
이런 테스트 케이스는 테스트 케이스 자체를 잘못 생각했을 확률이 높음
@DisplayName 애너테이션을 사용해 화면에 출력되는 테스트 케이스 명을 한글로 지정할 수 있음
@Disabled 애너테이션을 사용해 특정 테스트 케이스는 건너뛰도록 할 수 있음
모든 테스트 케이스를 실행시킬 때는 mvn test 또는 gradle test 명령을 사용함