Framework/Spring Boot

회원 관리 예제 #02 회원 리포지토리 테스트 케이스 작성

반응형

테스트케이스

코드를 코드로 검증한다. 개발한 기능을 실행해서 테스트 할 때 자바의 main 메서드를 통해서 실행하거나, 웹앱의 컨트롤러를 통해서 해당 기능을 실행한다. 이런 방법은 준비하고 실행하는데 오래 걸리고, 반복 실행하기가 어렵고 여러 테스트를 한번에 실행하기 어렵다는 단점이 있다. 자바는 JUnit이라는 프레임워크로 테스트를 실행해서 이러한 문제를 해결한다. 

  • 테스트 메소드는 서로 의존관계 없이 설계되어야 한다.
  • 테스트가 하나 끝날때마다 공용 데이터를 클리어해줘야 한다.
TDD: 테스트 클래스를 먼저 작성한 다음에 리포지토리를 작성하는 방법. 테스트 주도 개발방법이다.
class MemoryMemberRepositoryTest {

    MemoryMemberRepository repository = new MemoryMemberRepository();

    @AfterEach
    public void afterEach(){
        repository.clearStore(); //테스트가 끝날때마다 리포지토리의 스토어를 지워준다
    }

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

        repository.save(member);

        Member result= repository.findById(member.getId()).get();
        //반환타입이 Optional이면 get으로 값을 꺼낼 수 있다. 테스트케이스에선 이렇게 해도 되는데 좋은 방법은 아니다.
        //Assertions.assertEquals(result, member);
        assertThat(member).isEqualTo(result); //member가 result랑 똑같애
        //alt + enter 치면 옵션이 뜨는데 static으로 지정해주면 Assertions. 가 생략되고 바로 사용할 수 있다.
    }

    @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);
    }
}
  • @AfterEach: 각 메서드가 끝날 때마다 호출된다. 공용 데이터를 클리어해주는 용도로 작성되었다.
  • @Test: 테스트 메서드에 붙여주는 어노테이션. 테스트 단위에서 작동시키면 해당 테스트 모듈만 동작한다.
  • 클래스 단위에서 작동시키면 모든 테스트 모듈이 무작위 순서로 동작한다.
  • 반환타입이 Optional이면 get()으로 값을 꺼낼 수 있다. 테스트케이스에선 이렇게 해도 된다.

Assertions

org.junit의 Assertions가 있고 org.assertj의 Assertions가 있다. 둘의 기능은 비슷한데 사용 방법이 다른지 두가지 경우를 모두 보여주셨다. 아래는 후자를 static으로 임포트한 경우. 위쪽 코드에서 보면 Assertions.를 생략하고 바로 assertThat()을 호출해서 사용하고 있다.

import org.assertj.core.api.Assertions;
import static org.assertj.core.api.Assertions.*;
  • Assertions.assertEquals(result, member);
  • assertThat().isEqualTo();
728x90
반응형