JUnit5 개발 배경
- 오픈 소스 테스트 프레임워크인 JUnit4는 돈을 받지 않는 오픈 소스 특성상 결함도 많이 쌓여 있고
- Java 8의 기능 지원이 언제 된다는 희망이 안보임
- 결국 JUnit 핵심 커미터들과 몇 명의 개발자들이 뭉처 크라우드 펀딩과 함께 JUnit5 개발에 대해 제안함
JUnit4의 문제점
- 테스트 클래스에 하나의 Runner만을 가질 수 있음(확장성 떨어짐)
- 모든 테스트 케이스가 사전에 알려저야 하기에 동적인 테스트 테스트 케이스 생성이 불가
- IDE와 빌드 툴이 JUnit의 내부와 밀접하게 연결되어 있고 JUnit의 변경에 따라 IDE도 변경되어야 하는 강한 결합도를 가짐
JUnit5의 비전
- 테스트 정의 및 프로비저닝에서 테스트 실행 및 보고를 분리
- JUnit의 확장성 재검토
- 더 나은 Assertion과 테스트 케이스 생성, 테스트 계층 구조화, 비동기 코드 테스트 및 기타 항목 등을 위해
람다와 스트림, deafult Method와 같은 Java8 기능 사용
JUnit5
이름을 Jupiter로 지은 이유?
- JUnit4와 구분하기 위한 이름으로 태양계의 5번째 행성인 목성(Jupiter)에서 창안
JUnit5 구조
- JUnit 5는 이전의 버전과 다르게 3개의 하위 프로젝트 모듈들로 조합
JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vintage
1) JUnit Platform(테스트 엔진)
- JVM에서 테스트 프레임워크를 시작하기 위한 기반 역할
- 플랫폼에서 실행되는 테스트 프레임워크를 개발하기 위한 TestEngine API를 정의
2) JUnit Jupiter(JUnit5)
- JUnit 5의 테스트 작성과 확장에 대한 새로운 프로그래밍 모델과 확장 모델의 조합
- Jupiter를 기반으로 테스트 실행을 위한 테스트엔진 제공
3) JUnit Vintage(이전 버전 호환성 제공)
- 플랫폼에서 JUnit 3와 JUnit 4 기반 테스트를 실행하기 위한 TestEngine을 제공
JUnit5 기본 어노테이션
- @BeforeAll(before : @BeforeClass)
테스트 클래스 테스트 시작 시 1회 실행 - @AfterAll(before : @AfterClass)
테스트 클래스 테스트 종료 시 1회 실행 - @BeforeEach(before : @Before)
각각의 테스트 케이스의 시작 전 실행 - @AfterEach(before : @After)
각각의 테스트 케이스의 완료 후 실행 - @Tag(before : @Category)
테스트 필터링을 위한 태그 선언 - @Disabled(before : @Ignore)
테스트 클래스 또는 메서드를 비활성화 - @DisplayName
테스트 클래스나 테스트 메서드에 대한 테스트 시 노출될 이름 정의
JUnit5 feature
- 한글과 스페이스, 이모지, 특수문자도 사용 가능
- Class와 Method Level 선언이 가능
- JUnit4는 Test 작성 시 Public으로 작성했어야 하는데 JUnit5에서는 private만 아니면 됨
- @DisplayNameGeneration을 활용하면 표기 방법을 변경할 수 있음
- @Nested : 계층 구조의 테스트 작성 가능
- @ParameterizedTest
- 여러 개의 테스트 데이터를 매개변수 형태로 쉽고 간편하게 사용 가능
- 최소 하나의 Source Annotation이 필요
(Null, Empty, Value, Csv, Enum, Method 등 사용한 형태의 Source 제공)
- Dynamic Test
- 기존의 테스트는 컴파일 시점으로 제한 되었지만 런타임 환경으로 생성 및 수행됨
- 이를 통해 외부 자원을 활용하거나, 랜덤 데이터를 생성하여 활용할 수 있음
- Parall Execution
- Class, Method로 테스트 병렬 실행이 가능
- 설정값을 통해 테스트의 실행에 대한 전략 변경 가능
- 실제 데이터 동기화는 되지 않고, 각각의 테스트 실행 시점을 조율
JUnit5 & Spring
1) JUnit4 & Spring
- 하나의 @Runwith만 사용 가능하여 그외의 추가는 @Rule로 확장
- Spring에서 SpringClassRule과 SpringMethodRule을 제공
2) JUnit5 & Spring
- @Rule 대신 @ExtendWith을 추가하여 쉽게 사용 가능
- Spring Framework 5.0 이후로 JUnit5가 통합됨
- Spring boot 2.2.0 이후로 JUnit5가 기본으로 변경됨
참고 자료 및 출처
https://junit.org/junit5/docs/current/user-guide/
https://github.com/junit-team/junit5-samples
https://docs.gradle.org/current/userguide/java_testing.html#using_junit5
'dev > 기타' 카테고리의 다른 글
[정리][NHN FORWARD 2020] 내가 만든 WebFlux가 느렸던 이유 (0) | 2022.06.03 |
---|---|
M1 Macbook 윈도우 설치(UTM) (0) | 2022.04.11 |
[디자인 패턴] 스트래티지 패턴 (0) | 2020.04.30 |
CKEditor Re Initialising (0) | 2020.04.30 |
RabbitMQ - Windows 설치 (0) | 2020.04.13 |