2020. 9. 15. 16:58ㆍSpring/Spring Boot
1. 스프링 부트 테스트 코드
1) 채용, 우대 사항
대부분의 회사에서의 채용 정보에서는 빌드/테스트/배포 자동화 경험이 있는 사람을 우대한다. 테스트 코드에 대한 요구가 많으며, 실제로 코딩 테스트 알고리즘이 아닌 프로젝트를 만들고, 단위 테스트를 필수 조건으로 둔 회사도 있다.
2) TDD (Test Driven Development), 단위 테스트 (Unit Test)
TDD와 단위 테스트는 별개의 개념이다. TDD는 테스트 코드를 먼저 작성하는 것으로 시작하지만, 단위 테스트는 기능 단위의 테스트 코드를 작성하는 것을 뜻한다. 단위 테스트는 테스트 코드를 반드시 먼저 작성해야하지 않고, 리팩토링도 포함되지 않는다. 순수하게 테스트 코드만 작성하는 것을 뜻한다.
단위 테스트는 개발 단계 초기에 문제를 발견하게 도와주고, 나중에 코드 리팩토링 및 라이브러리 업그레이드 등에서 기존 기능이 올바르게 작동하는지 확인할 수 있다. 기능에 대한 불확실성을 감소시키고 단위 테스트 자체가 시스템에 대한 실제 문서로 사용된다. 일반적으로 많은 개발자가 코드를 수정할 때, 테스트 코드가 없기 때문에 직접 실행하여 수정된 기능을 확인하는 반복적인 일을 수행한다. 이러한 번거로운 작업들은 테스트 코드를 통해 반복적인 프로그램 실행을 그만둘 수 있고 자동 결과 검증 및 개발자가 만든 기능을 안전하게 보호할 수 있다. 또한 새로운 기능을 추가하면서 기존 기능이 잘 작동되는 것을 보장해주기도 한다.
테스트 프레임워크 | 언어 |
JUnit | Java |
DBUnit | DB |
CppUnit | C++ |
NUnit | .net |
3) 메인 클래스 코드
웹 사이트 역순 주소의 이름을 가진 패키지와 Application의 이름을 지닌 클래스를 생성한다. (Application 클래스는 프로젝트의 메인 클래스이다.)
어노테이션 및 코드 | 설명 |
@SpringBootApplication | 스프링 부트의 자동 설정, 스프링 Bean 읽기와 생성을 모두 자동으로 설정된다. 또한 해당 어노테이션이 있는 위치부터 설정을 읽기 때문에 이 어노테이션이 선언된 클래스는 항상 프로젝트의 최상단에 위치해야만 한다. |
SpringApplication.run | 내장 WAS (Web Application Server)를 실행한다. 외부에 WAS를 두지 않고 애플리케이션을 실행할 때 내부에서 WAS를 실행하는 것을 뜻한다. 내부에서 WAS를 실행할 경우, 배포시 서버에 Tomcat을 설치할 필요가 없고 부트로 만들어진 JAR 파일로 실행하면된다. |
※ 외장 WAS를 사용할 경우에는 WAS의 종류, 버전, 설정을 모두 일치시켜야하며 새로운 서버들이 추가될 경우 모든 서버가 같은 WAS 환경을 구축해야하는 번거로움이 존재하기 때문에 스프링 부트에서는 언제 어디서나 동일한 환경에서 배포할 수 있도록 내장 WAS를 사용하는 것을 권장하고 있다.
package com.springbook.biz;
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);
}
}
4) Controller
메인 클래스가 생성된 패키지 하위에 모든 컨트롤러 클래스들을 담을 web 패키지를 생성하고, 테스트를 위한 HelloController 클래스를 생성해준다.
어노테이션 및 코드 | 설명 |
@RestController | 컨트롤러를 JSON을 반환하는 컨트롤러로 만들어주며, @ResponseBody를 각 메서드에 선언하는 번거로움을 해결해준다. |
@GetMapping | HTTP GET Method 요청을 처리할 수 있는 어노테이션이다. |
package com.springbook.biz.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";
}
}
5) Controller 테스트 코드
WAS를 실행하지 않고도 테스트 코드로 검증하기 위해 'src/test/java' 하위에 동일한 패키지를 생성해주고, 테스트할 대상 클래스 이름에 'Test'를 붙인 클래스(HelloControllerTest)를 생성한다. 테스트 작성이 완료가 될 경우 클래스 시작의 왼쪽 항목에 플레이 버튼을 통해 실행을 한다. 테스트 검증이 완료가 될 경우, 콘솔에는 'Test passed' 문구가 출력된다.
어노테이션 및 코드 | 설명 |
@RunWith(SpringRunner.class) | 테스트를 진행할 때 JUnit에 내장된 실행자 외에 다른 실행자를 실행시킨다. 여기서는 SpringRunner 실행자를 사용한다. 즉, 스프링 부트 테스트와 JUnit 사이에 연결자 역할을 수행한다. |
@WebMvcTest | 여러 스프링 테스트 어노테이션 중, Web에 집중할 수 있는 어노테이션이고, 선언할 경우 @Service, @Component, @Repository 등을 제외한 @Controller, @ControllerAdvice 등을 사용할 수 있다. |
@Autowired | 스프링이 관리하는 Bean을 주입받는다. |
private MockMvc mvc | 웹 API를 테스트할 때 사용한다. 스프링 MVC 테슽의 시작점이고 각종 HTTP Method API를 테스트 할 수 있다. |
mvc.perform(get("/hello")) | MockMVC를 통해 '/hello' 주소로 HTTP GET 요청을 한다. 체이닝이 지원되어 여러 검증 기능을 사용할 있다. |
.andExpect(status().isOk()) | mvc.perform 결과를 검증하고 HTTP Header의 Status를 검증한다. (200, 404, 500) |
.andExpect(content().string(hello)) | mvc.perform의 결과를 검증한다. 응답 본문의 내용을 검증한다. 컨트롤러에서 'hello'를 반환하기 때문에 이 값이 맞는지 검증한다. |
※ JUnit은 5 버전까지 나왔으나, JUnit4를 여전히 많이 사용되고 있다.
package com.springbook.biz.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.result.MockMvcResultMatchers.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
@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"))
.andExpect(status().isOk())
.andExpect(content().string(hello));
}
}
6) 메인 클래스 실행 및 결과 확인
모든 테스트 검증이 완료가 되면, 실제 결과화면을 확인한다. Application 메인 클래스를 실행하여 Tomcat의 8080 포트 로그를 확인하고 웹 브라우저로 접속하여 확인한다. 절대로 수동으로 검증하고 테스트 코드를 작성하지 않으며, 테스트 코드 검증 후 확인이 필요할 경우에만 프로젝트를 실행하여 결과를 확인하는 과정을 습득해야한다.
[참고] 스프링 부트와 AWS로 혼자 구현하는 웹 서비스
[참고] www.youtube.com/watch?v=60lLSe1phks&list=PLagTY0ogyVkIl2kTr08w-4MLGYWJz7lNK&index=1
'Spring > Spring Boot' 카테고리의 다른 글
[Spring Boot] 간단한 API 제작 (0) | 2020.09.16 |
---|---|
[Spring Boot] 스프링 부트 JPA (0) | 2020.09.16 |
[Spring Boot] 스프링 부트 롬복 (0) | 2020.09.15 |
[Spring Boot] 스프링 부트 시작하기 (0) | 2020.09.15 |