💭 오늘의 학습 전략
# 슬라이스 테스트
◻️ 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. 오늘은 기운이 펄펄 났다.
'공부기록 > TIL' 카테고리의 다른 글
2023/01/06 TIL | API 문서화 (1) (0) | 2023.01.06 |
---|---|
2023/01/05 TIL | Mockito, TDD (0) | 2023.01.05 |
2023/01/03 TIL | 테스팅 (1) 단위 테스트 (0) | 2023.01.03 |
2022/12/28 TIL | JPA (2) 연관 관계 매핑 (2) | 2022.12.29 |
2022/12/27 TIL | JPA (1) JPA, Entity 매핑 (0) | 2022.12.29 |
댓글