테스트 컨테이너를 사용한 Micronaut 통합 테스트

Micronaut는 쉽게 테스트할 수 있는 모듈식 마이크로서비스 및 서버리스 애플리케이션을 구축하기 위한 최신 JVM 기반 전체 스택 프레임워크입니다. 개념, API, 주석 및 규칙은 Spring Framework와 유사하지만 일부 기능이 다르게 수행되거나 누락되어야 합니다.

이러한 누락 중 하나는 구성 요소 초기화 전에 런타임에 응용 프로그램 컨텍스트 구성에 정말 편리한 ApplicationContextInitializer입니다. 이 기능은 Testcontainers가 시작하는 각 컨테이너에 대해 임의의 포트를 사용하기 때문에 Testcontainers 인스턴스 호스트 및 포트를 가져오는 데 사용되지만 런타임 시 실제 포트를 쉽게 얻을 수 있습니다.

Spring Boot 구성 및 ApplicationContextInitializer는 에 자세히 설명되어 있으며 여기에서는 Micronaut의 격차를 메우려고 노력할 것입니다.

옵션 1. 게으르고 더 이상 사용되지 않습니다.


withCreateContainerCmdModifier를 사용하여 무작위 대신 알려진 포트를 설정할 수 있습니다.

public abstract class ResourceProvider {

    private static final int REDIS_PORT = 6379;

    @Container
    static GenericContainer redis = new GenericContainer<>("redis:5.0.8-alpine")
            .withCreateContainerCmdModifier(it -> it.withName("redis-unit")
                    .withPortBindings(new PortBinding(Ports.Binding.bindPort(REDIS_PORT), new ExposedPort(REDIS_PORT))))
            .withExposedPorts(REDIS_PORT);

}


그러나 withPortBindings 더 이상 사용되지 않으며 향후 릴리스에서 제거됩니다. 이 이면의 주요 아이디어는 가상화와 범위 지정입니다. 애플리케이션 테스트는 독립적이어야 하므로 동일한 도커를 사용하여 병렬로 실행할 수 있습니다. 반면에 여러 프로젝트에 자주 사용되는 동일한 Docker/Jenkins 환경에서 이 경우 두 테스트에 동일한 컨테이너가 필요할 때 "0.0.0.0:6379에 대한 바인딩 실패: 포트가 이미 할당되었습니다"라는 메시지가 표시됩니다.

옵션2. Micronaut 방식 솔루션.



Micronaut는 testcontainer에서 얻은 호스트/포트 값으로 애플리케이션 구성을 시작하는 개념을 제공합니다PropertySource.EmbeddedServer의 예

@BeforeAll
public static void initUnitTest() {

    embeddedServer = ApplicationContext.run(EmbeddedServer.class, PropertySource.of(
            "test", Map.of("redis.host", redis.getContainerIpAddress(), "redis.port", redis.getMappedPort(REDIS_PORT))
    ));

    context = embeddedServer.getApplicationContext();

}

ApplicationContext의 예

@BeforeAll
public static void initUnitTest() {
    context = ApplicationContext.run(PropertySource.of(
            "test", Map.of("redis.host", redis.getContainerIpAddress(), "redis.port", redis.getMappedPort(REDIS_PORT))
    ));
}


종단 간 데모를 찾을 수 있습니다here.
즐거운 코딩과 테스트!

좋은 웹페이지 즐겨찾기