🫡스프링 부트로 테스트 할 경우 다양한 방법으로 db와 서비스등을 격리 시킬 수 있습니다.
그 중 스프링 부트로 테스트시 도커로 해당 서비스를 띄워 사용하는 방법에 대해서 알아보겠습니다.
먼저 아래 코드를 gradle에 추가합니다.
testImplementation "org.junit.jupiter:junit-jupiter:5.8.1"
testImplementation "org.testcontainers:testcontainers:1.17.6"
testImplementation "org.testcontainers:junit-jupiter:1.17.6"
@Testcontainers <- 자신이 사용할 테스트 코드에 추가
@ActiveProfiles("test")
@Transactional
@SpringBootTest
...
@Container
private static final GenericContainer<?> redis = new GenericContainer<>("redis").withExposedPorts(6379);
@DynamicPropertySource
static void redisProperties(DynamicPropertyRegistry registry) {
registry.add("spring.data.redis.host", redis::getHost);
registry.add("spring.data.redis.port", redis::getFirstMappedPort);
}
@Testcontainers
Testcontainers는 테스트용 도커 컨테이너를 제공하는 라이브러리입니다. @Testcontainers
어노테이션을 테스트 클래스에 적용하면 Testcontainers가 사용됩니다.
@Container
Testcontainers에서 컨테이너를 생성하는 어노테이션입니다. 해당 어노테이션을 사용하여 도커 컨테이너를 생성하고 관리할 수 있습니다.
GenericContainer<>("redis")
Redis를 사용하기 위한 GenericContainer
를 생성합니다. Redis 이미지를 사용하여 컨테이너를 생성합니다.
withExposedPorts(6379)
컨테이너의 6379 포트를 외부에 노출합니다. 이렇게 하면 테스트 코드에서 컨테이너에 접근할 수 있습니다.
@DynamicPropertySource
동적인 프로퍼티를 등록할 수 있는 어노테이션입니다. 테스트 실행 중에 동적으로 프로퍼티 값을 설정할 수 있습니다. (위에 설정을 통해 기존의 설정한 환경변수 값을 동적으로 바꿔치기 해줄 수 있습니다.)
registry.add("spring.data.redis.host", redis::getHost)
spring.data.redis.host
프로퍼티를 컨테이너의 호스트로 설정합니다. 이렇게 하면 Redis 호스트에 연결할 수 있습니다.
registry.add("spring.data.redis.port", redis::getFirstMappedPort)
spring.data.redis.port
프로퍼티를 컨테이너의 첫 번째 매핑된 포트로 설정합니다. 이렇게 하면 Redis에 접근하기 위한 포트를 설정할 수 있습니다.
😓이를 통해 격리된 환경에서 테스트를 진행할 수 있으며 해당 도커 컨테이너는 테스트가 종료되면 자동으로 사라지게 됩니다. (다만 도커로 컨테이너를 띄우는 과정이 포함되기 때문에 테스트가 느려집니다.)