[Java Spring 무작정 따라하기] 회원 리포지토리 테스트 케이스 작성

khj·2024년 7월 27일
post-thumbnail

💡 테스트 케이스란?

테스트 케이스는 애플리케이션의 특정 기능이 의도한 대로 동작하는지 확인하기 위한 코드이다.
개발한 기능을 직접 실행해서 테스트를 하면 준비하고 실행하는데 오래 걸리면서 반복 실행하기 어렵고 여러 테스트를 한번에 테스트하기도 어렵다.
테스트 케이스를 사용하면 이러한 문제점들을 해결할 수 있다고 한다.
여기서는 Java에서 가장 많이 사용된다는 테스트 프레임워크인 JUnit의 최신버전, JUnit5를 사용할 것이다.

✨ 테스트 케이스 생성

먼저 test 폴더에 테스트용 코드를 작성했다.

// test/java/hello.hello_spring/repository/MemoryMemberRepositoryTest.java
package hello.hello_spring.repository;

import hello.hello_spring.domain.Member;
import org.junit.jupiter.api.Test;

class MemoryMemberRepositoryTest {

    MemberRepository repository = new MemoryMemberRepository();

    @Test
    public void save() {
        Member member = new Member();
        member.setName("spring");

        repository.save(member);

        Member result = repository.findById(member.getId()).get();
        System.out.println("result = " + (result == member));
    }
}

일단 테스트 코드라고 작성했고 결과를 위와 같이 볼 수는 있지만 뭔가 애매하다.
여기서는 테스트 결과를 직접 print했지만 다른 기능이 존재한다.

// repository/MemoryMemberRepositoryTest.java
...
@Test
public void save() {
    Member member = new Member();
    member.setName("spring");

    repository.save(member);

    Member result = repository.findById(member.getId()).get();
    Assertions.assertEquals(member, result);
}


Assertions의 assertEquals 메서드를 사용해서 생성된 member와 member를 저장했다가 다시 가져왔을 때 일치하는지 확인하는 테스트다.
테스트가 성공했을 때는 위와 같이 Test Results에 녹색 체크표시가 출력된다.

기능은 동일하지만 가독성면에서 좀 더 보기편한 assertThat 메서드도 있다.

// repository/MemoryMemberRepositoryTest.java
...
import org.assertj.core.api.Assertions;

@Test
public void save() {
    Member member = new Member();
    member.setName("spring");

    repository.save(member);

    Member result = repository.findById(member.getId()).get();
    Assertions.assertThat(member).isEqualTo(result);
}

save와 findById 기능의 테스트를 작성했으니 나머지 기능인 findByName과 findAll도 작성했다.

// repository/MemoryMemberRepositoryTest.java
...
import java.util.List;

@Test
public void findByName() {
    Member member1 = new Member();
    member1.setName("spring1");
    repository.save(member1);

    Member member2 = new Member();
    member2.setName("spring2");
    repository.save(member2);

    Member result = repository.findByName("spring1").get();

    assertThat(result).isEqualTo(member1);
}

@Test
public void findAll() {
    Member member1 = new Member();
    member1.setName("spring1");
    repository.save(member1);

    Member member2 = new Member();
    member2.setName("spring2");
    repository.save(member2);

    List<Member> result = repository.findAll();
    assertThat(result.size()).isEqualTo(2);
}

방식은 save 테스트와 동일하게 작성했다.
먼저 member를 생성하고 각 기능을 테스트하는 방식이다.
하지만 테스트에 문제가 발생했다.
각 테스트를 따로 실행할 때는 문제가 없었지만 전체 테스트를 한번에 실행하니 문제가 생긴 것이다.

각 테스트 케이스마다 member를 생성하고 테스트를 하다 보니 다른 테스트를 진행할 때 이전에 생성한 member가 남아 예상한 대로 동작하지 못한 것이다.

✨ 저장소 초기화

이를 해결하기 위해서 코드를 조금 추가했다.

// main/java/hello.hello_spring/repository/MemoryMemberRepository.java
...
public void clearStore() {
    store.clear();
}

테스트 코드가 아닌 메인 코드에 저장소를 비우는 메서드를 추가했다.
이 메서드가 실행되면 저장소에 저장된 모든 데이터를 지울 것이다.

그리고 테스트 케이스에도 작성했다.

// repository/MemoryMemberRepositoryTest.java
import org.junit.jupiter.api.AfterEach;

MemoryMemberRepository repository = new MemoryMemberRepository();

@AfterEach
public void afterEach() {
    repository.clearStore();
}

@AfterEach를 사용하면 각 테스트가 끝날 때마다 호출된다고 하니 각 테스트가 끝날 때마다 저장소가 초기화 될 것이다.

예상대로 테스트가 성공적으로 끝난 것을 볼 수 있었다.

profile
Spring, Django 개발 블로그

0개의 댓글