-
spring boot 3.1 - testcontainers 2 - container lifecycleSpring/Test 2023. 12. 28. 14:30
Junit & test container lifecycle
아래의 절차대로 실행됩니다
BeforeEach, Test1
- 1. Connect to docker
- 2. Ryuk started
- 3. Checking the system
- 4. Start Container
- 5. Excute BeforeEach method
@BeforeEach 에서 getContainer##() 메소드를 호출하여 사용할 수 있습니다. - 6. test1() method 실행
반대로
@AfterEach 이후에 Ryuk 이 container 를 cleans up 시킵니다.
BeforeEach, test2()
test1() 메소드 종료후 container 도 이미 clean up 하였으므로,
@BeforeEach 에서 containerId 를 출력해보면, test2() 메소드 에서는 new container 를 사용하는 것을 볼 수 있습니다.
하지만 만약 testcontainer 를 static 으로 생성하게되면, 컨테이너를 죽이지 않고 재사용 합니다
devTools @RestartScope
개발하면서, 반복적인 디버그 시에 spring-boot-devtools 의 @RestartScope 을 사용하여, container 로딩 시간을 절약할 수도 있습니다.
@TestConfiguration(proxyBeanMethods = false) public class TestDemoApplication { @Bean @ServiceConnection @RestartScope PostgreSQLContainer<?> postgresContainer() { return new PostgreSQLContainer<>(DockerImageName.parse("postgres:15.5")); } public static void main(String[] args) { SpringApplication.from(Application::main).with(TestDemoApplication.class).run(args); } }
@RestartScope를 사용하면, 빈을 재시작된 애플리케이션에서도 유지할 수 있습니다.
RestartScope로 생성된 빈은 애플리케이션이 재시작될 때에도 유지되며, 재시작된 애플리케이션에서 다시 사용할 수 있습니다.
environment variables & startup commands
아래처럼 docker 실행 시 환경변수나 argument 전달도 가능합니다.
Ryuk 의 어원
Ryuk는 일본 만화 및 애니메이션 시리즈인 "Death Note"의 등장하는 사신입니다.
데스노트에 기록된 사람이 죽으면 그 인간의 수명을 가져가는 역할을 합니다.
Ryuk 모듈은 테스트가 완료된 후 사용되지 않는 모든 컨테이너를 자동으로 제거합니다.따라서 테스트를 깨끗하게 유지하고 실수를 방지할 수 있습니다.
발표자에 대한 개인 느낌
여성 Cora Iberkleid ; 조곤조곤 핵심을 잘 발표하심, 개발을 많이 하시는 분 같진 않음
남성 Oleg Selajev : 말 많고 장황한 스타일인데, testcontainer 영역의 장인인거 같음
'Spring > Test' 카테고리의 다른 글
spring boot 3.1 - testcontainers (0) 2023.12.03