반응형
✔ Java 11
✔ Gradle 7
✔ Spring boot 2.6.3
통합 테스트란?
DB에 접근하거나 전체 코드와 다양한 환경이 제대로 작동하는지 확인하는데 필요한 모든 작업을 수행할 수 있다.
테스트 프레임워크로 JUnit을 사용했다.
1. 테스트 파일 생성
Controller 메소드 이름을 우클릭 후 Generate > Test를 눌러 테스트 파일을 자동으로 생성할 수 있다.
2. 테스트 파일 세팅
@Transactional
@SpringBootTest
class UserMinjControllerTest {
private MockMvc mockMvc;
@Autowired
private WebApplicationContext context;
@BeforeEach
void setUp() {
mockMvc = MockMvcBuilders
.webAppContextSetup(context)
.build();
}
}
@Transactional
@Text 실행이 종료될 때마다 롤백한다.
@SpringBootTest
스프링 IoC, DB CRUD 사용하기 위해 선언한다.
MockMvc
테스트할 컨텍스트를 지정하기 위해 생성한다.
WebApplicationContext
테스트할 Application Context를 인젝션하기 위해 선언한다.
@BeforeEach
이 어노테이션을 붙인 메소드는 테스트 메소드가 실행되기 전 실행된다.
4. UserController 통합 테스트 코드 작성
UserController에 구현된 기능은 회원 생성 / 조회 / 상세 조회 / 정보 수정 / 삭제이다.
해당 기능이 정상적으로 돌아가는지와 예외 처리를 테스트 코드로 작성했다.
1. 회원 생성
// 회원이 정상적으로 생성된 경우 - 200 반환
@Test
void 회원_생성_200() throws Exception {
UserRequestDto userRequestDto = new UserRequestDto("m0_0m", "password", "minj");
mockMvc.perform(post("/users-minj") // http 메소드와 도메인 입력
.contentType(MediaType.APPLICATION_JSON)
.content(new ObjectMapper().writeValueAsString(userRequestDto)))
.andExpect(status().isOk())
.andDo(print());
}
// 이미 존재하는 아이디일 경우 - 409 반환
@Test
void 회원_중복_409() throws Exception {
UserRequestDto userRequestDto = new UserRequestDto("id001", "password", "minj");
mockMvc.perform(post("/users-minj")
.contentType(MediaType.APPLICATION_JSON)
.content(new ObjectMapper().writeValueAsString(userRequestDto)))
.andExpect(status().isConflict())
.andDo(print());
}
perform()
http 메소드와 도메인을 입력한다.
contentType
요청을 보낼 데이터의 형을 입력한다.
content
요청을 보낼 데이터를 입력한다.
andExpect
실행 결과를 검증하는 ResultMatcher를 지정한다.
status
기대하는 HTTP 상태 코드를 입력하여 검증한다.
andDo
인수에 실행 결과를 처리할 수 있는 ResultHandler를 지정한다.
print
response값을 확인할 수 있다.
2. 회원 조회
// 회원 목록이 정상적으로 조회된 경우 - 200 반환
@Test
void 회원_목록_200() throws Exception {
mockMvc.perform(get("/users-minj"))
.andExpect(status().isOk())
.andDo(print());
}
3. 회원 상세 조회
// 회원의 상세 정보가 성공적으로 조회된 경우 - 200 반환
@Test
void 회원_상세_조회_200() throws Exception {
mockMvc.perform((post("/users-minj/1"))).andExpect(status().isOk()).andDo(print());
}
// 존재하지 않는 id를 조회한 경우 - 404 반환
@Test
void 회원_상세_조회_404() throws Exception {
mockMvc.perform((post("/users-minj/1000"))).andExpect(status().isNotFound()).andDo(print());
}
print()를 사용하면 테스트를 돌릴 시 response를 확인할 수 있다.
MockHttpServletResponse:
Status = 200
Error message = null
Headers = [Content-Type:"application/json"]
Content type = application/json
Body = [{"id":1,"userId":"id001","userPassword":"password","userName":"001"},{"id":2,"userId":"id002","userPassword":"password","userName":"002"}]
Forwarded URL = null
Redirected URL = null
Cookies = []
4. 회원 정보 수정
// 회원 정보가 성공적으로 수정된 경우 - 200 반환
@Test
void 회원_정보_수정_200() throws Exception {
UserUpdateRequestDto userUpdateRequestDto = new UserUpdateRequestDto("doremi", "minji");
mockMvc.perform((post("/users-minj/1"))
.contentType(MediaType.APPLICATION_JSON)
.content(new ObjectMapper().writeValueAsString(userUpdateRequestDto)))
.andExpect(status().isOk())
.andDo(print());
}
// 존재하지 않는 id를 수정한 경우 - 404 반환
@Test
void 회원_정보_수정_404() throws Exception {
UserUpdateRequestDto userUpdateRequestDto = new UserUpdateRequestDto("doremi", "minji");
mockMvc.perform((post("/users-minj/1000"))
.contentType(MediaType.APPLICATION_JSON)
.content(new ObjectMapper().writeValueAsString(userUpdateRequestDto)))
.andExpect(status().isNotFound())
.andDo(print());
}
5. 회원 삭제
// 회원 삭제가 정상적으로 된 경우 - 200 반환
@Test
void 회원_삭제_200() throws Exception {
mockMvc.perform((delete("/users-minj/1"))).andExpect(status().isOk()).andDo(print());
}
// 존재하지 않는 id를 삭제하려는 경우 - 404 반환
@Test
void 회원_삭제_404() throws Exception {
mockMvc.perform((delete("/users-minj/1000"))).andExpect(status().isNotFound()).andDo(print());
}
테스트 완료
참고
- 통합 테스트 의미 - https://tecoble.techcourse.co.kr/post/2021-05-25-unit-test-vs-integration-test-vs-acceptance-test/
- MockMvc 참고 - https://itmore.tistory.com/entry/MockMvc-상세설명
- JUnit 테스트코드 작성 방법 참고 - https://frozenpond.tistory.com/84
반응형
'Study > Spring' 카테고리의 다른 글
User 엔티티를 외래키로 가진 Post 엔티티 추가하기(INSERT) | Spring Spring boot JPA Study (0) | 2022.02.16 |
---|---|
JPA Auditing 사용하여 엔티티 설계하기 | Spring Spring boot JPA Study (0) | 2022.02.15 |
[Spring | test | H2] test에서 H2 DB 연결하기 (0) | 2022.02.12 |
[Spring boot | MySQL] Intellij에 MySQL 연결하기 | 모든 프로젝트에서 연결된 디비 연결하기 (0) | 2022.02.11 |
Controller 예외 처리 | Spring Spring boot JPA Study (1) | 2022.02.11 |
댓글