시작
JUnit5에서 개인적으로 가장 많이 활용하고 있는 기능은 @Nested 이다.
예전 포스트라서 약간 view가 깨지는 부분도 있지만 이런 테스트케이스는 어떨까?(또는 옛날사이트)에서도 많이 고민했던 부분을 JUnit5에서 공식적으로 해결해주었다.
소스 코드
간단한 분기문이 있는 코드를 만들어본다. 실제 서비스에서는 훨씬 복잡한 코드가 나올 것이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
@Service public class BookingService { public void bookingByCreditCard(int param) { if (conditionA) { ... } if (conditionB) { ... } ... } public void bookingByMobilePhone(int param) { if (conditionA) { ... } if (condifionB) { ... } ... } ... } |
일반적인 테스트 코드
일반적으로 해당 클래스의 각 메소드와 그 메소드 내의 분기문을 결합해서 각각 테스트를 진행하게 된다.
테스트 메소드의 네이밍은 일반적으로 저리 간단하지는 않다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
public class BookingServiceTest { @Test public void bookingByCreditCardWithCouponIfCouponIsNotExisted() { ... } @Test public void bookingByCreditCardWithCouponIfCouponIsExpired() { ... } @Test public void bookingByCreditCardWithCouponIfCouponIsUsedAlready() { ... } @Test public void bookingByCreditCardWithBonus...() { ... } ... @Test public void bookingByMobilePhone...() { ... } ... } |
옛날 블로그 재탕
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
@SuiteClasses({BookingByCreditCardTest.class, BookingByMobilePhone.class}) public class BookingServiceTest { class BookingByCreditCardTest { @Test public void useCouponIfCouponIsNotExisted() { ... } @Test public void useCouponIfCouponIsExpired() { ... } @Test public void useCouponIfCouponIsUsedAlready() { ... } @Test public void useBonus...() { ... } ... } class BookingByMobilePhone { ... } } |
JUnit5 @Nested 활용
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
public class BookingServiceTest { @Nested class BookingByCreditCard { @Nested class Coupon { @Test public void ifNotExisted() { ... } @Test public void ifExpired() { ... } @Test public void ifAlreadyUsed() { ... } ... } @Nested class Bonus { ... } } @Nested class BookingByMobilePhone { ... } } |
JUnit5 @DisplayName 추가
추가로 @DisplayName 까지 활용해 보자. 한글로 메소드이름을 지으면 CI툴에서 쉽게 볼 수 있어서 한 때 유행한 적이 있었다.
내가 만드는 테스트코드 그리고 한글코드(또는 옛날사이트)
그런데 실제로 사용해보면 좀 불편한 점들이 있었다.
- 코드 검색시에 누락됨
- 한글 특성상 카멜케이스를 적용하기 힘들기 때문에 _를 많이 써야함 (userCoupon -> 사용자_쿠폰)
- 네이밍 상 일관성 부족 (User -> 유저, 회원, 사용자 등)
그래서 한 때 유행에도 불구하고 결국엔 영어 네이밍으로 모두 귀환했는데, 의외로 @DisplayName을 사용하면 꽤 괜찮다는 생각을 했다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
public class BookingServiceTest { @Nested class BookingByCreditCard { @Nested @DisplayName("쿠폰 사용시") class Coupon { @Test @DisplayName("쿠폰이 없을 때") public void ifNotExisted() { ... } @Test @DisplayName("쿠폰이 만료되었을 때") public void ifExpired() { ... } @Test @DisplayName("쿠폰을 이미 사용했을 때") public void ifAlreadyUsed() { ... } ... } @Nested @DisplayName("보너스 사용시") class Bonus { ... } } @Nested class BookingByMobilePhone { ... } } |
위의 예는 아니지만, 실제로 서비스에서 사용하고 있는 테스트 결과를 보면 이렇게 나온다.
마무리
혹시 위처럼 테스트를 만드는 것 보다는 코드를 더 간결하게 하는 것이 중요하다고 생각할지도 모르겠다.
코드를 간결하게 만들 수 있는 방법은 언제나 고민해봐야 할 문제이다.
하지만 예전에 테스틀 만들면서 고민하던 부분들이 JUnit5에서 지원되는 것으로 만족해서 포스팅을 남긴다.