junit 在测试/本地环境中运行和重用DockerComposeContainer

bxfogqkk  于 2022-11-11  发布在  Docker
关注(0)|答案(1)|浏览(143)

情况:我的应用程序有一个docker-compose.yml文件,其中包含本地开发所需的容器,通常在运行应用程序之前,我会运行docker-compose up -d SERVICE_NAME
现在,对于集成测试,我使用testcontainers,并且我希望重用我在本地开发中使用的相同服务。如果没有服务运行,这很好,测试通过,但是如果我有服务运行,测试失败,因为它不能从compose创建另一个服务:

@Container
private static final DockerComposeContainer<?> dockerComposeContainer;

static {
    dockerComposeContainer = new DockerComposeContainer<>(new File("docker-compose.yml"))
        .withServices(SERVICE_NAME)
        .withExposedService(SERVICE_NAME, SERVICE_PORT);
    dockerComposeContainer.start();
}

有没有办法在测试过程中检查是否有SERVICE_NAME服务在运行,以避免创建@Container而只是重用“外部”?

yvfmudvl

yvfmudvl1#

@Container是一个JUnit extension注解,它将容器的生命周期绑定到测试的生命周期:静态字段的行为类似于@Before/AfterAll中的启动/停止,示例字段-类似于@Before/AfterEach
您可以选择不使用它,并通过调用start()/stop()手动控制生命周期。当然,您还可以实现任何所需的检查。
例如,您可以使用类似于以下内容的内容:

var containers = DockerClientFactory.instance().client().listContainersCmd().exec();

以列出容器。
说到这里,我建议将测试设置迁移到使用GenericContainer,而不是依赖于DockerCompose模块,类似于here的概述

相关问题