2023/01/14 TIL | 테스팅 (2) 슬라이스 테스트

    반응형

    💭 오늘의 학습 전략

    # 슬라이스 테스트

    ◻️ API 계층 테스트

     ◽ @SpringBootTest

     ◽ @AutoConfigureMockMvc

     ◽ MockMvc (perform())

     ◽ ResultActions 객체를 통한 검증

    ◻️ 데이터 액세스 계층 테스트

     ◽ @DataJpaTest

     

    🌼 학습한 것들

    ◾ 슬라이스 테스트

     ▪️ 특정 계층만 잘라서(Slice), 계층별 동작을 확인하기 위한 테스트

     ▪️ 스모크 테스트: 통합 테스트 전에 특정 수정 사항에 의해 영향 받을 수 있는 범위 테스트

    ◾ 슬라이스 테스트_API 계층

    @SpringBootTest
    @AutoConfigureMockMvc
    public class ControllerTestStructure {
        @Autowired
        private MockMvc mockMvc;
        @Test
        public void postTestStructure() {
            // given: 테스트용 Request body
            // when : MockMvc 객체로 테스트 대상 핸들러 메서드(Controller) 통신
            // then : 응답 검증 (Http status, Response body 등)
        }
        
        @Test
        public void postTestExample() {
            PostDto post = new MemberDto.Post("hys@gmail.com", "손호영", "010-1234-5678");
            String content = gson.toJson(post);
    
            ResultActions actions =
                    mockMvc.perform(post("/members")
                                  	  .accept(MediaType.APPLICATION_JSON)
                                  	  .contentType(MediaType.APPLICATION_JSON)
                                 	  .content(content));
                                        
            actions.andExpect(status().isCreated())
                   .andExpect(header().string("Location", is(startsWith("/members/"))));
        }
    }

     ▪️ @SpringBootTest: 테스트용 Application Context 생성

      - Junit4 -> SpringJUnit4ClassRunner 클래스를 상속 받는 @RunWith(SpringRunner.class)와 사용

      - 실습은 JUnit5로 진행했다.

     ▪️ @AutoConfigureMockMvc: 테스트용 애플리케이션 자동 구성

      - Mock 테스트 시 필요한 의존성 제공

        => SpringBootTest에서 Mock 테스트를 가능하게 해준다

     * @SpringBootTest + @AutoConfigureMockMvc

        => 빈을 모두 등록하기 때문에 테스트 단위가 커진다.

        => 슬라이스 테스트는 WebMvcTest가 적합(테스트에 필요한 Bean 수동 등록)

     ▪️ Gson: 매퍼 역할

      - ObjectMapper등 여러 라이브러리 사용 가능, 실습에선 Gson 사용

     ▪️ MockMvc.perform()

      - RequestBuilder로 빌드한 요청을 매개변수로 전달

     ▪️ accept: 클라이언트에서 받을 데이터 포맷 지정  ex) MediaType.APPLICATION_JSON

     ▪️ contentType: 클라이언트에서 보낼 데이터 포맷 지정  ex) MediaType.APPLICATION_JSON

       ==> 위 두 개는 생략해도 동작하는데 RestController 때문인지 ResponseEntity 때문인지 뭔지 잘 모르겠다.

            아무튼 궁금해서 설정을 지우고 테스트를 돌려봤는데 JSON으로 잘 나왔다.

     ▪️ ResultActions.andExpect()

      - 파라미터로 입력한 Matcher로 기대 결과 검증

        ex) andExpect(jsonPath("$.data.email").value(request.getEmail()))

    슬라이스 테스트_데이터 액세스 계층

     ▪️ @DataJpaTest: Repository 사용을 위한 configuration 자동 추가

      - 주의: 테스트 후에는 DB 상태를 테스트 케이스 실행 이전으로 되돌려야 한다.

        (테스트 케이스의 독립성 보장)

        ==> @DataJpaTest는 @Transactional을 포함하고 있음! (테스트 케이스 끝나면 rollback)

     ▪️ @JdbcTest, @DataJdbcTest 등 환경에 맞는 애너테이션

     

    🔥 보충이 필요한 것들

    ◾ 다른 Controller 테스트 코드도 작성해봐야겠다.

     

     

    💨 하루를 마치며

    1. 테스트 코드도 낯선데 슬라이스 테스트는 처음 접한 개념이라 많이 긴장했지만 실습을 잘 마칠 수 있었다! 부족하지만 Error handling 기록도 남겨보았다.

    2023.01.04 - [공부기록/SPRING] - [JUnit] Required String parameter '???' is not present

    2. 이번 페어분은 구현할 수 있는 정도에 그치지 않고 메서드나 용어에 대해 섬세하게 짚고 넘어가시는데, 나를 많이 돌아보게 되었다! 질문 주고 받으면서 더 많이 공부할 수 있었다. 근데 또 알려고 하다보면 너무 깊이 빠져버리니... 이것 참><;;

    3. Mockito를 통한 제대로된 슬라이스 테스트는 또 어떨지 궁금하다. 뭔가 내 멋대로인 실습이었지만 재미있었다.

    4. 실습 Solution 코드에서 patch, get 등 RequestBuilder 인자(perform의)로 URI를 넣길래 이게 String인데 어떻게 되는 거지... 둘이 같은 걸로 인식되나 하고 생각했는데 체크포인트를 듣다 보니 오버로딩 되어있었다는 걸 알게 되었다 하하;;

    5. 노트북 ㅇ의 키캡이 계속 달랑거리다가 결국 지지대가 부러지면서 돌이킬 수 없게 되었다. 그래서 타자를 뭔가 처음 쳐보는 사람처럼 치고 있다. 이응만 빠졌을 뿐인데 온 키에 신경이 가면서 오타도 엄청 많이 난다. 서비스센터 언제 가..~

    6. 오늘은 기운이 펄펄 났다.

    반응형

    댓글