@Testcontainers
💡의존성 추가
testImplementation "org.junit.jupiter:junit-jupiter:5.8.1"
testImplementation "org.testcontainers:testcontainers:2.0.2"
testImplementation "org.testcontainers:testcontainers-junit-jupiter:2.0.2"
- Testcontainers 공식 문서에서 JUnit 관련 최신 버전 확인 가능 (공식 문서)
testImplementation "org.testcontainers:testcontainers-mysql:2.0.2"
- Testcontainers 공식 문서에서 MySQL 관련 최신 버전 확인 가능 (공식 문서)
💡@Testcontainers + @Container
@Testcontainers
class ControllerTest {
@Container
private final MySQLContainer<?> mySQLContainer = new MySQLContainer<>("mysql:8");
// ...
}
- @Testcotnainers어노테이션과 @Container 어노테이션 두 개만 추가하면 테스트의 생명주기에 맞춰 테스트용 컨테이너가 실행 및 종료된다. (출처)
Singletone Containers 패턴 적용
💡@Testcontainers + @Container 문제점
- JUnit 5/지피터 모듈에서는, @Container가 인스턴스 필드(non-static)로 선언되면 각 테스트 메서드마다 새 컨테이너가 시작/종료된다. (공식 문서)
Containers declared as instance fields will be started and stopped for every test method.
- 반대로 @Container가 static 필드로 선언되면 클래스 단위로 한 번만 시작하고 마지막에 종료된다. (공식 문서)
Containers declared as static fields will be shared between test methods.
They will be started only once before any test method is executed and stopped after the last test method has executed.
💡Singletone Containers 패턴 적용 (출처)
// 테스트에서 공통으로 사용할 Singleton MySQL Container를 정의하는 추상 클래스
// 모든 테스트 클래스는 이 클래스를 상속해 컨테이너를 공유하게 됨
abstract class AbstractContainerBaseTest {
// 정적(static) 필드: JVM 로딩 시 단 1번만 생성됨
static final MySQLContainer MY_SQL_CONTAINER;
// static 초기화 블록: 클래스가 처음 로딩될 때 한 번 실행됨
static {
// MySQL Testcontainer 인스턴스 생성
MY_SQL_CONTAINER = new MySQLContainer();
// 컨테이너 시작 — DB 컨테이너가 한 번만 실행됨
// 여러 테스트 클래스가 존재해도 단 한 번만 start() 됨 (Singleton 효과)
MY_SQL_CONTAINER.start();
}
}
// 첫 번째 테스트 클래스 — MySQL 컨테이너를 AbstractContainerBaseTest로부터 상속받아 사용
class FirstTest extends AbstractContainerBaseTest {
@Test
void someTestMethod() {
// 상위 클래스에서 만든 Singleton MySQL Container 인스턴스를 그대로 가져와 JDBC URL 사용
String url = MY_SQL_CONTAINER.getJdbcUrl();
// URL을 통해 DB 연결 생성 후 테스트 로직 수행
// (모든 테스트가 이 한 컨테이너를 공유하여 테스트 실행 속도가 매우 빨라짐)
}
}
- Singletone 패턴이란? (참고 자료)
- 메모리 절약을 위해 인스턴스가 필요할 때 똑같은 인스턴스를 새로 만들지 않고 기존의 인스턴스를 가져와 재활용하는 기법
- 이렇게 추상 클래스를 사용해 컨테이너를 싱글톤으로 사용하면, 컨테이너 관련 정보를 한 곳에서 관리할 수 있다. 더불어 해당 클래스를 상속받는 모든 테스트 클래스는 컨테이너를 재사용한다는 장점도 누릴 수 있다. (출처)
참고 자료
1) https://velog.io/@namhm23/Spring-TestContainer-필요성과-설정하는-법Mysql-Redis
Spring TestContainer 필요성과 설정하는 법(Mysql, Redis)
TestContainer 란 Docker 를 통해서 테스트 환경에 컨테이너를 띄우는 것이다필요에 따라 Mysql , Redis 등 여러 컨테이너를 띄워서 원하는 테스트 환경을 구성할 수 있다Mysql, Redis 에서 왜 TestContainer 를
velog.io
2) https://velog.io/@dldmswjd322/통합-테스트를-위한-Testcontainers-도입기
통합 테스트를 위한 Testcontainers 도입기 feat. MySQL
도입 배경 믿을 수 없는 테스트 환경... 현재 '투룻' 프로젝트는 테스트 환경에서 DB로 내장 H2를 사용하고 있다. 이 방식은 내장 H2를 사용해 간편하게 테스트를 진행할 수 있다는 장점이 있지만
velog.io
'Projects > HubEleven' 카테고리의 다른 글
| [리팩토링] Stock 도메인 리팩토링 (2) (0) | 2025.12.27 |
|---|---|
| [리팩토링] Stock 도메인 리팩토링 (1) (0) | 2025.12.18 |
| [리팩토링] 서비스 코드 주석 제거, 메서드명 변경 (0) | 2025.12.17 |
| [동시성 처리] 재고 감소 통합 테스트 코드 2 (MSA 환경에서 코드 공유하기) (0) | 2025.12.11 |
| [동시성 처리] 재고 감소 통합 테스트 코드 1 (초안) (0) | 2025.12.08 |