wasup

JUnit) 단위테스트와 통합테스트 본문

IT/Java

JUnit) 단위테스트와 통합테스트

wasupup 2021. 8. 7. 01:27
반응형

단위테스트

 

예제

package com.was.waspj.service;

import com.was.waspj.domain.Member;
import com.was.waspj.repository.MemoryMemberRepository;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.*;

class MemberServiceTest {

    MemberService memberService;
    MemoryMemberRepository memberRepository;

    @BeforeEach
    public void beforeEach(){
        memberRepository = new MemoryMemberRepository();
        memberService = new MemberService(memberRepository);
    }

    @AfterEach
    public void afterEach(){
        memberRepository.clearStore();
    }

    @Test
    void join() {
        //given : 뭔가 주어졌을 때
        Member member = new Member();
        member.setName("spring");

        //when : 실행했을 때
        Long saveId = memberService.join(member);

        //then : 예상되는 결과
        Member findMember = memberService.findOne(saveId).get();
        assertThat(member.getName()).isEqualTo(findMember.getName());
    }
    //정상테스트도 진행되어야하지만
    //예외테스트가 보다 중요함.
    @Test
    public void 중복회원_예외(){
        //given
        Member member1 = new Member();
        member1.setName("spring");

        Member member2 = new Member();
        member2.setName("spring");

        //when
        /*
        memberService.join(member1);
        try {
            memberService.join(member2);
            fail();
        }catch (IllegalStateException e){
            assertThat(e.getMessage()).isEqualTo("123이미 존재하는 회원입니다.");
        }*/
        memberService.join(member1);
        //assertThrows(IllegalStateException.class, () -> memberService.join(member2));
        //assertThrows(NullPointerException.class, () -> memberService.join(member2));
        IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2));
        assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
        //then
    }

    @Test
    void findMembers() {
        //given : 뭔가 주어졌을 때

        //when : 실행했을 때

        //then : 예상되는 결과
    }

    @Test
    void findOne() {
        //given : 뭔가 주어졌을 때

        //when : 실행했을 때

        //then : 예상되는 결과
    }
}

테스트 어노테이션

@Test : 테스트 어노테이션이 선언된 메서드는 테스트 메서드가 됨.

@Before : @Test메서드가 실행되지 전에 반드시 실행

(*테스트 메서드에서 공통으로 사용하는 코드를 @Before메서드에 선언)

@AfterEach : @Test메서드가 실행된 후 실행

@Commit : 테스트코드가 실행 성공하고 DB에서도 업데이트 된 결과를 확인하기 위해서 사용

 

테스트 어노테이션

참고 링크1 : https://shlee0882.tistory.com/202

참고링크2 : https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=writer0713&logNo=221537241239

이전글 JUnit 예제 보기


통합테스트

예제

package com.was.waspj.service;

import com.was.waspj.domain.Member;
import com.was.waspj.repository.MemberRepository;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.transaction.annotation.Transactional;

import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertThrows;

@SpringBootTest
@Transactional
class MemberServiceIntegrationTest {
    //테스트케이스틑 간편한 방식으로 진행하는 것이 좋다.
    //보통 테스트용 DB도 따로 구축.
    @Autowired MemberService memberService;
    @Autowired MemberRepository memberRepository;

    @Test
    void join() {
        //given : 뭔가 주어졌을 때
        Member member = new Member();
        member.setName("spring");

        //when : 실행했을 때
        Long saveId = memberService.join(member);

        //then : 예상되는 결과
        Member findMember = memberService.findOne(saveId).get();
        assertThat(member.getName()).isEqualTo(findMember.getName());
    }
    //정상테스트도 진행되어야하지만
    //예외테스트가 보다 중요함.
    @Test
    public void 중복회원_예외(){
        //given
        Member member1 = new Member();
        member1.setName("spring");

        Member member2 = new Member();
        member2.setName("spring");

        //when
        /*
        memberService.join(member1);
        try {
            memberService.join(member2);
            fail();
        }catch (IllegalStateException e){
            assertThat(e.getMessage()).isEqualTo("123이미 존재하는 회원입니다.");
        }*/
        memberService.join(member1);
        //assertThrows(IllegalStateException.class, () -> memberService.join(member2));
        //assertThrows(NullPointerException.class, () -> memberService.join(member2));
        IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2));
        assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
        //then
    }

}

@SpringBootTest

: 스프링 컨테이너와 테스트를 함께 실행함.


@Transactional

테스트 케이스에 @Transactional이 있으면,

테스트를 실행할 때 Transactional을 먼저 실행하고 (DB에 데이터를 인서트하고)

테스트가 끝나면 Rollback한다.

: DB에 넣은 데이터가 깔끔히 사라져버림.

: 즉, 다음 테스트를 계속해서 진행하기 용이함.(이전 테스트가 다음 테스트에 영향을 주지 않음)

 

*DB는 기본적으로 Insert쿼리를 날리고 commit(auto commit)을 해줘야 반영이 된다.

 

 

 

 

반응형
Comments