지난달에 if kakao 2020도 신청해서 들었는데, 메모만 해놓고 귀찮아서 포스팅을 못했었다. 이번 연휴때 시간이나서 밀린 포스팅을 하는김에 JUnit5 관련 세션에 대한 내용을 포스팅해봤다.
카카오스토리의 Nesoy 님께서 발표하신 세션인데, JUnit4와 JUnit5를 비교하고 JUnit5를 찍먹하는 내용이다.
예전에 인프런에서 강의는 JUnit4 코드로 제작이 되어있었고 내가 실습한 환경은 JUnit5 이었다.
두 버전의 테스트 코드가 달라서 나도 몇번 삽질한 끝에 JUnit5 버전의 코드를 작성했고, 그 코드를 다른 사람들 참고하라고 게시한적이 있었는데 댓글로 문법이 퇴보한 것 같다는 의견이 있었다.
그 때 답글로 그렇지 않다고 말만 했었는데, 그 분이 이 세션을 보셨더라면 더 도움이 됬을것 같다.
왜 JUnit5로 다시 만들게 되었을까?
JUnit5는 왜 JUnit4에서 버전업이 아닌 아예 다시 만들었을까?
JUnit4의 문제점
- IDE와의 강한 결합도
- @RunWith 의 부족한 확장성
- 여러개의 @RunWith 를 조합하여 사용할 수 없었음
- @Rule 을 활용하여 다른 기능을 확장할 수 있음
- 테스트에 대한 기능을 확장하려면 많은 @Rule 들이 필요
- Big Jar 많은 책임
JUnit5
- 최대한 단순하게
- 기능보단 확장성
JUnit5의 확장성 지원
@ExtendWith
- @ExtendWith, @RegisterExtension, Java의 ServiceLoader를 통해 등록 가능
- Extension은 선언된 순서대로 등록되며, Class, Method에 적용 가능
1. 일반적인 확장포인트
- ParameterResolver
- ExecutionCondition
- TestInstancePostProcessor
- TestExecutionExceptionHandler
2. 테스트 확장포인트
- BeforeAllCallback
- BeforeEachCallback
- BeforeTestExecutionCallback
- AfterTestExecutionCallback
- AfterEachCallback
- AfterAllCallback
JUnit4 vs JUni5 비교하기
기본 어노테이션
JUnit4 | JUnit5 |
@BeforeClass | @BeforeAll |
@Before | @BeforeEach |
@Test | @Test |
@After | @AfterEach |
@AfterClass | @AfterAll |
@Category | @Tag |
@Ignore | @Disabled |
assert
- JUnit4 에서는 하나라도 assert가 실패하면 다음 assert를 실행하지 않음
- assertAll 을 활용하면 여러 개의 assert가 가능
- 중간에 선언된 assert문이 실패하더라도 선언된 모든 assert문을 실행하고 결과들을 반환한다.
assertThrow
- JUnit4 에서는 예외 메시지에 대한 검증을 하기 위해 다른 방법을 사용했어야 했음
- assertThrows를 사용해서 Exception을 쉽게 검증할 수 있게 되었음
- assertDoesNotThrows를 통해 예외가 발생하지 않는 것도 검증할 수 있음
assertTimeout
- JUnit4 에서는 Annotation으로 테스트 실행 시간을 검증
- 테스트 실행시간에 대한 assert 기능이 추가됨
- assertTimeoutPreemptively는 기대하는 시간이 초과되면 테스트를 즉시 실패하고 종료시킨다.
@DisplayName
- 한글, 스페이스, 이모지, 특수문자 가능
- Class, Method level에 선언 가능
- @DisplayNameGeneration을 활용하면 표기 방법도 변경할 수 있음
@Nested
- 계층 구조 테스트
@ParameterizedTest
- 여러 개의 테스트 데이터를 매개변수 형태로 쉽고 간편하게 사용할 수 있음
- 최소 하나의 Source Annotation이 필요
- Null, Empty, Value, Csv, Enum, Method 등 다양한 형태의 Source가 존재
Dynamic Test
- JUnit4 에서는 테스트가 컴파일 시점으로 제한되었지만, 테스트가 런타임 환경으로 생성 및 수행됨
- 이를 통해 외부의 자원을 활용하거나, 랜덤 데이터를 생성하여 활용할 수 있음
- 타이틀을 활용하여 좀 더 가독성을 높일 수 있음
JUnit4 + Spring
- 하나의 @RunWith 만 사용해야하기 때문에 기능들을 @Rule을 통해 확장
- Spring에서 SpringClassRule, SpringMethodRule 을 제공
JUnit5 + Spring
- @Rule 대신 @ExtendWith(SpringExtension.class)을 추가하면됨
- Spring Framework 5 이후 Junit5가 통합됨
- Springboot 2.2 이후 Junit5가 기본으로 변경됨
반응형
'📦 ETC > 그냥 쓰고 싶어서요' 카테고리의 다른 글
읽기 좋은 코드가 좋은 코드다 (0) | 2021.05.02 |
---|---|
주니어 개발자의 2020년 회고 (0) | 2021.01.01 |
[우아콘 2020] 우아한테크콘서트 2020 후기 (0) | 2020.12.24 |
[Github] 할로윈에는 Contribution 색상이 바뀐다 (0) | 2020.10.31 |
[Naver Developer Open Class] 립스탑 백을 받았다 (0) | 2020.09.13 |