지금까지는 코드 작성이 정상적으로 실행되는지를 서버를 켜고 API를 요청하는 방법으로 확인했다.
확실하긴 하지만 사람이 테스트한다는 점에서 귀찮음이 있다.
코드를 통해서 자동화하는 방법을 알아보고자 한다.
// controller/ApiController.java
@RestController
@RequestMapping("/api")
public class ApiController {
@GetMapping("/")
public String hello(){
return "Hello";
}
}
간단한 코드를 하나 작성했다.
클래스 안에 커서를 두고 Ctrl + Shift + T를 누르면 테스트코드 작성 창이 나온다.
확인을 누르면 테스트 폴더에 같은 레벨의 폴더에 테스트 코드가 만들어진다.
// test/controller/ApiControllerTest.java
class ApiControllerTest {
}
테스트클래스명은 <<클래스명>>Test 로 짓는게 국룰인 듯 하다.
Controller 테스트를 위해 Mock이라는 라이브러리를 사용한다.
// test/controller/ApiControllerTest.java
@WebMvcTest(ApiController.class)
@AutoConfigureWebMvc
class ApiControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
public void test1() throws Exception {
mockMvc.perform(
MockMvcRequestBuilders.get("http://localhost:8080/api/")
).andExpect(
MockMvcResultMatchers.status().isOk()
).andExpect(
MockMvcResultMatchers.content().string("Hello")
).andDo(MockMvcResultHandlers.print());
}
}
@WebMvcTest : 테스트 할 컨트롤러를 지정한다.
@AutoConfigureWebMvc : 웹에 특화된 테스트자원만 불러온다. (SpringBootTest보다 가볍다.)
@Autowired : Dependency Injection과 관련된 어노테이션인 것 같다.
@Test : 테스트임을 나타내는 어노테이션이다. 함수 단위로 테스트 진행이 가능하다.
코드는 직관적이어서 무슨 기능을 하는지 알아 볼 수 있을 것이다.
perform : 요청을 수행한다.
MockMvcRequestBuilders.get : get요청을 주소로 보낸다. (post, put, delete 도 동일하게 존재)
andExpect : 다음 결과가 나오길 기대한다. (다른 결과가 나오면 에러)
andDo : 결과를 모두 받고 할 일 (위 코드에서는 결과 출력)
물론 쿼리 파라미터도 받을 수 있다.
빌더의 get 뒤에 queryParam을 붙이면 된다.
MockMvcRequestBuilders.get("url").queryParam("param1", "value1").queryParam("param2", "value2");
post도 테스트해보자.
// controller/ApiController.java
@RestController
@RequestMapping("/api")
public class ApiController {
@PostMapping("/post")
public String add(@RequestBody DataDTO data){
return data.getName();
}
}
// dto/DataDTO.java
@Data
public class DataDTO {
String name;
Long age;
}
지극히 간단한 post요청 하나를 만들었다.
이에 대응되는 테스트도 만들어보자.
@WebMvcTest(ApiController.class)
@AutoConfigureWebMvc
class ApiControllerTest {
// ...
@Test
public void test2() throws Exception{
DataDTO data = new DataDTO();
data.setName("name");
data.setAge(99L);
String json = new ObjectMapper().writeValueAsString(data);
mockMvc.perform(
MockMvcRequestBuilders.post("http://localhost:8080/api/post")
.contentType(MediaType.APPLICATION_JSON)
.content(json)
).andExpect(
MockMvcResultMatchers.status().isOk()
).andExpect(
MockMvcResultMatchers.content().string("name")
);
}
}
post는 높은 확률로 RequestBody를 받기 때문에 테스트 전에 객체를 만들어서 json으로 변환해야 한다.
이 과정에서 ObjectMapper가 사용되는데 스프링에서 자동으로 사용해주던걸 직접 호출한 것이다.
그렇게 데이터를 형식에 맞게 보내면 테스트가 완료된다.
테스트는 매우 중요하다.
최근 TDD라고 하면서 선 테스트코드 후 개발방법도 많이 대두되었고 테스트를 위한 기법도 여럿 나오고 있는 상황이다.
아직 초보라서 깊은 내용은 잘 모르겠지만 나중에 좀 유심히 봐야겠다.
'프로그래밍 > 스프링' 카테고리의 다른 글
[스프링] 8. JPA (0) | 2022.08.04 |
---|---|
[스프링] 7. Object Relational Mapping (0) | 2022.08.02 |
[스프링] 5. Lombok (0) | 2022.07.22 |
[스프링] 4. Object Mapper (0) | 2022.07.18 |
[스프링] 3. REST API 만들기 (0) | 2022.07.16 |