[Spring] Test code 학습
2022. 12. 10. 17:34ㆍWeb/Spring
Spring을 공부하며 미니 프로젝트를 만들면서 기능을 테스트할 때마다 변경된 메서드 및 항목들을 사용하기 위해 매번 재실행을 했어야 했다. 이전에는 못 느꼈지만 최근에 들어서 이런 시간들이 아까워서 Test code에 대해 공부를 시작하게 되었다.
단위 테스트
순수하게 테스트 코드만 작성하는 것을 의미한다. TDD, Test-driven Development와 다르게 리펙토링이 포함되거나 먼저 테스트 코드를 작성하는 것이 아니라고 한다. 그냥 순전히 테스트를 위해서 작성하는 코드, 그게 바로 단위 테스트를 의미하는 것이다.
단위 테스트
- 개발 초기에 문제를 발견하게 도와주는 역할
- 개발자가 추후에 리펙토링 혹은 사용했던 라이브러리 업그레이드에 대해 기능이 작동하는지 확인 가능
- 단위 테스트는 기능에 대한 불확실성 감소
- 빠른 피드백
- 웹서버 톰캣을 재실행하는 과정의 생략
- 수동 검증 System.out.println()이 아닌 테스트 코드를 통한 자동 검증
- 개발자가 만든 기능 보호
Java의 경우 학습할 때 Junit을 사용하여 공부를 진행했다.
책에서 나온 TestCode 예제
책에서 나온 예제 코드는 Junit4를 기반으로 설명이 되어있다. 이 부분을 조심해서 예제를 따라 해 보았다.
package com.example.page.controller;
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";
}
}
package com.example.page.controller;
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;
@RunWith(SpringRunner.class)
@WebMvcTest(controllers = HelloController.class)
public class HelloControllerTest {
@Autowired
private MockMvc mvc;
@Test
public void hello() throws Exception {
String hello = "hello";
mvc.perform(get("/hello"))
.andExpect(status().isOk())
.andExpect(content().string(hello));
}
}
사용된 어노테이션 및 객체
- @RunWith(SpringRunner.class)
- 테스트를 진행될 때 Junit에 내장된 실행자 외에 다른 실행자를 실행시킴
- 해당 경우에는 SpringRunner라는 스프링 실행자 사용
- @WebMvcTest
- 스프링의 테스트 어노테이션에는 다양한 Test 어노테이션이 존재
- 이때 해당 어노테이션은 Web(Spring MVC)에 집중을 한다는 뜻의 어노테이션
- 해당 어노테이션 사용 시 @Controller, @ControllerAdvice 사용 가능
- @Service, @Component, @Repository는 사용 불가
- 해당 어노테이션은 컨트롤러만 사용 가능
- @Autowired
- 스프링이 관리하는 빈(bean)을 주입 받음
- private MockMvc mvc
- 웹 API를 테스트할 때 사용
- 스프링 MVC 테스트의 시작점
- 해당 클래스를 통해 HTTP GET, POST 등에 대한 API 테스트 가능
- mvc.perform(get("/hello"))
- MockMvc를 통해 /hello 주소로 GET 요청
- 체이닝이 지원, 아래와 같이 andExpect 같은 여러 가지의 검증 기능을 선언 가능
- andExpect(status(). isOk())
- mvc.perform의 결과를 검증
- HTTP Header의 Status를 검증
- HTTP 상태 코드를 검증하며 1xx,2xx,3xx,4xx,5xx 등의 상태를 검증
- isOk()의 존재로 이번의 경우 200이 결괏값으로 나오는지 안 나오는지를 체크한다.
- andExpect(content(). string(hello))
- mvc.perform의 결과를 검증
- 응답 본문의 내용을 검증
- Controller에서 "hello"를 리턴하기 때문에 해당 값이 맞는지 검증
진행과정 중 발생한 오류들
File - setting - build tool 변경
gradle → Intellij IDEA
--
아직 TestCode의 존재와 필요성을 느낀 것뿐이다. 그렇기에 해당 부분에 대해 공부를 진행하며 해당 페이지에 내용을 더 채워 넣을 예정이다.
참고 서적 및 링크
스프링 부트와 AWS로 혼자 구현하는 웹 서비스 : 네이버 도서 (naver.com)
MockMvc (Spring Framework 6.0.2 API)
'Web > Spring' 카테고리의 다른 글
[Etc] application.yml 변경 및 Jasypt (0) | 2023.08.09 |
---|---|
[Test Code] @WithMockUser / @WithUserDetails / @WithSecurityContext (0) | 2023.01.27 |
[Spring] @PathVariable, @RequestParam, @RequestBody, @ModelAttribute (0) | 2022.12.07 |
[Error] java: package org.springframework.boot does not exist (0) | 2022.10.01 |
[Spring] @NoArgsConstructor, @AllArgsConstructor, @RequiredArgsConstructor 생성자 어노테이션 개념 (0) | 2022.08.09 |