코딩하는 문과생
[Spring Boot] TDD & 단위테스트 본문
※ 해당 글은 튜토리얼이 아닌 헷갈리거나 중요한 개념 위주로 정리한 글입니다.
[TDD]
: 테스트가 주도하는 개발
- 테스트코드 작성 후(red)
- 테스트가 통과하는 프로덕트 코드를 작성(green)
- 이후 리팩토링 진행(refactoring)
[단위테스트]
: 기능 단위의 테스트 코드를 작성
- 장점
- 톰캣을 계속내렸다 올릴 필요가 없다.
- 자동검증이 가능하다.
- 개발자가 만든 기능을 보호한다.
* 테스트코드 작성을 도와주는 프레임워크: JUnit
예제코드) 컨트롤러 내 테스트 코드 작성
@RunWith(SpringRunner.class) //Junit 프레임워크의 SpringRunner라는 클래스를 실행시켜라
@WebMvcTest(controllers = HelloController.class) //@Controller등을 사용할 수 있다.
public class HelloControllerTest {
@Autowired //스프링이 관리하는 빈 주입을 받는다.
private MockMvc mvc; // 웹 API 테스트 시 사용(HTTP GET, POST), 스프링 MVC의 시작
@Test
public void hello_return() throws Exception {
String hello = "hello";
mvc.perform(get("/hello"))
.andExpect(status().isOk()) //status검증
.andExpect(content().string(hello)); //내용 검증
}
}
[단위 테스트의 예시]
-lombok?
: 자바 개발시 자주 사용하는 Getter, Setter, 기본생성자, toString 등을 어노테이션으로 자동 생성
ex) @Getter, @RequiredArgsContstuctor
* 플러그인은 한번 설정하면 되지만, 의존성은 계속 작성해야한다.
-lombok이 잘 작동하는 지 테스트
1. HelloResponseDto를 작성하고
@Getter
@RequiredArgsConstructor //final필드가 포함된 생성자를 생성해 준다.
public class HelloResponseDto {
private final String name;
private final int amount;
}
2. Dto자체 단위테스트 진행 후
: 값을 잘 담는지 확인
public class HelloResponseDtoTest {
@Test
public void lombok_function_test(){
//given
String name = "test";
int amount = 1000;
//when
HelloResponseDto dto = new HelloResponseDto(name, amount);
//then
assertThat(dto.getName()).isEqualTo(name); //assertThat: 테스트 검증 라이브러리
assertThat(dto.getAmount()).isEqualTo(amount);
}
}
3. 컨트롤러 내에서 dto를 이용해 값을 잘 받아오는 지 확인한다.
: 컨트롤러가 잘 동작하는 지 확인
@RunWith(SpringRunner.class) //Junit 프레임워크의 SpringRunner라는 클래스를 실행시켜라
@WebMvcTest(controllers = HelloController.class) //@Controller등을 사용할 수 있다.
public class HelloControllerTest {
@Autowired //스프링이 관리하는 빈 주입을 받는다.
private MockMvc mvc; // 웹 API 테스트 시 사용(HTTP GET, POST), 스프링 MVC의 시작
@Test
public void hello_return() throws Exception {
String hello = "hello";
mvc.perform(get("/hello"))
.andExpect(status().isOk()) //status검증
.andExpect(content().string(hello)); //내용 검증
}
@Test
public void helloDto_return() throws Exception {
String name = "hello";
int amount = 1000;
mvc.perform(get("/hello/dto").param("name", name).param("amount", String.valueOf(amount))) //api테스트 시 요청 파라미터 설정, 단 String만 허용
.andExpect(status().isOk())
.andExpect(jsonPath("$.name", is(name))) //json응답을 필드별 검증할 수 있는 메소드, $기준으로 필드명을 명시한다.
.andExpect(jsonPath("$.amount", is(amount)));
}
}
즉, 단위테스트란, 컨트롤러, DTO, 서비스, 리포지토리 등 각 단위별로 테스트를 진행하는 것을 의미한다.
예를 들어 컨트롤러에서 서비스, 리포지토리가 정확하게 구현되어 있지않아도 단위별로 테스트 진행이 가능하다. 컨트롤러 내 MockMvc 객체(단지 브라우저의 요청과 응답을 담당)나 DTO내 assertThat 등을 이용해 단위테스트를 구현할 수 있다.
[참고사항 - 단위테스트란?]
주니어 개발자를 위한 단위테스트 샘플 코드 소개
자바&스프링 환경에서 단위 테스트 경험해보기 | 이 글에서는, 자바&스프링부트 환경에서의 단위 테스트 샘플 사례를 설명합니다. 테스트 코드를 처음 접하는 주니어 개발자를 대상으로 작성한
brunch.co.kr
- 사실 단위테스트에 대해 모호한 느낌이 강했는데, 위 글을 읽고 어느정도 개념이 잡힌 듯하다. 읽어보면 좋을 듯 하다.
※ 해당 글은 "스프링 부트와 AWS로 혼자 구현하는 웹 서비스(이동욱 저)"를 참고해 작성하였습니다.
'웹 프로그래밍 > Spring Boot' 카테고리의 다른 글
[Spring Boot] AWS 아키텍처(+ HotSpot으로 연결 시 여러 이슈들) (0) | 2020.12.06 |
---|---|
[Spring Boot] Spring Security (0) | 2020.12.06 |
[Spring Boot] Mustache, 화면 구성 (0) | 2020.12.06 |
[Spring Boot] JPA, 데이터베이스 연동 (0) | 2020.11.30 |
[Spring Boot] Build.Gradle 설정파일 (0) | 2020.11.29 |