본문 바로가기
Backend - Java Spring/Spring Boot 입문(완)

[SpringBoot3] 테스트코드

by VictorMeredith 2023. 10. 20.

1. 테스트 코드

- 꼼꼼히 잘 작성해야 좋은 프로그래밍이다. 당연하다.

- JS진영의 JEST기반의 유테/통테를 사용해봤으니, 금방 익혔으면 좋겠다.

 

2. SpringBoot의 테스트코드

- test 디렉터리에서 작업한다.

- 다양한 패턴이 있으나, 여기에서는 given-when-then 패턴을 사용한다.

- given : 테스트 실행을 준비하는 단계

- when : 테스트를 진행하는 단계

- then : 테스트 결과를 검증하는 단계

 

3. SpringBoot의 테스트도구

- spring-boot-starter-test 스타터에 테스트를 위한 도구가 모여있다.

- 주로 JUnit과 AssertJ를 가장 많이 사용한다.

 

4. JUnit 사용 배우기

- JUnit : 단위테스트에 사용한다. 테스트 방식을 구분할 수 있는 애너테이션 제공, @Test로 메서드를 호출할 때마다 새 인스턴스 생성 (독립테스트 가능), 단순, 자동실행, 즉각피드백 제공 

 

- test/JUnitTest.java

- 테스트 코드는 JEST와 비스무리하다. 오히려 쉬운 것 같다. Assertion을 통해 기대값과 검증할 값을 비교한다.

- 실행하면 콘솔에 다음과 같이 테스트 결과를 출력한다.

 

5. JUnit을 활용한 사이클테스트

- test/JUnitCycleTest.java

쉽네
당연하게도 예측이 가능한 결과

 

- @BeforeAll : DB를 연결하거나 테스트 환경을 초기화할 때 사용된다. static 필수

- @BeforeEach : 테스트 메서드에서 사용하는 객체를 초기화하거나 필요한 값을 미리 넣을 때 사용. static이 아니어야 한다

- @AfterAll : DB 연결을 종료할 때나 공통 자원을 해제할 때 사용된다. static 필수

- @AfterEach : 테스트 이후 특정데이터를 삭제해야 할 경우 사용한다. static이 아니어야 한다

 

6. AssertJ로 검증문의 가독성 높이기

- AssertJ 라이브러리를 통해 기대값과 검증값을 분리해서 가독성이 좋아지도록 한다.

빨간건 무시

- isEqualTo(A) : A와 값이 같은지 검증

- isNotEqualTo(A) : 다른지 검증

- contains(A) : A값을 포함하는지 검증

등등이 있다.

 

7. 실제 테스트코드 적용해보기

- 테스트를 생성한다

test 폴더 내에 자동으로 생성된다.

- 테스트코드에 애너테이션이 많다.

- @SpringBootTest : 메인 앱 클래스에 추가하는 @SpringBootApplication이 있는 클래스를 찾고 그 클래스에 포함되어 있는 빈을 찾은 다음 테스트용 앱 컨텍스트를 만든다.

- @AutoConfigureMockMvc : MockMvc를 생성하고 자동으로 구성하는 애너테이션이다. 이는 앱을 서버에 배포하지 않고도 테스트용 MVC 환경을 만들어 요청 및 전송, 응답 기능을 제공한느 유틸 클래스이다. (컨트롤러 테스트)

- @BeforeEach : 여기서는 MockMvcSetUp() 메서드를 통해 MockMvc를 설정한다.

- @AfterEach : 여기서는 member테이블에 있는 데이터를 모두 삭제해준다.

 

- 같은블럭 아래에 더 작성해준다. 

다른 것도 아니고 import 가 이렇게 빡셀지 누가 알았겠는가

1) given : 멤버를 저장한다.

2) when : 멤버 리스트를 조회하는 API를 호출한다.

- perform() 메서드는 요청을 전송하는 역할을 하는 메서드이다. 결과로 REsultActions 객체를 받으며, ResultActions 객체는 반환값을 검증하고 확인하는 andExpect() 메서드를 제공한다.

- accept() 메서드는 무슨 타입으로 응답을 받을지 결정하는 메서드이다. 여기서는 JSON을 받는다고 명시한다.

3) then : 응답코드가 200OK이고, 반환받은 값 중에 0번째 요소의 id와 name이 저장된 값과 같은지 확인한다.

- andExpect()는 응답을 검증한다.

- isOk()는 200 OK를 검증한다. (isCreated(), isForbidden() 등 여러 HTTP 관련 응답메서드가 있다.)

- jsonPath("$[0].필드명")은 JSON 응답값의 값을 가져오는 역할을 한다. 0번째 배열에 들어있는 객체의 id, name 값을 가져오고 확인검증한다.

 

- 결과

180ms 면 오래걸리네 m2맥프로인데.. 윈도우가 더 좋은듯

 

댓글