SPRINGBOOT

[SPRINGBOOT]테스트코드 작성

킴크스 2022. 4. 4. 02:02

참조 : 스프링부트와 AWS로 혼자 구현하는 웹 서비스(이동욱 저)

 

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

 

1. 테스트 코드 소개

 

* TDD

Test Driven Development의 약자로 테스트 주도 개발이라고 한다. 

작은 단위의 테스트 테이스를 작성하고 이를 통과하는 토드를 추가하는 단계를 반복하여 구현한다.

 

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

 

- 테스트가 성공하는 프로덕션 코드를 작성

 

- 테스트가 통과하면 프로덕션 코드를 리팩토링

 

 

* 단위 테스트 : 기능단위의 테스트 코드를 작성하는 것

 

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

- 단위 테스트는 개발단계 초기에 문제를 발견하게 해준다.

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

- 단위 테스트는 기능에 대한 불확실성을 감소시킬 수 있다.

- 단위 테스트는 시스템에 대한 실제 문서를 제곤한다. 

- 빠른 피드백

- 자동검증

- 개발자가 만든 기능을 안전하게 보호(새로운 기능이 추가될 때 기존 기능이 잘 작동되는 것을 보장)

 

앞으로 자바용 테스트 프레임워크인 JUnit을 사용하도록 할 것이다.

 

2. 테스트 코드 작성하기

 

① 자바 디렉토리 밑에 패키지를 생성해준다.

② 웹 사이트 주소의 역순으로 패키지 명을 설정한다.

③ 해당 패키지 밑에 JAVA 클래스를 생성한다.

④ 클래스 명을 설정한다.

⑤ 코드를 작성한다.

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

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

내장 WAS란 별도로 외부에 WAS를 두지 않고 애플리케이션을 실행할 때 내부에서 WAS를 실행하는 것이다.

즉, 톰캣을 설치할 필요가 없다.

스프링 부트에서 내장 WAS 사용이 권장되는 이유는 언제 어디서나 같은 환경에서 스프링 부트를 배포할 수 있기 때문이다.

 

⑥ 현재 패키지에 하위 패키지 'web'을 만들어준다.

 컨트롤러와 관련된 쿨래스들을 모두 이 web패키지에 담을 것이다.

 

⑦ web 패키지 밑에 'HelloController'라는 컨트롤러(JAVA 클래스)를 만들어준다.

⑧ API 만들기

package com.study.crystal.test.web;

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

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

⑨ src/test/java 밑에 똑같은 패키지를 생성해준다.

 

⑩ 테스트 코드를 작성할 클래스를 생성한다. 

보통은 대상 클래스 이름에 Test를 붙여서 생성한다.

⑪  테스트 코드를 작성한다.

package com.study.crystal.test.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 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;

//스프링 부트 테스트와 JUnit 사이에 연결자 역할을 함 
//SpringRunner라는 스프링실행자를 사용한다는 의미
@RunWith(SpringRunner.class)

@WebMvcTest(controllers = HelloController.class) // 스프링 어노테이션 중 웹에 집중할 수 있는 어노테이션
public class HelloControllerTest {
    //빈 주입 어노테이션
    @Autowired
    //웹 API 테스트할 때 사용
    //스프링 MVC 테스트의 시작점
    // 이 클래스를 통해 HTTP, GET, POST 등에 대한 API 테스트가 가능
    private MockMvc mvc; 

    @Test
    public void hello가_리턴된다() throws Exception {
        String hello = "hello";
        //MockMvc를 통해 /hello 라는 주소로 HTTP GET 요청
        //체이닝 지원
        mvc.perform(get("/hello")).
        		//mvc.perform의 결과를 검증
                	//HTTP Header의 Status를 검증(200, 404, 500등의 상태)
        		andExpect(status().isOk()). //Ok, 즉 200인진 아닌지 검증
                	//응답 본문의 내용을 검증
                	andExpect(content().string(hello)); //Controller에서 "hello"를 리턴하는지 검증

    }
}

⑬⑫ 왼쪽의 화살표를 눌러 테스트 코드를 실행한다.

검증 성공!

⑬ 수동 실행한다.

Application 클래스의 main함수 옆 화살표를 눌러 실행시켜준다.

실행 시키면 8080 포트로 톰캣서버가 실행되었다고 로그가 찍힌다.

⑭ 브라우저를 통해 확인!

수동으로 검증하고 테스트 코드를 작성하는 것이 아니다. 

테스트 코드로 먼저 검증을 한 후, 정말 결과에 대한 신뢰가 없을 때 직접 프로젝트를 실행시켜 확인을 한다.