조급하면 모래성이 될뿐

MariaDB TestContiner 적용 본문

구현 기록/TestContiners

MariaDB TestContiner 적용

Pawer0223 2023. 6. 23. 18:25

현재 프로젝트에서는 RDS를 mariadb로 구성하여 사용하고 있다. 이를 위해 mariadb 테스트 컨테이너 환경을 구축했다.

또한 테스트 라이브러리로는 kotest를 사용하고 있다.

 

1. 테스트 컨테이너 의존성 추가.

 

build.gradle.kts

testImplementation("org.testcontainers:testcontainers:$testContainerVersion")
testImplementation("org.testcontainers:junit-jupiter:$testContainerVersion")
testImplementation("org.testcontainers:mariadb:$testContainerVersion")

 

2. mariadb 테스트 컨테이너 설정

 

TestContainers는 JDBC를 지원한다. URL을 통해 테스트 컨테이너 설정을 손쉽게 할 수 있다. - 공식문서

 

src/test/resources/application.yml

spring:
  datasource:
    driver-class-name: org.testcontainers.jdbc.ContainerDatabaseDriver
    url: jdbc:tc:mariadb:10.5:///

 

컨테이너 설정은 이게 끝이다.

 

3. Test 환경설정

 

@DataJpaTest로 두고 실행하면 기본적으로 embedded in-memory DB를 찾기 때문에 예외가 발생한다.

 

@DataJpaTest 

They also use an embedded in-memory database (replacing any explicit or usually auto-configured DataSource). The @AutoConfigureTestDatabase annotation can be used to override these settings.

 

 

 

공식문서에서 시키는데로 @AutoConfigureTestDatabase설정을 해주면 된다.

@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
class MuckPotUserRepositoryTest(
    @Autowired val muckPotUserRepository: MuckPotUserRepository
) : StringSpec({
    "findByEmail 호출 성공" {
        val user = muckPotUserRepository.findByEmail("user@naver.com")

        user shouldBe null
    }
})

 

4. 결과 확인

 

실행하면 테스트 컨테이너 관련한 로그가 쫙 뜰것이다.

 

브레이크 포인트를 찍고 디버깅 해보면 실행 중에 테스트 컨테이너와, 필요한 이미지에 대한 컨테이너들이 실행되는것을 볼 수 있다.

 

테스트가 종료되면 컨테이너는 종료, 삭제 된다.

 

남아있는 문제점..

현재 프로젝트는 멀티모듈 구조로 구성되어있다. 위 테스트는 Repository를 가지는 Domain 모듈에서 단위테스트를 적용했다.

하지만 Domain 모듈을 참조하는 API 모듈에서 통합테스트를 진행할 때는 어떻게 테스트컨테이너를 구성해야할까..?

 

Next

https://taesan94.tistory.com/284

반응형