[Spring] 스프링 입문 - 회원 리포지토리 테스트 케이스 작성

jy9922·2022년 8월 4일
0

Spring

목록 보기
4/34
post-thumbnail

✔ 회원 리포지토리 테스트 케이스 작성

💡 개발한 기능을 실행해서 테스트 하는 기존 방법들

  • 개발한 기능을 실행해서 테스트 할 때 자바의 main 메서드를 통해서 실행하거나
  • 웹 애플리케이션의 컨트롤러를 통해 해당 기능을 실행함

위의 방법은 준비하고 실행하는데 오래 걸리고, 반복 실행하기 어려우며, 여러 테스트를 한 번에 실행하기 어렵다는 단점이 있다.

이 문제를 해결하기 위해 JUnit 프레임워크로 이러한 문제를 해결한다.

🔸테스트 케이스

/* save test */
package hello.hellospring.repository;

import hello.hellospring.domain.Member;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;

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

class MemoryMemberRepositoryTest {
    MemoryMemberRepository repository = new MemoryMemberRepository();

    @Test // 테스트 실행시 반드시 필요
    public void save(){
        Member member = new Member();
        member.setName("spring");

        repository.save(member);

        Member result = repository.findById(member.getId()).get();
        // 반환 타입이 Optional 이므로, get()을 통해 값을 꺼낼 수 있음
        
        /* member와 result가 같은지 확인하는 방법들 */
        System.out.println("result=" + (result == member)); // result=true
       
    }
}

🔹 Assertions.assertEquals 메서드 사용

Assertions.assertEquals(member, null);
// result와 member가 같은지 확인할 수 있는 메서드
// org.junit.jupiter.api import

🔹 두 값이 같은 경우

  • 출력된 것은 없지만 초록불이 들어옴

🔹 두 값이 다른 경우

  • 기대한값(Expected)와 실제값(Actual)과 함께 오류 발생

🔹 Assrtions.assertThat( ) 사용

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

assertThat(member).isEqualTo(result);
  • org.assertj.core.api 제공하는 Assertions
  • import static으로 생략 가능

🔸 테스트 케이스 코드1

package hello.hellospring.repository;

import hello.hellospring.domain.Member;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;

import java.util.List;

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

class MemoryMemberRepositoryTest {
    
    MemoryMemberRepository repository = new MemoryMemberRepository();

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

        repository.save(member);

        Member result = repository.findById(member.getId()).get();
        // 반환 타입이 Optional 이므로, get()을 통해 값을 꺼낼 수 있음
        // System.out.println("result=" + (result == member)); // result=true
        // Assertions.assertEquals(member, null);
        // result와 member가 같은지 확인할 수 있는 메서드
        assertThat(member).isEqualTo(result);
    }
    
    @Test
    public void findByName() {
        Member member1 = new Member();
        member1.setName("spring");
        repository.save(member1);

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

        Member result = repository.findByName("spring").get();
        assertThat(result).isEqualTo(member1);
    }
        
    @Test
    public void findAll(){
        Member member1 = new Member();
        member1.setName("spring2");
        repository.save(member1);

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

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

여기서 잠깐 🤚

전체 test를 할 때, 처음에는 안났던 findByName( ) 메서드에서 오류가 발생했다..!

💡 테스트 케이스 주의사항

  • 모든 테스트는 순서가 보장이 안된다.
  • 메서드가 순서와 상관없이 따로 동작할 수 있도록 설계를 해야한다.
  • 테스트 케이스는 순서에 의존적으로 절대 설계하면 안되요!

이를 해결하기 위해 테스트가 끝나면 저장소 혹은 공용 데이터를 clear 해주는 것이 좋다.

  • MemotyMemberRepository에 테스트가 끝날 때마다 repository를 지워주는 코드가 필요하다.
/* MemoryMemberRepository */
// 아래 메서드 추가
 public void clearStore(){
        store.clear();
    }

🔸 모든 테스트 케이스가 통과되는 테스트 코드

package hello.hellospring.repository;

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

import java.util.List;

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

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()을 통해 값을 꺼낼 수 있음
        // System.out.println("result=" + (result == member)); // result=true
        // Assertions.assertEquals(member, null);
        // result와 member가 같은지 확인할 수 있는 메서드
        assertThat(member).isEqualTo(result);
    }
        @Test
        public void findByName() {
            Member member1 = new Member();
            member1.setName("spring");
            repository.save(member1);

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

            Member result = repository.findByName("spring").get();
            assertThat(result).isEqualTo(member1);
        }
        @Test
        public void findAll(){
            Member member1 = new Member();
            member1.setName("spring2");
            repository.save(member1);

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

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

        }
    }

💡 TDD ( Test Driven Development )

  • 테스트 주도 개발을 지향해요!
  • 반복 테스트를 이용한 소프트웨어 방법론
  • 작은 단위의 테스트 케이스를 작성하고 이를 통과하는 코드를 추가하는 단계를 반복하여 구현
  • 테스트를 먼저 만들고 구현 클래스를 만들어서 돌려본 것

🔸 Junit

  • 전 세계적으로 가장 널리 사용되고 있는 'Java 단위 테스트 프레임워크'

0개의 댓글