기타/Spring boot

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

inanJeong 2020. 5. 12. 23:43

 

TDD(Test Drive4n Development): 테스트 주도 개발

 

★레드 그린 사이클

Red: 항상 실패하는 테스트를 먼저 작성
Green: 테스트를 통과하는 프로덕션 코드를 작성
Refactor:테스트가 통과하면 프로덕션 코드를 리펙토링

 

단위 테스트

  • 개발단계 초기에 문제 발견을 도와줌
  • 개발자가 나중에 코드를 리팩토링하거나 라이브러리 업그레이드 등에서 기존 기능이 올바르게 작동되는지 확인가능
  • 기능에 대한 불확실성을 감소
  • 시스템에 대한 실제 문서 제공

테스트 코드 프레임워크

  • Java - Junit
  • DB - DBUnit
  • c++ - cppUnit

 

프로젝트 생성

프로젝트 - src - main - java, new - package 생성

 

※ 패키지 이름은 일반적으로 사이트 이름을 반대로 적은것으로 한다. ex) com.naver.www

 

새로운 클래스 생성(Application)

  • @SpringBootApplication 어노테이션: 스프링 부트의 자동설정, 스프링 Bean 읽기와 생성을 자동으로 설정
  • SpringBootApplication.run: 내장된 웹 애플리케이션 서버를 실행 -> 톰캣 설치 x
    • 내장 서버 사용 권장 -> 어떠한 환경에서도 스프링 부트 배포 가능

 

Web 패키지 생성(controller)

main/.../Web/HelloController

  • @RestController 어노테이션: 컨트롤러를 JSON을 반환하는 컨트롤러로 만듬
  • @GetMapping: HTTP 메소드인 Get의 요청을 받을 수 있는 API를 만듬

 

테스트 파일 HelloContollerTest 생성

test/.../Web/HelloControllerTest

  • @RunWith(SpringRunner.class)
    • 테스트를 진행할 때 JUnit에 내장된 실행자 외 다른 실행자를 실행 시킴
    • 여기서는 SpringRunner를 실행자를 사용
    • 스프링 부트 테스트와 JUnit사이에서 연결자 역할
  • @WebMvcTest
    • 여러 스프링 테스트 어노테이션 중, Web(Mvc)에 집중할 수 있는 어노테이션
    • @Controller, @ControllerAdvice와 함께 사용 가능
    • @Service, @Component, @Repository 등은 사용 불가
    • 여기서는 컨트롤러만 사용하기 때문에 선언
  • @Autowired: 스프링이 관리하는 빈을 주입 받음
  • @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, 404, 500 등의 상태를 검증
    • 여기선 200인지 아닌지를 검증
  • .andExpect(content().string(hello))
    • mvc.perform의 결과를 검증
    • 응답 본문의 내용을 검증
    • Controller에서 hello를 리턴하기 때문에 이 값이 맞는지 검증

 

롬북(lombok)

자바를 개발할 때 자주 사용하는 코드 Getter, Setter, 기본생성자, toString 등을 어노테이션으로 자동 생성

 

1. build.gradle 의존성 추가

2. plugins에서 설치

 

Hello Controller 코드 롬북으로 전환

web/dto/HelloResponseDto

  • @Getter: 선언된 모든 필드의 get 메소드를 생성
  • @RequiredArgsConstructor
    • 선언된 모든 final 필드가 포함된 생성자를 생성
    • final이 없는 필드는 생성자에 포함되지 않는다.

 

 

※ DTO(Data Transfer Objcet)

  • 계층간 데이터 교환을 위한 객체(Java Beans)
  • 데이터베이스에서 데이터를 얻어 Service나 Controller 등으로 보낼 때 사용하는 객체
  • 로직을 갖지 않는 순수한 데이터 객체이며, Getter/Setter 메서드만을 갖는다.
  • Request와 Response용 DTO는 View를 위한 클래스

※ DAO(Data Access Objcet)

  • 실제로 데이터베이스에 접근하는 객체
  • Service와 DB를 연결하는고리의 역할
  • SQL을 사용하여 DB에 접근한 후 적절한 CRUD API 제공
  • extends JpaRepository<User, Long>

※ Entity Class(domain package)

  • 실제 데이터베이스 테이블과 매칭될 클래스
  • @Entity, @Column, @Id 등을 이용
Client <-DTO-> controller - service - repository(DAO) <-Entity class-> DataBase

 

참고. https://gmlwjd9405.github.io/2018/12/25/difference-dao-dto-entity.html

 

 

 

HelloResponseDtoTest 코드 작성

test/.../web/dto/HelloResponseDtoTest

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

 

HelloController 코드 수정

web/HelloController

  • @RequestParam
    • 외부에서 API로 넘긴 파라미터를 가져오는 어노테이션
    • 여기서는 외부에서 name이란 이름으로 파라미터를 메소드 파라미터name에 저장하게 됩니다.

 

HelloControllerTest 코드 수정

web/HelloControllerTest

  • param
    • API테스트를 할 때 사용될 요청 파라미터를 설정
    • String만 허용 -> 숫자, 날짜 데이터를 등록할 때는 문자열로 변경해야함
  • jsonPath
    • JSON 응답값을 필드별로 검증할 수 있는 메소드
    • $를 기준으로 필드명을 명시

참고. 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 - 이동욱 지음

  • 더욱 상세한 설명은 책은 꼭 구매하셔서 확인하시길 바랍니다.