1. JUnit 단위테스트?
먼저, TDD와 단위 테스트는 다른 이야기입니다. 단위 테스트는 TDD의 첫번째 단계인 기능 단위의 테스트 코드를 작성하는 것을 이야기합니다. 순수하게 테스트 코드를 작성하는 것을 이야기합니다.
테스트 코드는 왜 작성해야 할까요? 위키피디아에서는 다음을 이야기 합니다.
- 단위 테스트는 개발단계 초기에 문제를 발견하게 도와줍니다.
- 단위 테스트는 개발자가 나중에 코드를 리팩토링하거나 라이브러리 업그레이드 등에서 기존 기능이 올바르게 작동하는지 확인할 수 있습니다.
- 단위 테스트는 기능에 대한 불확실성을 감소시킬 수 있습니다.
- 단위 테스트는 시스템에 대한 실제 문서를 제공합니다. 즉, 단위 테스트 자체가 문서로 사용할 수 있습니다.
또한, 이 책의 저자이신 이동욱님은 본인의 경험을 토대로 다음과 같이 이야기 합니다.
- 빠른 피드백을 받을 수 있다.
- System.out.println()을 통해 눈으로 검증하는 문제를 자동검증이 가능하게 해준다.
- 개발자가 만든 기능을 안전하게 보호해준다.
이처럼, 테스트 코드는 100% 읽혀야 할 기술이자 습관이라고 설명합니다. 저도 여태까지 테스트 코드는 어렵다 라고만 생각했는데 어렵더라도 단위테스트 부터 조금씩 습관화 시키도록 항상 생각해야겠습니다.
2. 코드를 통해 보는 예
아래의 코드는 간단한 게시판을 만드는 프로젝트중 PostsRepository를 테스트하는 코드입니다.
package com.cactusseok.book.springwithaws.domain.posts;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import static org.assertj.core.api.Assertions.assertThat;
import java.util.List;
@ExtendWith(SpringExtension.class)
@SpringBootTest
class PostsRepositoryTest {
@Autowired
PostsRepository postsRepository;
@AfterEach
public void cleanup(){
postsRepository.deleteAll();
}
@Test
public void 게시글저장_불러오기(){
//given
String title = "테스트 게시글";
String content = "테스트 본문";
postsRepository.save(Posts.builder()
.title(title)
.content(content)
.author("test@gmail.com")
.build());
//when
List<Posts> postsList = postsRepository.findAll();
//then
Posts posts = postsList.get(0);
assertThat(posts.getTitle()).isEqualTo(title);
assertThat(posts.getContent()).isEqualTo(content);
}
}
📌 코드설명
@AfterEach
- Junit에서 단위 테스트가 끝날 때마다 수행되는 메소드를 지정
- 보통은 배포 전 전체 테스트를 수행할 때 테스타간 데이터 침범을 막기 위해 사용합니다.
- 여러 테스트가 동시에 수행되면 테스트용 데이터베이스인 H2에 데이터가 그대로 남아 있어 다음 테스트 실행 시 테스트가 실패할 수 있습니다.
postsRepository.save
- 테이블 posts에 insert/update 쿼리를 실행합니다.
- id 값이 있다면 update가, 없다면 insert 쿼리가 실행됩니다.
postsRepository.findAll
- 테이블 posts에 있는 모든 데이터를 조회해오는 메소드입니다.
위의 코드를 실행하면 게시글저장_불러오기는 성공한다고 나옵니다. 이때 실제로 실행된 쿼리는 어떤 형태일까? 라는 궁금증이 생깁니다. 이때 application.properties 파일에 spring.jpa.show_sql = true 옵션을 추가하면 쿼리를 확인 할 수있습니다.
'Spring' 카테고리의 다른 글
Spring의 DI는 왜 생성자 주입으로? (0) | 2021.12.14 |
---|---|
[SpringBoot With Aws] Spring 웹 계층 (0) | 2021.07.23 |
@Controller 와 @RestController의 차이 (0) | 2021.07.13 |
IoC (Inversion of Control) (0) | 2021.07.03 |
DI(의존성 주입) (0) | 2021.07.03 |