My Space

반응형

@Test 어노테이션을 이용하여 인터페이스에 선언해 놓은 메서드를 테스트 할 수 있다.

 

사용 예제1)

메서드 하나하나 테스트를 해볼 수도 있고, 여러개의 메서드가 있을 경우 클래스 선언 부분에서 

실행해주면 전체 메서드를 테스트 할 수 있다.

!!!!!주의할 점!!!!!

전체 메서드를 실행 할 경우 순서는 임의로 실행이 되므로 순서에 의존관계가 없도록 설계해야 한다.

이때, @AfterEach 어노테이션을 통해 테스트 메서드가 끝날때 마다 저장되어 있는 정보를 clear 시켜주는 메서드를 만들어준다.

 

사용 예제2)

// Repository.java
private static Map<Long, Member> store = new HashMap<>();

public void clearStore() {
        // store라는 이름의 Map을 clear
        store.clear();
}

// RepositoryTest.java
@AfterEach
public void afterEach(){
    repository.clearStore();
}

 

테스트 케이스 메서드는 영문표기가 아닌 한글명으로 해서 보기쉽게 해도 상관없다.

또한, 주석으로 구분하는게 보기에 편하다

사용 예제3)

    @Test
    void 회원가입() {
        //given  무언가가 주어진다
        Member member = new Member();
        member.setName("hello");

        //when   무언가를 실행 했을때
        Long saveId = memberService.join(member);

        //then    결과가 이렇게 나와야한다
        Member findMember = memberService.findOne(saveId).get();
        Assertions.assertThat(member.getName()).isEqualTo(findMember.getName());
    }

 

예외처리 방법 assertThrows

        // try~catch 방식
        try {
            memberService.join(member2);
            fail();
        } catch (IllegalStateException e) {
            Assertions.assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
            //아래 주석은 에러발생
            //Assertions.assertThat(e.getMessage()).isEqualTo("정해진 Message 텍스트가 다를때");
        }
        
        // assertThrows 방식(람다 사용)
        assertThrows(IllegalStateException.class, () -> memberService.join(member2));
        //아래 주석은 에러발생 (중복예외인데 null예외 체크하기 때문)
        //assertThrows(NullPointerException.class, () -> memberService.join(member2));
        
        // 아래 처럼 예외 message를 담아서 비교할 수도 있다.
        IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2));
        Assertions.assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");

 

테스트 케이스는 별도의 메모리 DB 사용하는게 좋다

test 디렉토리 하위에 있는 resources에 application.yml이 없으면 

main 디렉토리에 있는 application.yml에 있는 것을 참조하게 된다.

웬만하면 test 용으로 application.yml을 생성해 따로 가져가는 것이 맞다.

 

아래와 같이 빈 껍데기만 있어도 메모리에 데이터가 쌓이게 되어 테스트가 정상적으로 작동된다.

// application.yml

spring:
#  datasource:
#    url: jdbc:h2:mem:test
#    username: sa
#    password:
#    driver-class-name: org.h2.Driver

#  jpa:
#    hibernate:
#      ddl-auto: create
#    properties:
#      hibernate:
#        show_sql: true
#        format_sql: true

logging:
  level:
    org.hibernate.SQL: debug
    org.hibernate.type: trace

 

스프링 컨테이너와 테스트 실행(@SpringBootTest)

위의 테스트들이 단순 자바코드를 테스트 한것이라 하면,

@SpringBootTest를 통해 스프링 컨테이너를 실행하고 데이터까지 쌓아보는 테스트를 할 수 있다.

사용 예제4)

@Transactional은 테스트 케이스에 선언시 테스트 시작전에 트랜잭션을 시작하고,

테스트 완료후 항상 롤백을 하여, 다음 테스트에 영향을 주지 않는다.

 

이전에 했던것 처럼 순수 자바로 부분적으로 테스트 하는 것을 단위 테스트라하고,
스프링을 구동시켜서 db까지 연결하는 것을 통합 테스트라 한다.

웬만하면 단위 테스트를 잘 만들도록 노력!! (단위 테스트가 좋은 테스트 방법)

 

참고 자료)

inflearn의 스프링 입문-코드로 배우는 스프링 부트 강의 中

 

junit jupiter(5)에서 바뀐점

junit5의 통합 테스트 환경인 

@ExtendWith(SpringExtension.class)가 스프링 환경으로 확장해주는것

junit4에서는 @RunWith(SpringRunner.class)

 

@SpringBootTest에는 @AutoConfigureMockMvc가 존재하지 않아서 추가를 해줘야한다.

@WebMvcTest에는 @AutoConfirureMockMvc가 존재

 

참고영상

www.youtube.com/watch?v=0XVrPkXJLk0

'Development > TEST TOOL' 카테고리의 다른 글

테스트코드 헤더에 인증값 셋팅  (0) 2022.04.28

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading