본문 바로가기

기록/스프링 부트와 AWS로 혼자 구현하는 웹 서비스

Chapter 2. 스프링 부트에서 테스트 코드 작성

728x90
SMALL

2.1 테스트 코드 소개

TDD  =/=  단위 테스트(Unit Test)

 

TDD

: 테스트가 주도하는 개발

 

레드 그린 사이클

1. 항상 실패하는 테스트를 먼저 작성 - Red

2. 테스트가 통과하는 프로덕션 코드를 작성 - Green

3. 테스트가 통과하면 코드를 리팩토링 - Refactor

 

단위 테스트

: TDD의 첫 번째 단계 - 기능 단위의 테스트 코드를 작성하는 것

리팩토링 포함 X

 

테스트 코드의 장점 

- 개발단계 초기에 문제를 발견하게 도와준다 (빠른 피드백)

- 개발자가 나중에 코드를 리팩토링하거나 라이브러리 업그레이드 등에서 기존 기능이 올바르게 작동하는지 확인할 수 있다(ex.회귀 테스트) (자동검증)

- 기능에 대한 불확실성을 감소 (기존 기능 보호 및 보장)

- 시스템에 대한 실제 문서 제공. 즉, 단위 테스트 자체가 문서로 사용 가능

 

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

ex) xUnit 의 종류

JUnit - Java

DBUnit - DB

CppUnit - C++

NUnit - .net

 

2.2 Hello Controller 테스트 코드 작성하기

패키지 생성

일반적으로 패키지명은 웹 사이트 주소의 역순

ex. admin.jojoldu.com -> com.jojoldu.admin

 

Java class 생성

package com.jojoldu.book.springboot;

// import : Mac - option + Enter / Window/Linux : Alt + Enter
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication // 스프링 부트의 자동 설정, 스프링 Bean 읽기과 생성을 모두 자동으로 설정, 이것이 있는 위치부터 설정을 읽으므로 이 클래스는 항상 프로젝트 최상단에 위치해야함
public class Application {
    public static void main(String[] args){
        SpringApplication.run(Application.class, args); // 내장 WAS 실행
    }
}

Application : 메인 Class

 

내장 WAS - 서버에 톰캣을 설치할 필요 없어짐. 스프링 부트로 만들어진 Jar 파일로 실행

 : 언제 어디서나 같은 환경에서 스프링 부트를 배포 할 수 있기에 권장

 

테스트를 위한 Controller 만들기

 

현재 패키지 하위에 web 패키지 생성 - Controller와 관련된 클래스 담기

 

HelloController 생성 후 간단한 API 만들기

package web;

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

@RestController // JSON을 반환하는 컨트롤러로 만들어줌. @ResponseBody를 각 메소드마다 선언했던 것을 한번에 사용할 수 있게 해준다
public class HelloController {
    
    @GetMapping("/hello") // Http Method인 Get의 요청을 받을 수 있는 API를 만들어줌
    public String hello(){
        return "hello";
    }
}

* 예전에는 @RequestMapping(method = RequestMethod.GET)으로 사용되었다

 

HelloControllerTest 생성 후 테스트 코드 추가

package com.jojoldu.book.springboot;

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.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) //테스트를 진행할 때 JUnit에 내장된 실행자 외에 다른 실행자를 실행시킨다. 여기서는 SpringRunner라는 스프링 실행자를 사용. 즉, 스프링 부트 테스트와 JUnit 사이에 연결자 역할.
@WebMvcTest // Web(Spring MVC)에 지중할 수 있는 어노테이션. 선언할 경우 @Controller, @ControllerAdvice 등을 사용할 수 있다. (단, @Service, @Component, @Repository 등은 사용할 수 없다)
public class HelloControllerTest {

    @Autowired // 스프링이 관리하는 Bean을 주입받는다
    private MockMvc mvc; // 웹 API를 테스트할 때 사용한다. 스프링 MVC 테스트의 시작점. 이 클래스를 통해 HTTP GET, POST 등에 대한 API 테스트를 할 수 있다.

    @Test
    public void hello가_리턴된다() throws Exception{
        String hello = "hello";
        
        mvc.perform(get("/hello")) // MockMvc를 통해 /hello 주소로 HTTP GET 요청을 한다. 체이닝 지원->아래와 같이 여러 검증 기능을 이어서 선언 가능
                .andExpect(status().isOk()) // mvc.perform의 결과를 검증. HTTP Header의 Status를 검증. 200,404,500 등의 상태 검증.(여기선 OK 즉, 200인지 아닌지 검증)
                .andExpect(content().string(hello)); // mvc.perform의 결과를 검증. 응답 본문의 내용을 검증. Controller에서 "hello"를 리턴하기 때문에 이 값이 맞는지 검증
    }
}

테스트 코드 실행 

-> @Test 메소드 왼쪽의 화살표 클릭

Run 을 클릭한다.

 

그런데 테스트 실패가 떴다...

자세히 보니 Controller가 들어있는 web 폴더가 Application 파일과 같은 곳에 있지 않고 밖으로 빠져나와 있었다.

다시 옮겨서 실행하니 테스트가 성공하였다.

테스트 통과

수동으로도 확인해보자.

Application. java 파일로 이동하여 Run해준다.

스프링 부트 로그가 보이며

톰캣 서버가 8080 포트로 실행되었다는 것을 확인할 수 있다.

 

브라우저를 열어 localhost:8080/hello 로 접속하면

hello 가 뜨는 것을 확인할 수 있다.

728x90