본문 바로가기
책/[스프링부트와 AWS로 혼자 구현하는 웹서비스]

스프링 부트 - 3) 스프링 부트에서 테스트 코드 작성

by LeeGangEun 2021. 12. 24.

TDD : 테스트가 주도하는 개발

단위 테스트 : TDD의 첫 번째 단계인, 기능단위의 테스트코드를 작성하는 것 따라서, TDD와 단위테스트는 다르다.

RED : 항상 실패하는 테스트 먼저 작성한다.

Green : 테스트가 통과하는 프로덕션 코드를 작성한다.

Refactor : 테스트가 통과하면 프로덕션 코드를 리팩토링한다.

 

 

단위 테스트 코드 작성 이점 

1) 개발초기에 문제를 발견하게 도와준다.

2) 개발자가 나중에 리팩토링하거나 라이브러리 업그레이드 등에서 기존 기능이 올바르게 작동하는지 확인가능(예, 회귀 테스트)

3) 기능에 대한 불확실성을 감소시킬 수 있다.

4) 시스템에 대한 실제 문서를 제공한다. 즉, 단위 테스트 자체가 문서로 사용할 수 있다.

 

테스트 코드 작성을 도와주는 프레임워크 종류 

1) JUnit - Java

2) DBunit - DB

3) CPPUnit - C++

4) NUnit  - .net

 

Hello Controller 테스트 코드 작성하기 

src - main - java - new - package 생성  ( 보통 패키지 이름은 사이트 주소 역순으로 지정한다. )

package - new - java class - Class Name(Application) 생성

 

밑에 코드 삽입

package com.gangeun.admin;
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 읽기와 생성을 모두 자동으로 설정 

->@SpringBootApplication이 있는 위치부터 설정을 읽어가기 때문에 항상 프로젝트 최상단 위치

@SpringApplication.run

  ->내장 WAS를 실행

 -> 별도로 외부에 WAS를 두지않고 애플리케이션을 실행

 -> 톰캣을 설치할 필요가 없고, 스프링 부트로 만들어진 Jar 파일로 실행하면 된다.

 -> 언제 어디서나 같은 환경에서 스프링 부트를 배포할 수 있다.

 

 

생성한 패키지 하위에 - 패키지 추가로 생성(web) - new - java class - Class Name(Controller) 생성

 

밑에 코드 삽입

 

package web;


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을 반환하는 컨트롤러로 만들어 줌.

 -> 예전에는 @ResponseBody를 각 메소드마다 선언했던 것을 한번에 사용할 수 있게 해준다고 생각하면 된다.

@GetMapping

 -> HTTP Method인 get의 요청을 받을 수 있는 API를 만들어 준다.

 -> 이제 이 프로젝트는 /hello로 요청이 오면 문자열 hello를 반환하는 기능을 갖게 되었다.

 

1) src/test/java 디렉토리에 앞에서 생성했던 패키지를 그대로 다시 생성

2) 패키지 우클릭 - new - java class - HelloControllerTest 생성

 

밑에 코드 삽입

package com.gangeun.admin.web;

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 com.gangeun.admin.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, @Respositiory 등을 사용할 수 없다.

@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의 Staute를 검증한다.

 -> 우리가 알고 있는 200,404,500 등의 상태를 검증한다.

 -> 여기선 OK 즉, 200인지 아닌지를 검증한다.

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

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

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

 -> Controller에서 "hello"를 리턴하기 때문에 이 값이 맞는지 검증한다.

테스트 통과가 확인되면

Application.java 파일로 이동후 메인메소드 실행 

웹 브라우저에서 http://localhost:8080/hello 접속 후 hello가 출력되면 성공!