[SpringBoot] Spring Boot Test Case 작성 요령

Date:     Updated:

카테고리:

태그:

Spring Boot의 Test Case 작성

테스트 코드를 작성하지 않고 코드를 테스트 하는 것은 생각보다 비용이 많이 들어갑니다. 애플리케이션을 실행시키고, 해당 코드를 실행할 수 있는 지점까지 가서, 코드를 테스트하고 만약 버그가 발생하면 코드를 수정한 후, 애플리케이션을 다시 실행시켜 해당지점까지 다시 도달해야하기 때문입니다. 한번 지점까지 도달하는데 30초가 걸린다고 하면, 10번 테스트를 수행하면 300초 즉 5분이 걸리게 됩니다. 이러한 낭비를 막기 위해서 Java 진영에서는 JUnit이라는 라이브러리를 통해서 유닛테스트를 제공합니다.

Spring에서도 JUnit을 통해 테스트를 할 수 있는 기능을 제공합니다. Spring에서 테스트를 하기위해서는 몇가지 달아줘야하는 어노테이션이 있습니다. 또한, 모든 JPA 의 데이터 조작은 트랜젝션 안에서 이루어지는것을 권장한다 라는 의미에서 @Transactional이라는 어노테이션도 달아줍니다. 또한, @Transactional 어노테이션이 있으면, 테스트를 실행할 때 마다 트랜잭션을 시작하고 테스트가 끝나면 트랜잭션을 강제로 롤백하기 때문에 반복적인 테스트가 가능합니다. 혹시나 롤백이 싫다면 @Rollback(false) 라는 어노테이션을 달아주면 됩니다.

그리고 @SpringBootTest를 명시하여 스프링 프레임워크에서 컴포넌트 스캔을 통해 자동으로 Java 빈으로 등록해주는 기능을 사용해야 합니다.

@SpringBootTest
@Transactional
public class MemberServiceTest {
	
}

(JUnit 5로 들어오면서 @Runwith()는 사라지고 @SpringBootTest만 달아주면 됩니다.)

김영한 강사님의 강의에서 소개되는 테스트 기법은 given / when / then 기법 입니다. 주어진 상황에서 작업을 하고 Assert문을 통해서 개발자의 의도를 밝히고, 오류를 검증하는 절차입니다.

테스트 코드를 짜기 전에 주의해야할 점은, 테스트는 격리된 환경에서 실행하고, 끝나면 데이터를 초기화 하는것이 좋다는 것입니다. 그런 면에서 메모리 DB를 사용하는것이 가장 이상적입니다. 설정을 하는 방법은, test 폴더 아래의 resources 폴더에 application.yml을 추가하면 됩니다. 이게 없으면, 기본 앱의 설정대로 돌아갑니다. (스프링 부트는 기본적인 DB 설정이 없으면 자동으로 메모리 DB를 사용함. 추가로 ddl-auto도 create-drop 모드로 동작함)

    logging:
      level:
        org.hibernate.SQL: debug

이제, 테스트케이스를 하나 작성해 봅니다. 회원가입을 검증하는 테스트 케이스 입니다.

@SpringBootTest
@Transactional
public class MemberServiceTest {
    @Autowired
    private EntityManager em;

    @Test
    public void join() throws Exception {
        // given
        Member member = new Member();
        member.setName("kim");

        // when
        Long savedId = memberService.join(member);

        // then
        em.flush(); // 영속성 컨텍스트를 데이터베이스에 반영함
        Assertions.assertThat(member == memberRepository.findOne(savedId));
    }

given / when / then에 맞춰서 작성된 케이스 입니다. 해당 함수를 실행시켜 검증하고, 해당 함수에 문제가 없다면 로직을 사용하는 방식으로 테스트를 합니다.

SpringBoot 카테고리 내 다른 글 보러가기

댓글 남기기