본문 바로가기

SPRING/Spring

[스프링| 스프링 입문 | 코드로 배우는 스프링] 회원 리포지토리 테스트 케이스 작성

package hello.hellospring.repository;

import hello.hellospring.domain.Member;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;

import java.util.List;

import static org.assertj.core.api.Assertions.assertThat;

class MemoryMemberRepositoryTest {
    MemoryMemberRepository repository = new MemoryMemberRepository(); // 테스트할 메모리 기반의 리포지토리 객체 생성

    @AfterEach
    public void afterEach() {
        repository.clearStore(); // 각 테스트가 종료될 때마다 저장소를 초기화하여 테스트 간의 데이터 격리 보장
    }

    @Test
    public void save() {
        Member member = new Member(); // 새 Member 객체 생성
        member.setName("spring"); // Member 객체의 이름 설정

        repository.save(member); // 리포지토리에 Member 객체 저장

        Member result = repository.findById(member.getId()).get(); // 저장된 Member 객체 검색
        assertThat(member).isEqualTo(result); // 검색 결과와 원본 객체가 같은지 검증
    }
    
    @Test
    public void findByName() {
        Member member1 = new Member(); // 첫 번째 Member 객체 생성
        member1.setName("spring1"); // 이름 설정
        repository.save(member1); // 리포지토리에 저장

        Member member2 = new Member(); // 두 번째 Member 객체 생성
        member2.setName("spring2"); // 이름 설정
        repository.save(member2); // 리포지토리에 저장

        Member result = repository.findByName("spring1").get(); // 이름으로 첫 번째 Member 검색

        assertThat(result).isEqualTo(member1); // 검색 결과가 첫 번째 Member와 동일한지 확인
    }
    
    @Test
    public void findAll() {
        Member member1 = new Member(); // 첫 번째 Member 객체 생성
        member1.setName("spring1"); // 이름 설정
        repository.save(member1); // 리포지토리에 저장

        Member member2 = new Member(); // 두 번째 Member 객체 생성
        member2.setName("spring2"); // 이름 설정
        repository.save(member2); // 리포지토리에 저장

        List<Member> result = repository.findAll(); // 리포지토리의 모든 Member 검색

        assertThat(result.size()).isEqualTo(2); // 검색 결과의 크기가 2인지 확인
    }
}

테스트 코드 작성

단위 테스트는 소프트웨어 개발 과정에서 매우 중요한 부분입니다. 테스트 코드를 작성함으로써 다음과 같은 이점을 얻을 수 있습니다:

  1. 버그 감지: 개발 초기 단계에서 버그를 발견하고 수정할 수 있습니다.
  2. 리팩토링 지원: 코드를 안전하게 리팩토링할 수 있도록 지원합니다. 테스트가 통과하는 한, 리팩토링으로 인한 기능 손상을 걱정하지 않아도 됩니다.
  3. 기능 검증: 각 기능이 예상대로 동작하는지 검증합니다. 새로운 기능 추가나 기존 기능 변경 시에 기대한 동작을 하는지 확인할 수 있습니다.
  4. 문서화: 테스트 코드는 어떻게 코드가 사용되어야 하는지에 대한 실제 예시를 제공합니다. 즉, 코드의 사용 방법을 문서화하는 역할도 합니다.

JUnit과 같은 테스트 프레임워크를 사용하면 이러한 테스트를 체계적으로 수행할 수 있습니다. @Test, @BeforeEach, @AfterEach 같은 어노테이션을 사용하여 테스트 환경을 설정하고, 테스트가 수행될 때 필요한 조건을 명확히 할 수 있습니다.