짱아의 개발 기록장

Chapter 02. Spring Boot에서 테스트 코드를 작성하자 본문

개발 프로젝트 정리/[스프링 부트와 AWS로 혼자 구현하는 웹 서비스] 책 정리

Chapter 02. Spring Boot에서 테스트 코드를 작성하자

jungahshin 2021. 2. 20. 22:06
반응형

테스트 코드 소개하기

많은 IT회사에서 실제로 사용하는 TDD(Test Driven Development, 테스트 주도 개발)에 관련해서, TDD의 첫 번째 단계인 기능 단위의 테스트 코드를 작성하는 법을 배우는 Chatper입니다.

즉, 테스트 코드 작성의 기본을 배워봅니다.

 

일단, 테스트 코드를 작성하면 좋은 점에 대해 정리해봅시다.

일반적으로 테스트 코드를 작성하지 않고 개발을 하게 되면 다음과 같은 과정을 거치게 됩니다.

  • 코드 작성
  • 프로그램(Tomcat) 실행
  • Postman과 같은 API 테스트 도구로 HTTP요청을 하고
  • 요청 결과를 System.out.println()으로 눈으로 검증합니다.
  • 결과가 다르면 다시 프로그램(Tomcat)을 중단시키고 코드를 수정합니다.

첫 번째, 위와 같이 Tomcat을 실행하고 중단하고를 반복하는 작업을 하지 않아도 됩니다.

두 번째, 테스트 코드를 작성하면 더는 사람이 눈으로 검증하지 않도록 자동검증이 가능합니다.

세 번째, 개발자가 만든 기능을 안전하게 보호해줍니다. 예를 들어, B라는 기능이 추가되어 테스트를 하는데 기존에 잘되던 A기능에 문제가 발생할 수도 있습니다. 이렇게 새로운 기능이 추가될 때, 기존 기능이 잘 작동되는 것을 보장해주는 것이 테스트 코드이기 때문에 개발자들이 힘들게 개발한 기능들을 보호해주는 기능을 하게 됩니다.

 

대표적으로 테스트 코드 작성을 도와주는 프레임워크들이 있는데, 아래와 같습니다.

JUnit - Java

CppUnit - C++

DBUnit - DB

 

따라서, 앞으로는 테스트 코드를 작성하기 위해 JUnit을 사용할 예정입니다. 그 중에서도 아직 많은 회사에서 사용하고 있는 JUnit4를 사용하겠습니다.

 

Hello Controller 테스트 코드 작성하기

1) HelloController 코드 작성하기

 

main 파일 구성

src/main/java/com/jungahshin/blog/springboot/web/HelloController 파일에는 다음과 같은 코드를 작성해줍니다.

@RestController

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

@GetMapping

  • HTTP Method인 GET의 요청을 받을 수 있는 API를 만들어 준다.

 

2) HelloControllerTest 코드 작성하기

 

test 파일 구성

src/test/java/com/jungahshin/blog/springboot/web/HelloControllerTest 파일에는 다음과 같은 코드를 작성해줍니다.

 

@RunWith(SpringRunner.class)

  • 스프링 부트 테스트와 JUnit 사이에 연결자 역할을 한다. 

@WebMvcTest

  • 여러 스프링 테스트 어노테이션 중, Web(Spring Mvc)에 집중할 수 있는 어노테이션이다.
  • 선언할 경우 @Controller, @ControllerAdvice 등을 사용할 수 있다.
  • But, @Component, @Service, @Repository 등은 사용할 수 없다.
  • 여기서는 컨트롤러만 사용하기 때문에 선언한다.

@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의 Status를 검증한다.
  • 우리가 흔히 알고 있는 200, 400, 500 등의 상태를 검증한다.
  • 여기서는 OK 즉, 200인지 아닌지를 검증한다.

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

  • mvc.perform의 결과를 검증한다.
  • 응답 본문의 내용을 검증한다.
  • Controller에서 "hello"를 리턴하기 때문에 이 값이 맞는지를 검증한다.

Lombok 설치하기

Lombok은 자바 개발할 때 자주 쓰는 getter, setter, 기본생성자 등을 어노테이션으로 자동 생성해줍니다.

인텔리제이에서는 플러그인을 통해서 쉽게 설치할 수 있습니다.

 

Hello Controller 코드를 롬복으로 전환하기

1) HelloResponseDto 코드 작성하기

 

HelloResponseDto 추가

src/test/java/com/jungahshin/blog/springboot/web/dto/HelloResponseDto 파일에 다음과 같은 코드를 작성해줍니다.

@Getter

  • 선언된 모든 필드의 get 메소드를 생성해준다.

@RequiredArgsConstructor

  • 선언된 모든 final 필드가 포함된 생성자를 생성해준다. ex) void HelloResponseDto(String name, int amount) { }
  • final키워드가 없는 필드는 생성자에 포함되지 않는다.

2) HelloResponseDtoTest 코드 작성하기

 

HelloResponseDtoTest 추가

src/test/java/com/jungahshin/blog/springboot/web/dto/HelloResponseDtoTest 파일에 다음과 같은 코드를 작성해줍니다.

assertThat

  • assertj라는 테스트 검증 라이브러리의 검증 메소드이다.
  • 검증하고 싶은 대상을 메소드의 인자로 받는다.
  • 메소드 체이닝이 지원되어 isEqualTo와 같은 메소드를 이어서 사용할 수 있다.

isEqualTo

  • assertj의 동등 비교 메소드이다.
  • assertThat의 인자에 들어있는 값과 isEqualTo의 값을 비교해서 같을 때만 성공이다.

3) HelloController 파일에 새로 만든 HelloResponseDto를 사용하도록 코드를 추가한다.

 

HelloController 파일

@RequestParam

  • 외부에서 API로 넘긴 파라미터를 가져오는 어노테이션이다.
  • 여기서는 외부에서 name (@Request("name"))이란 이름으로 넘긴 파라미터를 helloDto 메소드의 파라미터 name (String name)에 넣는다.

즉, 위의 코드에서 name, amount 모두 API를 호출하는 곳에서 넘겨준 파라미터 값이다.

 

3) HelloControllerTest 파일에 "/hello/dto" API를 테스트할 수 있는 코드를 추가한다.

 

HelloControllerTest 파일

param

  • API 단위 테스트를 할 때, 사용될 요청 파라미터를 설정한다.
  • 단, 값은 반드시 String 형태로만 가능하다!
  • 그래서 숫자/날짜와 같은 데이터들도 등록할 때는 반드시 문자열로 변경해야 한다.

jsonPath

  • JSON 응답값을 필드 단위로 나누어서 검증할 수 있도록 하는 메소드이다.
  • $을 기준으로 필드를 명시한다.
  • 여기서는 name, amount를 검증하기 때문에 $.name, $.amount로 필드명을 명시했다.

 

반응형
Comments