A Guide to JUnit 5
Last updated
Last updated
참고 링크
JUnit 은 Java 생태계에서 가장 인기있는 단위 테스트 프레임워크이다.
Java8 부터 사용이 가능하다.
JUnit5 는 람다 사용을 지원하는 방향으로 개발되었다.
이 플랫폼은 JVM에서 테스트 프레임워크를 출시하는 역할을 합니다. JUnit과 클라이언트 간의 안정적이고 강력한 인터페이스(예: 빌드 도구)를 정의합니다.
이 플랫폼은 클라이언트를 JUnit과 쉽게 통합하여 테스트를 검색하고 실행합니다.
API 도 정의합니다 . 사용자 정의 TestEngine을 구현함으로써 타사 테스트 라이브러리를 JUnit에 직접 연결할 수 있습니다.
이 모듈에는 JUnit 5에서 테스트를 작성하기 위한 새로운 프로그래밍 및 확장 모델이 포함되어 있습니다. JUnit 4와 비교했을 때 새로운 어노테이션은 다음과 같습니다.
@TestFactory – 동적 테스트를 위한 테스트 팩토리인 메서드를 나타냅니다.
@DisplayName – 테스트 클래스 또는 테스트 메서드에 대한 사용자 정의 표시 이름을 정의합니다.
@Nested – 주석이 달린 클래스가 중첩된 비정적 테스트 클래스임을 나타냅니다.
@Tag – 필터링 테스트를 위한 태그를 선언합니다.
@ExtendWith – 사용자 정의 확장을 등록합니다.
@BeforeEach – 주석이 달린 메서드가 각 테스트 메서드 전에 실행됨을 나타냅니다(이전에는 @Before )
@AfterEach – 주석이 달린 메서드가 각 테스트 메서드(이전에는 @After ) 이후에 실행됨을 나타냅니다 .
@BeforeAll – 주석이 달린 메서드가 현재 클래스의 모든 테스트 메서드보다 먼저 실행됨을 나타냅니다(이전에는 @BeforeClass ).
@AfterAll – 주석이 달린 메서드가 현재 클래스의 모든 테스트 메서드 이후에 실행됨을 나타냅니다(이전에는 @AfterClass ).
@Disabled – 테스트 클래스 또는 메서드를 비활성화합니다(이전에는 @Ignore )
JUnit Vintage는 JUnit 5 플랫폼에서 JUnit 3 및 JUnit 4 기반 테스트 실행을 지원합니다.
클래스 내 전체 테스트 전 한번만 실행
static 메서드에서만 사용할 수 있음 (@BeforeAll
은 인스턴스 생성 없이 실행되기 때문).
데이터베이스 연결, 리소스 로딩 등 비용이 큰 초기화 작업에 적합함.
@BeforeAll 실행 시 static 메서드만 사용할 수 있는 이유
JUnit 실행 방식
JUnit 5에서 테스트 클래스는 기본적으로 각 테스트 메서드 실행 시 새로운 인스턴스를 생성해.
즉, 테스트 클래스의 객체가 테스트마다 새롭게 생성되기 때문에 객체의 필드는 테스트 간 공유되지 않음.
그렇다면 문제는?
@BeforeAll
은 모든 테스트 전에 한 번만 실행되어야 하는데, 만약@BeforeAll
이 인스턴스 메서드라면, JUnit은 이를 실행할 객체가 필요함.하지만 기본적으로 JUnit은 각 테스트 실행마다 새로운 인스턴스를 생성하기 때문에, 테스트 실행 전에 한 번만 실행될 메서드를 어떤 인스턴스에서 실행할지 정할 수 없음.
해결방법 : static 메서드 사용
static
메서드는 클래스 레벨에서 실행되기 때문에, JUnit이 테스트 클래스의 인스턴스를 만들지 않아도@BeforeAll
을 실행할 수 있음.
각각의 테스트 메서드가 실행되기 전에 실행됨.
static일 필요 없음 (일반 인스턴스 메서드에서 사용 가능).
테스트별 독립적인 초기화가 필요할 때 유용함.
테스트 이름 지정
테스트 비활성화
이유 설명 가능
테스트 클래스의 모든 테스트가 실행된 후에 한 번만 실행됨.
@BeforeAll
과 마찬가지로 static 메서드에서만 사용할 수 있음.
데이터베이스 연결 해제, 파일 닫기, 리소스 정리 같은 전체적인 정리 작업을 수행할 때 유용.
각 테스트가 실행된 후마다 실행됨.
static
일 필요 없음 (일반 인스턴스 메서드에서 사용 가능).
각 테스트 후 데이터 초기화나 임시 리소스 정리가 필요할 때 유용.
JUnit 5에는 예외 테스트 방법이 두 가지 있으며, 둘 다 assertThrows() 메서드를 사용하여 구현할 수 있습니다.
첫 번째 예제에서는 발생한 예외의 세부 정보를 확인하고,
두 번째 예제에서는 예외 유형을 검증합니다.