ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [스프링부트/웹 애플리케이션 개발]회원 기능 테스트
    스프링&스프링부트 2023. 1. 4. 22:49

    테스트 요구사항

    - 회원가입 성공

    - 회원가입 할 때 같은 이름이 있으면 예외 발생

     

     

     

    회원가입 test

    @RunWith(SpringRunner.class)
    @SpringBootTest
    @Transactional
    class MemberServiceTest {
    
        @Autowired MemberService memberService;
        @Autowired MemberRepository memberRepository;
    
        @Test
        public void 회원가입() throws Exception {
            //given
            Member member = new Member();
            member.setName("kim");
    
            //when
            Long saveId = memberService.join(member);
    
            //then
            assertEquals(member, memberRepository.findOne(saveId));
        }
    }

    - transacrional  > insert문 확인 할 수 없음

     

     

    insert문 확인하는 방법 1. @Rollback(false) 추가

    @RunWith(SpringRunner.class)
    @SpringBootTest
    @Transactional
    class MemberServiceTest {
    
        @Autowired MemberService memberService;
        @Autowired MemberRepository memberRepository;
    
        @Test
        @Rollback(false)
        public void 회원가입() throws Exception {
            //given
            Member member = new Member();
            member.setName("kim");
    
            //when
            Long saveId = memberService.join(member);
    
            //then
            assertEquals(member, memberRepository.findOne(saveId));
        }
    }

     

    insert문 확인하는 방법 2. em 코드 추가

    @RunWith(SpringRunner.class)
    @SpringBootTest
    @Transactional
    class MemberServiceTest {
    
        @Autowired MemberService memberService;
        @Autowired MemberRepository memberRepository;
    
        @Autowired EntityManager em;
    
        @Test
        public void 회원가입() throws Exception {
            //given
            Member member = new Member();
            member.setName("kim");
    
            //when
            Long saveId = memberService.join(member);
    
            //then
            em.flush();
            assertEquals(member, memberRepository.findOne(saveId));
        }
    }

    - flush가 db에 쿼리를 날리고 테스트가 끝날 때 @Transactional이 rollback

    - 테스트할 때 rollback이 필요한 이유는 테스트를 반복해야 하기 때문에 데이터가 남으면 안 됨

     

     

     

    회원중복 test

    @Test(expected = IllegalStateException.class)
        public void 중복_회원_예외() throws Exception {
            //Given
            Member member1 = new Member();
            member1.setName("kim");
    
            Member member2 = new Member();
            member2.setName("kim");
    
            //When
            memberService.join(member1);
            memberService.join(member2); //예외가 발생해야 한다.
    
            //Then
            fail("예외가 발생해야 한다.");
        }

     

     

     

    MemberServiceTest

    package jpabook.jpashop.service;
    
    import jpabook.jpashop.domain.Member;
    import jpabook.jpashop.repository.MemberRepository;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;
    import org.springframework.transaction.annotation.Transactional;
    
    import static org.junit.Assert.assertEquals;
    import static org.junit.Assert.fail;
    
    @RunWith(SpringRunner.class)
    @SpringBootTest
    @Transactional
    public class MemberServiceTest {
        @Autowired MemberService memberService;
        @Autowired MemberRepository memberRepository;
    
        @Test
        //@Rollback(false) > insert문 확인 방법1.
        public void 회원가입() throws Exception {
            //given
            Member member = new Member();
            member.setName("kim");
    
            //when
            Long saveId = memberService.join(member);
    
            //then
            //em.flush();
            assertEquals(member, memberRepository.findOne(saveId));
        }
    
        @Test(expected = IllegalStateException.class)
        public void 중복_회원_예외() throws Exception {
            //Given
            Member member1 = new Member();
            member1.setName("kim");
    
            Member member2 = new Member();
            member2.setName("kim");
    
            //When
            memberService.join(member1);
            memberService.join(member2); //예외가 발생해야 한다.
    
            //Then
            fail("예외가 발생해야 한다.");
        }
    }

     

     

     

    - 어노테이션 의미

    @RunWith(SpringRunner.class) : Junit 실행하면서 스프링도 함께 실행

    @SpringBootTest : 스프링부트를 띄운 상태로 테스트

    @Transactional : 롤백

     

     

     

    - 테스트케이스 작성 참고

    (http://martinfowler.com/bliki/GivenWhenThen.html)

     

     

     

    - 테스트를 완전히 격리된 환경에서 하도록 설정 

    1) test에 resources 디렉토리 추가

    2) resources에 application.yml 복사 붙여 넣기

    3) application.yml > spring > datasource > url 수정

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

     

    참고. 스프링부트에서는 별도의 설정이 없으면 메모리 모드로 돌린다. 따라서 application.yml의 코드 생략 가능

    spring:
    #  datasource:
    #    url: jdbc:h2:mem:testdb
    #    username: sa
    #    password:
    #    driver-class-name: org.h2.Driver
    
    #  jpa:
    #    hibernate:
    #      ddl-auto: create-drop
    #    properties:
    #      hibernate:
    #        show_sql: true
    #        format_sql: true
    
    logging:
      level:
        org.hibernate.SQL: debug
        org.hibernate.type: trace

     

    728x90
Designed by Tistory.