많은 사람들이 테스트 코드를 작성하는 일이 개발 시간을 늘린다고 생각할 수 있다. 하지만 코드를 검증할 때 테스트 코드를 작성하지 않고 진행한다면 더 큰 시간 소모가 발생할 것이다.
이러한 방식이 얼마나 반복될지 알 수 없으며, 하나의 기능마다 이런 테스트를 하는 것은 비효율적이다. 또한, Print로 결과를 확인하는 것도 한계가 있으며, 테스트 코드는 자동으로 검증을 진행해주기 때문에 수동으로 확인할 필요가 없다.
새로운 기능이 추가될 때 테스트 코드를 통해 기존 코드에 미친 영향을 바로 확인하고 수정해야 할 부분을 파악할 수 있는 장점도 있다.
따라서 테스트 코드는 개발 과정에서 필수적이며 반드시 활용해야 한다.
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
@RunWith(SpringRunner.class)
@WebMvcTest(controllers = HomeController.class)
public class HomeControllerTest {
@Autowired
private MockMvc mvc;
@Test
public void home_return() throws Exception {
// when
String expectedResponse = "Welcome Home!";
// then
mvc.perform(get("/home"))
.andExpect(status().isOk())
.andExpect(content().string(expectedResponse));
}
}
@RunWith(SpringRunner.class)
: JUnit에 내장된 실행자 대신 다른 실행자를 실행시키며, 스프링 부트 테스트와 JUnit 사이의 연결자 역할을 한다.
@WebMvcTest
: Controller만 테스트할 때 사용하며, Spring MVC에 집중할 수 있게 해준다.
@Autowired
: 스프링이 관리하는 Bean을 주입시켜준다.
MockMvc
: 웹 API를 테스트할 때 사용하며, 이를 통해 HTTP GET, POST, DELETE 등에 대한 API 테스트가 가능하다.
mvc.perform(get("/home"))
: "/home" 주소로 HTTP GET 요청을 보내는 상황을 시뮬레이션한다.
.andExpect(status().isOk())
: 결과를 검증하는 메서드로, 여러 개를 이어서 사용할 수 있다. status()는 HTTP Header를 검증하는 것이며, isOk()는 200 상태 코드를 확인한다.
테스트 코드는 코드를 견고하게 만들고, 리팩토링이나 기능 추가 시 발생할 수 있는 문제를 빠르게 확인할 수 있게 해준다. 프로젝트를 진행하면서 다양한 기능을 테스트 코드로 검증하는 습관을 길러야 견고하고 안정적인 애플리케이션을 만들 수 있다.