공부/Spring

스프링 부트에서 테스트 코드를 작성

동곤영 2022. 6. 18. 00:06

본 포스트는 이동욱님의 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 책을 참고하여 작성하였습니다.

 

스프링 부트에서 테스트 코드를 작성하자

 

TDD라는 단어는 많이 들어봤지만 내용은 자세히 몰랐는데 마침 이 책에 나와있다.

 

TDD는 테스트 Test Driven Development의 약자로 테스트가 주도하는 개발을 이야기한다.

 

 단위 테스트 코드를 작성함으로써 얻는 이점은 다음과 같다.

  • 단위 테스트는 개발단계 초기에 문제를 발견하게 도와줍니다.
  • 단위 테스트는 개발자가 나중에 코드를 리팩토링하거나 라이브러리 업그레이드 등에서 기존 기능이 올바르게 작동하는지 확인할 수 있습니다.
  • 단위 테스트는 기능에 대한 불확실성을 감소시킬 수 있습니다.
  • 단위 테스트는 시스템에 대한 실제 문서를 제공합니다. 단위 테스트 자체가 문서로 사용할 수 있습니다

 

테스트 코드 작성해보기

Application.java

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 읽기와 생성을 모두 자동으로 설정 해준다.

      - 이 어노테이션이 있는 위치부터 설정을 읽어가기 때문에 항상 프로젝트의 최상단에 위치 해야함.

 

- SpringApplication.run

      - main 메소드에서 실행하는 SpringApplication.run으로 인해 내장 WAS를 실행한다.

 


HelloController.java

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

@RestController
public class HelloController {
        @GetMapping("/hello")
        public String hello() {
                return "hello";
        }
}

@RestController

      - 컨트롤러를 JSON을 반환하는 컨트롤러로 만들어 준다.

 

@GetMapping

      - Get 요청을 받을 수 있는 API를 만들어 준다.


HelloControllerTest.java

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 static org.hamcrest.Matchers.is;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;

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

    @Autowired
    private MockMvc mvc;

    @Test
    public void helloReturn() throws Exception {
        String hello = "hello";

        mvc.perform(get("/hello")) // /hello 주소로 HTTP GET 요청을 한다.
                .andExpect(status().isOk())
                .andExpect(content().string(hello));
    }
    
}

- @RunWith(SpringRunner.class)

      - 테스트를 진행할 때 JUnit에 내장된 실행자 외에 다른 실행자를 실행시킨다.

 

- @WebMvcTest

      - Web(Spring MVC)에 집중할 수 있는 어노테이션이다. (여기선 컨트롤러만 사용하기 때문에 선언한다)

 

- MockMvc

      - HTTP GET , POST 등에 대한 API 테스트를 할 수 있는 클래스

 

- .andExpect(status().isOk())

      - mvc.perform의 결과를 검증한다.

      - HTTP Header의 Status가 isOK <- 200인지 아닌지를 검증한다

 

- .andExpect(content().string(hello))

     - mvc.perform의 결과를 검증한다.

     - 응답의 본문 내용을 검증한다.

     - 컨트롤러에서 "hello"를 리턴하기 때문에 이 값이 맞는지 검증한다.

'공부 > Spring' 카테고리의 다른 글

Lombok(롬복)  (0) 2022.06.18