프로그래밍/스프링

[스프링] 6. 테스트코드 작성

riroan 2022. 8. 2. 04:51

지금까지는 코드 작성이 정상적으로 실행되는지를 서버를 켜고 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