TIL 2 | 단위 테스트 코드

softpeter·2021년 8월 12일
0
post-thumbnail

단위 테스트 코드를 작성하는 이유

  1. 빠른 피드백
    • 톰캣을 내렸다가 다시 실행하는 일을 반복하지 않음
  2. 자동 검증
    • 출력으로 확인하는 검증 단계를 하지 않고, 자동으로 검증이 가능
  3. 기능을 안전하게 보호
    • 기존에 잘 되던 기능에 문제가 생길 가능성이 낮아짐

테스트 코드 작성을 도와주는 프레임워크
Java에서는 JUnit 을 사용

Hello Controller 테스트 코드 작성

Application Class

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.
SpringBootApplication;

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
  • 메인 클래스
  • @SpringBootApplication으로 인해 스프링 부트의 자동 설정, 스프링Bean 읽기와 생성을 모두 자동으로 설정
    • @SpringBootApplicataion이 있는 위치부터 설정을 읽어 가기 때문에 프로젝트의 최상단에 위치해야만 함
  • SpringApplicataioin.run으로 인해 내장 WAS(Web Applicataion Server)를 실행
    • 내장 WAS를 사용하여 언제 어디서나 같은 환경에서 스프링 부트를 배포할 수 있음

Controller

HelloController

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.
RestController;

@RestController
public class HelloController {

    @GetMapping("/hello")
    public String hello() {
        return "hello";
    }
}
  • @RestController
    • 컨트롤러를 JSON을 반환하는 컨트롤러로 만들어 줌
  • @GetMapping
    • HTTP Method인 Get의 요청을 받을 수 있는 API를 만들어 줌

HelloControllerTest

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 org.springframework.test.web.servlet.ResultActions;
import scraping.coocon.com.web.HelloController;

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

@RunWith(SpringRunner.class)
@WebMvcTest(controllers = HelloController.class)
public class HelloControllerTest {

    @Autowired
    private MockMvc mvc;

    @Test
    public void hello가_리턴된다() throws Exception {
        String hello = "hello";

        mvc.perform(get("/hello"))
                .andExpect(status().isOk())
                .andExpect(content().string(hello));
    }
}
  • @RunWith(SpringRunner.class)
    • 테스트를 진행할 때 JUnit에 내장된 실행자 외에 다른 실행자를 실행시킴
    • 위 코드에서는 SpringRunner 라는 스프링 실행자를 사용
    • 즉, 스프링 부트 테스트와 JUnit 사이에 연결자 역할
  • @WebMvcTest
    • 여러 스프링 테스트 어노테이션 중, Web에 집중할 수 있는 어노테이션
    • 선언할 경우 @Controller, @controllerAdvice 등을 사용 가능
    • 단, @Service, @Component, @Repository 등은 사용 불가
    • 위 코드에서는 컨트롤러만 사용하기 때문에 선언
  • @Autowired
    • 스프링이 관리하는 빈(Bean)을 주입 받음
  • private MockMvc mvc
    • 웹 API를 테스트할 때 사용
    • 스프링 MVC 테스트의 시작점
    • 이 클래스를 통해 HTTP GET, POST 등에 대한 API 테스트를 할 수 있음
  • mvc.perform(get("/hello"))
    • MockMvc를 통해 /hello 주소로 HTTP GET 요청
    • 체이닝 지원이되어 아래와 같이 여러 검증 기능을 이어서 선언할 수 있음
  • .andExpect(status().isOk())
    • mvc.perform의 결과를 검증
    • HTTP Header의 Status를 검증
    • 위 코드는 OK 즉, 200인지 아닌지를 검증
  • .andExpect(content().string(hello))
    • mvc.perform의 결과를 검증
    • 응답 본문의 내용을 검증
    • 위 코드는 "hello"를 리턴하기 때문에 이 값이 맞는지 검증
profile
dev.Back-end | Aal izz well

0개의 댓글