컨테이너 라이프사이클 수동 제어 — start()와 stop() 직접 다루기
컨테이너 라이프사이클 수동 제어 — start()와 stop() 직접 다루기
Testcontainers는 JUnit 같은 테스트 프레임워크 없이도, 아니면 프레임워크를 아예 쓰지 않아도 온전히 사용할 수 있어요. 테스트 코드에서 start()와 stop()을 직접 불러 컨테이너를 띄우고 내리는 수동 제어가 필요한 경우가 있죠. 이 페이지에서는 컨테이너를 코드로 시작·중지하는 기본 방법과, 여러 테스트 클래스가 하나의 컨테이너를 나눠 쓰는 싱글톤 패턴을 살펴볼게요.
본문
Testcontainers는 어떤 테스트 프레임워크와도, 프레임워크 없이도 온전히 사용할 수 있어요.
컨테이너 수동 시작/중지
컨테이너는 코드에서 start()와 stop() 메서드로 시작하고 중지할 수 있어요. 추가로 컨테이너 클래스는 AutoCloseable을 구현해요. 이 덕분에 적절한 시점에 컨테이너가 중지된다는 보장을 더 잘 얻을 수 있어요.
try (GenericContainer container = new GenericContainer("imagename")) {
container.start();
// ... use the container
// no need to call stop() afterwards
}
싱글톤 컨테이너
여러 테스트 클래스에 걸쳐 딱 한 번만 시작되는 컨테이너를 정의하는 게 유용할 때가 있어요. 이 용도에 대해 Testcontainers 확장이 특별한 지원을 제공하지는 않아요. 대신 다음과 같은 패턴으로 구현할 수 있어요.
abstract class AbstractContainerBaseTest {
static final MySQLContainer MY_SQL_CONTAINER;
static {
MY_SQL_CONTAINER = new MySQLContainer();
MY_SQL_CONTAINER.start();
}
}
class FirstTest extends AbstractContainerBaseTest {
@Test
void someTestMethod() {
String url = MY_SQL_CONTAINER.getJdbcUrl();
// create a connection and run test as normal
}
}
싱글톤 컨테이너는 베이스 클래스가 로드될 때 단 한 번 시작돼요. 그러면 이 컨테이너를 상속한 모든 테스트 클래스가 사용할 수 있어요. 테스트 스위트가 끝나면 Testcontainers 코어가 시작하는 Ryuk 컨테이너가 싱글톤 컨테이너를 중지하는 일을 처리해 줘요.
더 알아보기
- Jupiter / JUnit 5 확장 — @Testcontainers와 @Container로 라이프사이클 위임하기
- 컨테이너 기반 테스트 시작하기 — GenericContainer의 기본 사용법
- 컨테이너 시작·준비 대기 — 준비가 될 때까지 기다리는 전략