Nested 를 사용한 Test 관리

알파로그·2024년 1월 29일
0

Test code

목록 보기
2/2

✏️ 발단

하나의 Controller 객체에는 같은 관심사를 가진 복수의 API 가 존재하는데,
이런 API 하나하나 마다 성공, 실패, 실패할경우 어떤이유로 실패 했는지 등등 ..

최소 2개 이상의 검증이 필요하다.

또한 Test 는 코드보다 Test 의 실행 결과를 더 자주 확인하기 때문에 하나의 Test 객체에 모든 API 검증 로직을 전부 작성할경우 가독성이 매우 떨어진다고 생각했다.

📍 내가 사용하던 방법

Nested 를 사용하기 전에는 막연하게 Test 객체를 나눴다.

예를 들어 Member Controller 에 대한 검증이라면,
member/controller 패키지 내에 CreateTest, ModifyTest 등등.. Test 객체를 각각 나눠 관리했는데,
아래와 같은 문제들이 발생했다.

  • 중복되는 의존성 주입
  • 중복되는 Mocking 작업
  • Test 실행시 test 의 Display name 이 너무 길어 가독성 저하

✏️ Nested 도입

  • Nested 는 관심사가 비슷한 (같은 API) 단위로 묶어서 계층형 구조를 이뤄 가독성을 향상시키고,
    불필요한 Test 객체 생성과 의존성을 제거할 수 있다.

📍 before

  • 하나의 Auth Controller 를 검증하기 위해 여러개의 Test 객체가 생성된 것을 볼 수 있다.
  • 여러개의 Test 객체에 반복되는 의존성을 제거하기 위해 추가적인 객체가 필요하다.
  • 위 테스트 결과 사진에서 보다시피 모든 Test 결과가 객체단위로 섞여서 나타나기 때문에 DisplayName 이 길어지고, 결국 가독성이 저하된다.

📍 After

  • 나눠졌던 객체들을 하나의 Test 객체로 모으고,
    비슷한 메서드 끼리 Nested 를 사용해 묶었다.
    • 계층형 구조가 이뤄져 Display Name 을 간단하게 작성해 가독성이 높아졌다.
@DisplayName("통합: 인증 API")
// ...
class AuthControllerTest extends KakaoClientMock{

    // ...

    @DisplayName("kakao api 인증")
    @Nested
    class kakaoLogin {

        @DisplayName("회원가입 성공")
        @Test
        void no1() throws Exception { ... }

 
        @DisplayName("로그인 성공")
        @Test
        void no2() throws Exception { ... }
		}

		@DisplayName("토큰 재발급")
    @Nested
    class reissueToken { ... }

		@DisplayName("logout")
    @Nested
    class logout { ... }
  • 결과도 가독성이 좋아졌다.

profile
잘못된 내용 PR 환영

0개의 댓글