@DataJpaTest 를 이용한 통합 테스트 코드 작성하기
2024. 6. 22. 13:08ㆍTIL
✔오늘 배운 중요한 🔑 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 |