Spring/Test

spring boot 3.1 - testcontainers 2 - container lifecycle

바람을타고2 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 영역의 장인인거 같음