[SpringBoot] 기능구현한 코드를 코드로 테스트 하는방법및 주의사항

    테스트케이스

    개발한 기능이 정상적으로 돌아가는지 테스트하려고 할때 main 메서드를 통해 웹을 접속하여 화면에서 직접 테스트 하는 경우가 일반적이였다. 이 방법은 준비하고 실행하는데 오래걸리고 무엇보다도 반복적으로 테스트 하기가 어렵다. 하지만 스프링부트에서는 코드로 테스트 할수가 있다. 이 코드를 테스트케이스라고 한다.

    또 TDD방식이라고 해서 테스트코드를 먼저 작성하고 구현을 한다고 한다. 몇만 몇십만 소스코드를 짜야한다고 할때 테스트코드 없이 개발하면 정말 많은 문제가 일어난다고 한다. 에러사항을 구현 초반에 알아야 해결하기 쉽듯이 말이다.

     

     

    예제

    아래 예제는 id와 이름을 가지고 있는 Member 객체를 저장하는 save(), find() 가 정상적으로 실행되는지를 확인 하는 예제이다.

    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 null;
        }
    
        @Override
        public Optional<Member> findById(Long id) {
            //null이 반환될 가능성이 있으면 Optional로 감싼다.
            return Optional.ofNullable(store.get(id));
        }

     

    테스트케이스는 test 밑에 만들고 테스트할 Class파일 Package와 경로를 동일하게 해서 Class 파일명 + "Test" 명으로 Class를 만들어준다.

    import static org.assertj.core.api.Assertions.*;
    
    //모든 테스트는 순서가 없다. 모든 메서드 마다 따로 돌게 설계가 돼있다.
    //TDD : 테스트 주도 개발(테스트 코드 작성 후 개발 코드 작성)
    public class MemoryMemberRepositoryTest {
    
        MemoryMemberRepository repository = new MemoryMemberRepository();
    
        //메서드가 실행되고 끝날때마다 아래 메서드 실행됨
        @AfterEach
        public void afterEach() {
            repository.clearStore();
        }
    
        @Test //@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);
            assertThat(member).isEqualTo(result);
        }

    @Test 어노테이션으로 메서드를 실행해볼수 있다. System.out.prinln() 출력문으로 눈으로 테스트 하는것은 한계가 있어 org.assertj.core.api 에서 제공하는 assertThat() 함수로 아래처럼 체크표시로 확인 할 수 있다. 

     

    주의사항

    @Test가 있는 테스트케이스 코드들을 여러개 한번에 실행할 수 있는데 순서는 보장할수 없다. 그래서 테스트코드에서 만들어진 객체가 다른 곳에서 사용될수 있는 불상사가 일어날 수 있다. 그래서 테스트케이스 하나가 실행될때마다 리셋이 필요하다.  위 코드 보면 @AfterEach가 있는데 이게 있으면 테스트케이스가 완료 될때마다 메서드가 실행된다. 그래서 Map에 저장된 Member들을 clear해주는 메서드가 실행해 불상사를 막아주었다.

     

     

    참고 : https://www.inflearn.com/course/스프링-입문-스프링부트/dashboard

    댓글

    Designed by JB FACTORY