테스트 케이스 작성

OneTwoThree·2023년 6월 18일
0
  • java의 main 메소드나 웹의 컨트롤러로 실행해서 테스트 하면 준비, 실행이 오래 걸리고 반복 실행이 어려움, 여러 테스트를 한번에 실행하기 어려움
  • 자바는 JUnit 프레임워크로 테스트를 실행해서 이러한 문제 해결

테스트 방법

  • 테스트 디렉토리 아래에 똑같이 패키지랑 클래스를 만들어 주고 테스트함
  • 테스트하려는 메소드 위에 @Test 어노테이션을 붙여줌
package hello.hellospring.repository;

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

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

public class MemoryMemberRepositoryTest {
    MemoryMemberRepository repository = new MemoryMemberRepository();

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

        repository.save(member);

        //Optional 클래스에서 get() 으로 값을 꺼낼 수 있음
        Member result = repository.findById(member.getId()).get();

        // 내가 만든 멤버 객체 : member , 리포지토리에 save로 저장한 후 findById로 가져온 멤버 객체 : result
        // 두개가 일치하는지 테스트
        // Assertions.assertEquals(member,result);
        // 다른 라이브러리 활용. 좀 더 이해하기 편함 (static import 해서 사용함)
        assertThat(member).isEqualTo(result);

    }


}

  • Assertions.asserEquals(expected,actual)을 활용해 테스트하거나 (주석처리한 부분)
  • Assertions.assertThat(expected).isEqualTo(actual)로 테스트 가능 (위랑 다른 라이브러리. static import 함)
        @Test
        public void findByName(){
            Member m1 = new Member();
            m1.setName("spring1");
            Member m2 = new Member();
            m2.setName("spring2");

            repository.save(m1);
            Member result = repository.findByName("spring1").get();
            assertThat(m1).isEqualTo(result);

        }

  • 테스트의 좋은 점은 클래스 단위로 테스트하거나 한번에 전체 클래스를 테스트 할 수도 있음
  • 프로젝트 전체를 테스트 할 수도 있음
  • hello.hellospring 우클릭 > test 가능

@AfterEach

    package hello.hellospring.repository;

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

    import java.util.List;

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

    public class MemoryMemberRepositoryTest {
        MemoryMemberRepository repository = new MemoryMemberRepository();

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

            repository.save(member);

            //Optional 클래스에서 get() 으로 값을 꺼낼 수 있음
            Member result = repository.findById(member.getId()).get();

            // 내가 만든 멤버 객체 : member , 리포지토리에 save로 저장한 후 findById로 가져온 멤버 객체 : result
            // 두개가 일치하는지 테스트
            // Assertions.assertEquals(member,result);
            // 다른 라이브러리 활용. 좀 더 이해하기 편함 (static import 해서 사용함)
            assertThat(member).isEqualTo(result);

        }

        @Test
        public void findByName(){
            Member m1 = new Member();
            m1.setName("spring1");
            Member m2 = new Member();
            m2.setName("spring2");

            repository.save(m1);
            Member result = repository.findByName("spring1").get();
            assertThat(m1).isEqualTo(result);

        }

        @Test
        public void findAll(){
            Member m1 = new Member();
            m1.setName("spring1");
            Member m2 = new Member();
            m2.setName("spring2");

            repository.save(m1);
            repository.save(m2);

            List<Member> result = repository.findAll();

            assertThat(result.size()).isEqualTo(2);

        }


    }
  • 위 클래스를 테스트해보면 에러가 뜸
  • 여러 메소드를 테스트하다 보니 테스트가 끝날 때마다 리포지토리를 깔끔하게 지워줘야함
package hello.hellospring.repository;

import hello.hellospring.domain.Member;

import java.util.*;

public class MemoryMemberRepository implements  MemberRepository{

    private static Map<Long, Member> store = new HashMap<>();
    private static long sequence = 0L;

    @Override
    public Member save(Member member) {
        member.setId(++sequence);
        store.put(member.getId(), member);
        return member;
    }

    @Override
    public Optional<Member> findById(Long id) {
        return Optional.ofNullable(store.get(id));
    }

    @Override
    public Optional<Member> findByName(String name) {
        return store.values().stream()
                .filter(member -> member.getName().equals(name))
                .findAny();
    }

    @Override
    public List<Member> findAll() {
        return new ArrayList<>(store.values());
    }

    public void clearStore() {
        store.clear();
    }
}
  • 위와 같이 테스트하려는 리포지토리에 리포지토리를 clear하기 위한 clearStore 메소드를 만들어줌
        @AfterEach
        public void afterEach(){
            repository.clearStore();
        }
  • 테스트 클래스 내에 @AfterEach 어노테이션을 달고 afterEach 메소드를 만듬. 어노테이션의 의미는 각 테스트 메소드를 호출하고 나서 이 메소드가 호출되는 것임
  • 이렇게 해주면 순서와 상관 없이 테스트에 통과함

TDD

  • 테스트 코드를 먼저 만들고 맞춰서 개발하는 방식

0개의 댓글