@DataJpaTest 를 이용한 통합 테스트 코드 작성하기

2024. 6. 22. 13:08TIL

✔오늘 배운 중요한 🔑 point

  • 단위 테스트는 하나 하나의 메소드들이 제대로 작동하는지에 대한 테스트
  • 통합 테스트는 모듈간의 상호작용이 제대로 작동하는지에 대한 테스트
  • 테스트 코드 작성 시 함수 이름이나 변수 이름 등은 가독성을 위해서 한글로 작성하기도 함

🎯 오늘 배운 내용

 

단위 테스트와 통합 테스트는 어떻게 다른가?

 

단위 테스트는 하나 하나의 메소드들이 제대로 작동하는지에 대한 테스트라면

통합 테스트는 더 넓은 범위의, 모듈간의 상호작용을 테스트한다.

 

통합 테스트

 

package com.example.sampletest.api.service

import com.example.sampletest.api.dto.MemberRegisterRequest
import com.example.sampletest.api.dto.MemberResponse
import com.example.sampletest.domain.common.QueryDslConfig
import com.example.sampletest.domain.member.Member
import com.example.sampletest.domain.member.MemberRepository
import io.kotest.assertions.throwables.shouldThrow
import io.kotest.matchers.shouldBe
import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest
import org.springframework.context.annotation.Import
import org.springframework.test.context.ActiveProfiles

@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
@Import(value = [QueryDslConfig::class])
@ActiveProfiles("test")
class MemberServiceDBTest @Autowired constructor(
    private val memberRepository: MemberRepository
) {

    private val memberService = MemberService(memberRepository)

    @Test
    fun `이미 회원가입되어있는 이메일이라면 예외가 발생하는지 확인`() {
        // GIVEN
        val 기존_회원 = Member(email = "test@gmail.com",password = "1234", nickname = "테스트용 이름") // 테스트코드에서는 가독성을 위해 변수 이름을 한글로 하기도 한다
        memberRepository.saveAndFlush(기존_회원)
        val request = MemberRegisterRequest(email = "test@gmail.com",password = "4321", nickname = "피카츄")
        // WHEN & THEN
        shouldThrow<RuntimeException> {
            memberService.register(request)
        }.let {
            it.message shouldBe "이미 존재하는 이메일입니다."
        }

        memberRepository.findAll() // 데이터베이스에 실제 저장된 값까지 확인!, 예외처리는 던졌지만 데이터베이스에 저장됬을수도 있으니
            .filter{it.email == "test@gmail.com"}
            .let{
                it.size shouldBe 1
                it[0].nickname shouldBe "테스트용 이름"
            }

    }

    @Test
    fun `정상적으로 회원가입되는 시나리오 확인`() {
        // GIVEN
        val request = MemberRegisterRequest(email = "test@gmail.com",password = "4321", nickname = "피카츄")
        // WHEN
        val result: MemberResponse =memberService.register(request)

        // THEN
        result.email shouldBe "test@gmail.com"
        result.nickname shouldBe "피카츄" // 여기까지는 메소드 결과에 대한 단위 테스트

        memberRepository.findAll()
            .filter{
                it.email == "test@gmail.com" //데이터 베이스에 저장된 test@gmail.com을 찾아서
            }
            .let{
                it.size shouldBe 1 // 1개만 저장되어 있는지 테스트
                it[0].nickname shouldBe "피카츄" // 그 1명의 닉네임이 피카츄가 맞는지
            }

    }
}

 

테스트를 진행할때 함수 이름이나 변수 이름은 가독성을 위해서 한글로 작성하기도 한다

단위테스트와 다르게 각각의 함수에 대한 테스트와 데이터베이스에도 저장값이 잘 적용이 됬는지 테스트 하는 등 모듈 간의 상호작용을 테스트 하는 목적으로 통합 테스트를 작성한다.

 

 

 

 

🤔 어떻게 활용할까?

단위 테스트로는 각각의 함수가 잘 적용이 되는지에 대해서 테스트를 하고

통합 테스트로는 각각의 기능들이 서로 상호작용이 되는지에 대해서 테스트를 함으로써 테스트 코드를 작성할 수 있게 되었다.

📓 오늘의 한줄

"I love to play all day!"

-pororo-

 

 

'TIL' 카테고리의 다른 글

CAP 정리  (0) 2024.06.24
@Transactional과 롤백  (0) 2024.06.23
@DataJpaTest를 이용해서 단위 테스트 코드 작성하기  (0) 2024.06.21
Projection  (0) 2024.06.20
영속성 컨텍스트  (0) 2024.06.19