본문 바로가기
Spring

[SpringBoot With Aws] JUnit 단위 테스트

by sangfeeeeel 2021. 7. 22.

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);
    }
}

📌 코드설명


  1. @AfterEach

    • Junit에서 단위 테스트가 끝날 때마다 수행되는 메소드를 지정
    • 보통은 배포 전 전체 테스트를 수행할 때 테스타간 데이터 침범을 막기 위해 사용합니다.
    • 여러 테스트가 동시에 수행되면 테스트용 데이터베이스인 H2에 데이터가 그대로 남아 있어 다음 테스트 실행 시 테스트가 실패할 수 있습니다.
  2. postsRepository.save

    • 테이블 posts에 insert/update 쿼리를 실행합니다.
    • id 값이 있다면 update가, 없다면 insert 쿼리가 실행됩니다.
  3. 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