标签: testcontainers-junit5

带有 @Testcontainers 的 Mongo 驱动程序在测试成功运行后抛出异常

我正在使用 testcontainers:mongodb 在示例 spring boot kotlin 项目中设置集成测试。

我已经设置了 MongoDBContaine,一切都按预期工作 - 应用程序连接到 mongodb 并使用存储库进行测试(例如保存、删除)工作得很好,但我注意到测试运行(成功)后 mongodb.driver最后抛出异常 - 看起来容器没有被优雅地关闭/停止 - 这可能吗?

我如何启动容器的示例

companion object {
        @Container
        var mongoDBContainer = MongoDBContainer("mongo:4.4.2")

        @JvmStatic
        @DynamicPropertySource
        fun setProperties(registry: DynamicPropertyRegistry) {
            registry.add("spring.data.mongodb.uri") { mongoDBContainer.replicaSetUrl }
        }
    }
Run Code Online (Sandbox Code Playgroud)

测试方法

@Test fun someTest() {
   autowiredRepository.save(document)
   ...
   ...
}
Run Code Online (Sandbox Code Playgroud)

至于运行类,我只是在其之上使用 @Testcontainers 注释和 @SpringBootTest,没有其​​他任何东西。

我最后得到的例外是

com.mongodb.MongoSocketReadException: Prematurely reached end of stream
    at com.mongodb.internal.connection.SocketStream.read(SocketStream.java:112) ~[mongodb-driver-core-4.2.3.jar:na]
    at com.mongodb.internal.connection.SocketStream.read(SocketStream.java:131) ~[mongodb-driver-core-4.2.3.jar:na]
    at com.mongodb.internal.connection.InternalStreamConnection.receiveResponseBuffers(InternalStreamConnection.java:647) ~[mongodb-driver-core-4.2.3.jar:na]
    at com.mongodb.internal.connection.InternalStreamConnection.receiveMessageWithAdditionalTimeout(InternalStreamConnection.java:512) ~[mongodb-driver-core-4.2.3.jar:na]
    at com.mongodb.internal.connection.InternalStreamConnection.receiveCommandMessageResponse(InternalStreamConnection.java:355) ~[mongodb-driver-core-4.2.3.jar:na]
    at com.mongodb.internal.connection.InternalStreamConnection.receive(InternalStreamConnection.java:315) ~[mongodb-driver-core-4.2.3.jar:na]
    at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.lookupServerDescription(DefaultServerMonitor.java:215) ~[mongodb-driver-core-4.2.3.jar:na] …
Run Code Online (Sandbox Code Playgroud)

mongodb kotlin spring-boot testcontainers testcontainers-junit5

18
推荐指数
2
解决办法
3140
查看次数

在 Java 测试中使用 Podman 测试容器

是否可以在 Java 测试中将 Testcontainers 与 Podman 一起使用?

截至 2022 年 3 月,Testcontainers 库未将已安装的 Podman 检测为有效的 Docker 环境。

Podman 可以在采用 Apple 芯片的 MacOS(本地开发环境)和 Linux x86_64(CI/CD 环境)上替代 Docker 吗?

testcontainers podman testcontainers-junit5

14
推荐指数
3
解决办法
2万
查看次数

运行测试套件时测试容器初始化错误

我有多个测试类使用testcontainer运行相同的 docker-compose 。

initializationError尽管单独执行时每个测试都通过了,但该套件还是失败了。

这是第二次测试期间发生的堆栈跟踪的相关部分。 ./gradlew e2e:test -i

io.foo.e2e.AuthTest > initializationError FAILED
    org.testcontainers.containers.ContainerLaunchException: Container startup failed
        at org.testcontainers.containers.GenericContainer.doStart(GenericContainer.java:330)
        at org.testcontainers.containers.GenericContainer.start(GenericContainer.java:311)
        at org.testcontainers.containers.DockerComposeContainer.startAmbassadorContainers(DockerComposeContainer.java:331)
        at org.testcontainers.containers.DockerComposeContainer.start(DockerComposeContainer.java:178)
        at io.foo.e2e.bases.BaseE2eTest$Companion.beforeAll$e2e(BaseE2eTest.kt:62)
        at io.foo.e2e.bases.BaseE2eTest.beforeAll$e2e(BaseE2eTest.kt)
       ...

        Caused by:
        org.rnorth.ducttape.RetryCountExceededException: Retry limit hit with exception
            at org.rnorth.ducttape.unreliables.Unreliables.retryUntilSuccess(Unreliables.java:88)
            at org.testcontainers.containers.GenericContainer.doStart(GenericContainer.java:323)
            ... 83 more

            Caused by:
            org.testcontainers.containers.ContainerLaunchException: Could not create/start container
                at org.testcontainers.containers.GenericContainer.tryStart(GenericContainer.java:497)
                at org.testcontainers.containers.GenericContainer.lambda$doStart$0(GenericContainer.java:325)
                at org.rnorth.ducttape.unreliables.Unreliables.retryUntilSuccess(Unreliables.java:81)
                ... 84 more

                Caused by:
                org.testcontainers.containers.ContainerLaunchException: Aborting attempt to link to container btraq5fzahac_worker_1 as it is not running
                    at org.testcontainers.containers.GenericContainer.applyConfiguration(GenericContainer.java:779)
                    at …
Run Code Online (Sandbox Code Playgroud)

docker-compose testcontainers testcontainers-junit5

10
推荐指数
1
解决办法
2万
查看次数

TestContainer 由于错误而无法启动:等待日志输出匹配超时

在为elasticserach启动testcontainer时,出现“ContainerLaunchException:等待日志输出匹配超时”。我应该如何解决这个问题?

container = new ElasticsearchContainer(ELASTICSEARCH_IMAGE)
            .withEnv("discovery.type", "single-node")
            .withExposedPorts(9200);

    container.start();
Run Code Online (Sandbox Code Playgroud)

12:16:50.370 [主要]错误[docker.elastic.co/elasticsearch/elasticsearch:7.16.3] - 无法启动容器org.testcontainers.containers.ContainerLaunchException:等待日志输出匹配'超时。(“消息”:\ s?“开始”。 |]开始$)'在org.testcontainers.containers.wait.strategy.LogMessageWaitStrategy.waitUntilReady(LogMessageWaitStrategy.java:49)在org.testcontainers.containers.wait.strategy。 AbstractWaitStrategy.waitUntilReady(AbstractWaitStrategy.java:51)

更新:我研究了构造函数 ElasticsearchContainer

    public ElasticsearchContainer(DockerImageName dockerImageName) {
    super(dockerImageName);
    this.caCertAsBytes = Optional.empty();
    dockerImageName.assertCompatibleWith(new DockerImageName[]{DEFAULT_IMAGE_NAME, DEFAULT_OSS_IMAGE_NAME});
    this.isOss = dockerImageName.isCompatibleWith(DEFAULT_OSS_IMAGE_NAME);
    this.logger().info("Starting an elasticsearch container using [{}]", dockerImageName);
    this.withNetworkAliases(new String[]{"elasticsearch-" + Base58.randomString(6)});
    this.withEnv("discovery.type", "single-node");
    this.addExposedPorts(new int[]{9200, 9300});
    this.isAtLeastMajorVersion8 = (new ComparableVersion(dockerImageName.getVersionPart())).isGreaterThanOrEqualTo("8.0.0");
    String regex = ".*(\"message\":\\s?\"started\".*|] started\n$)";
    this.setWaitStrategy((new LogMessageWaitStrategy()).withRegEx(regex));
    if (this.isAtLeastMajorVersion8) {
        this.withPassword("changeme");
    }

}
Run Code Online (Sandbox Code Playgroud)

它使用 setWaitStrategy。所以我更新了我的代码如下

container.setWaitStrategy((new LogMessageWaitStrategy()).withRegEx(regex).withTimes(1));
Run Code Online (Sandbox Code Playgroud)

但我仍然遇到同样的错误。这是日志消息的发送范围。

在此输入图像描述

再次更新:我意识到上面的代码更改不会更新任何默认值。

这是新的变化:

        container.setWaitStrategy((new LogMessageWaitStrategy())
                        .withRegEx(regex)
                        .withStartupTimeout(Duration.ofSeconds(180L)));
Run Code Online (Sandbox Code Playgroud)

它适用于这个新的变化。我必须从 …

elasticsearch spring-boot-test testcontainers testcontainers-junit5

10
推荐指数
1
解决办法
4843
查看次数

测试容器无法配置端口绑定

我正在使用 testcontainer 版本1.15.2。测试在 windows 10 上的 intellij 中运行。我有一个wiremock 容器。默认情况下它监听端口8080。我想将此端口映射到8081. 所以我这样做:

public WiremockContainer() {
    super("wiremock/wiremock:2.9.0-alpine");

    self()
            .waitingFor(Wait.forLogMessage(".*port:\\s*8080.*", 1)
                    .withStartupTimeout(Duration.ofSeconds(25L)))
            .withCreateContainerCmdModifier(cmd -> cmd.getHostConfig()
                    .withPortBindings(new PortBinding(Ports.Binding.bindPort(8081), new ExposedPort(8080)))
            )
            .withNetworkAliases("wiremock")
            .withExposedPorts(8081);
}
Run Code Online (Sandbox Code Playgroud)

创建容器时,它会侦听随机端口,而不是8081[1]。我究竟做错了什么 ?我应该怎么做才能让容器监听8081而不是随机端口?

[1]

  1. 我有另一个容器尝试连接http://wiremock:8081并不断获取Connection refused
  2. 当我添加:.waitingFor((...)forPort(8081)(...)));发生超时。

java spring-boot docker-java testcontainers testcontainers-junit5

9
推荐指数
2
解决办法
1万
查看次数

java.lang.IllegalStateException:找不到有效的 Docker 环境。请查看日志并检查配置

我有一个名为 myImageName:latest 的 docker 映像,我在应用程序中使用它。我想为我的应用程序编写集成测试,因此我想使用 TestContainer 包。当我运行以下简单测试时:

@Testcontainers
public class myIntegrationTest{

    @Container
    private GenericContainer container =
    new GenericContainer<>(DockerImageName.parse("myImageName:latest"))
    .withExposedPorts(8080);

    
    @Test
    public void myIntegrationTestName() throws Exception{
        assertTrue(container.isRunning());
    }

}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误(完整堆栈跟踪):

18:30:58.741 [main] 错误 org.testcontainers.dockerclient.DockerClientProviderStrategy - 找不到有效的 Docker 环境。请检查配置。尝试的配置是:2 18:30:58.746 [主要]错误org.testcontainers.dockerclient.DockerClientProviderStrategy - UnixSocketClientProviderStrategy:失败,异常NoClassDefFoundError(无法初始化类org.testcontainers.shaded.com.github.dockerjava.core.DefaultObjectMapperHolder)18 :30:58.747 [main]错误org.testcontainers.dockerclient.DockerClientProviderStrategy - 由于未找到有效配置,因此无法继续执行

java.lang.IllegalStateException:找不到有效的 Docker 环境。请查看日志并检查org.testcontainers.dockerclient.DockerClientProviderStrategy.lambda$getFirstValidStrategy$7(DockerClientProviderStrategy.java:215) at java.base/java.util.Optional.orElseThrow(Optional.java:408) at org.testcontainers的配置。 dockerclient.DockerClientProviderStrategy.getFirstValidStrategy(DockerClientProviderStrategy.java:207) 在 org.testcontainers.DockerClientFactory.getOrInitializeStrategy(DockerClientFactory.java:136) 在 org.testcontainers.DockerClientFactory.client(DockerClientFactory.java:178) 在 org.testcontainers.LazyDockerClient.getDockerClient (LazyDockerClient.java:14) 在 org.testcontainers.LazyDockerClient.authConfig(LazyDockerClient.java:12) 在 org.testcontainers.containers.GenericContainer.start(GenericContainer.java:310) 在 org.testcontainers.junit.jupiter.TestcontainersExtension$ StoreAdapter.start(TestcontainersExtension.java:242) 在 org.testcontainers.junit.jupiter.TestcontainersExtension$StoreAdapter.access$200(TestcontainersExtension.java:229) 在 org.testcontainers.junit.jupiter.TestcontainersExtension.lambda$null$4(TestcontainersExtension. java:82) 在 org.junit.jupiter.engine.execution.ExtensionValuesStore.lambda$getOrComputeIfAbsent$4(ExtensionValuesStore.java:86) 在 org.junit.jupiter.engine.execution.ExtensionValuesStore$MemoizingSupplier.get(ExtensionValuesStore.java:205 )在 org.junit.jupiter.engine.execution.ExtensionValuesStore$StoredValue.evaluate(ExtensionValuesStore.java:182) 在 org.junit.jupiter.engine.execution.ExtensionValuesStore$StoredValue.access$100(ExtensionValuesStore.java:171) …

java docker testcontainers java-11 testcontainers-junit5

7
推荐指数
1
解决办法
2万
查看次数

测试容器:FileNotFoundException:.testcontainers.properties

我在机器上运行应用程序JUnit5的集成测试(使用)时遇到问题。我的测试依赖于两个容器,我使用Testcontainers java 库定义:和。版本是.micronautWindows 10 ProRabbitMQMS SQL serverDockerv19.03.13

\n

运行集成测试后,我收到以下异常:

\n
[WARN ][DESKTOP-PBCHP60] [testcontainers.utility.TestcontainersConfiguration] \xe2\x80\x93 Attempted to read Testcontainers configuration file at file:/$HOME.testcontainers.properties but the file was not found. Exception message: FileNotFoundException: $HOME\\.testcontainers.properties (The system cannot find the file specified)\n
Run Code Online (Sandbox Code Playgroud)\n

不过,从机器运行测试时我没有收到此异常macOS。我的假设是它是Windows特定的。

\n

谁能告诉我如何解决它?我应该自己创建所需的文件吗?或者也许有一种方法可以在运行 IT 期间跳过读取此文件的步骤?

\n

docker testcontainers micronaut testcontainers-junit5

7
推荐指数
0
解决办法
8502
查看次数

Testcontainers:在 PATH 上找不到 docker-machine 可执行文件

我有两个 spring boot 项目,它们都具有相同的 JDK 并且在同一台机器上运行(apple m1)。第一个项目只是一个虚拟项目,其中仅包含 testcontainer 依赖项。

虽然第二个项目是一个遗留项目,我应该在其中集成测试容器。

但是,当 testcontainer 在第一个项目中运行时,对于第二个项目,我收到以下错误(我刚刚从第一个项目复制粘贴了 testcontainer 代码)

JDK:azul 15.0.5

JAVA 路径:Library/Java/JavaVirtualMachines/azul-15.0.5/Contents/Home/bin/java Docker 桌面版本:4.5.0

如何解决这个错误?

17:15:41.181 [main] DEBUG org.springframework.test.context.BootstrapUtils - Instantiating CacheAwareContextLoaderDelegate from class [org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate]
17:15:41.189 [main] DEBUG org.springframework.test.context.BootstrapUtils - Instantiating BootstrapContext using constructor [public org.springframework.test.context.support.DefaultBootstrapContext(java.lang.Class,org.springframework.test.context.CacheAwareContextLoaderDelegate)]
17:15:41.211 [main] DEBUG org.springframework.test.context.BootstrapUtils - Instantiating TestContextBootstrapper for test class [com.housing.cron.ListingUpdateBatchContainerTest] from class [org.springframework.boot.test.context.SpringBootTestContextBootstrapper]
17:15:41.218 [main] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper - Neither @ContextConfiguration nor @ContextHierarchy found for test class [com.housing.cron.ListingUpdateBatchContainerTest], using SpringBootContextLoader
17:15:41.221 [main] DEBUG org.springframework.test.context.support.AbstractContextLoader - Did not …
Run Code Online (Sandbox Code Playgroud)

docker testcontainers testcontainers-junit5

7
推荐指数
1
解决办法
1万
查看次数

运行一些测试后测试容器失去连接

我在我的oss软件中使用testcontainer,但我认为我的配置或docker/testcontainer运行时有问题......

我有一些测试,当它们分开运行时,一切正常,但是当我尝试运行所有测试时,最后一个测试由于应用程序尝试与容器连接时出现问题而失败。

调试问题我发现容器在一个端口启动,但应用程序正在尝试在其他端口连接,其中大部分在最后运行的测试类中使用

所有测试正在运行:

测试失败

失败的测试之一向我显示了以下日志:

失败测试的日志

当类启动时容器启动UserControllerTest使用另一个端口,如下所示:

Windows 上的 docker 显示容器端口

我的测试配置基于一个抽象类(见下文),就像所说的那样,如果运行仅显示错误的类,则一切正常。

@Testcontainers
@ActiveProfiles("test")
@ExtendWith(SpringExtension::class)
@TestMethodOrder(value = OrderAnnotation::class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
abstract class AbstractTest {

    companion object {

        @Container
        private val redisContainer = GenericContainer<Nothing>("redis:6-alpine")
            .apply {
                withExposedPorts(6379)
                withCreateContainerCmdModifier { cmd -> cmd.withName("wb-test-cache") }
            }

        @Container
        private val postgresContainer = PostgreSQLContainer<Nothing>("postgres:13-alpine")
            .apply {
                withExposedPorts(5432)
                withUsername("sa_webbudget")
                withPassword("sa_webbudget")
                withDatabaseName("webbudget")
                withCreateContainerCmdModifier { cmd -> cmd.withName("wb-test-database") }
            }

        @JvmStatic
        @DynamicPropertySource
        fun dynamicPropertiesRegister(registry: DynamicPropertyRegistry) {
            registry.add("spring.datasource.url", postgresContainer::getJdbcUrl)
            registry.add("spring.redis.host", redisContainer::getHost)
            registry.add("spring.redis.port", redisContainer::getFirstMappedPort)
        }
    } …
Run Code Online (Sandbox Code Playgroud)

kotlin docker spring-boot testcontainers testcontainers-junit5

4
推荐指数
1
解决办法
3302
查看次数

加速 Elasticsearch 测试容器

我已将 java 集成测试移至使用 elasticsearch 测试容器,而不是使用嵌入式 elasticsearch。测试速度慢了 1 小时,这对生产力造成了巨大影响。我正在寻找加快速度的方法。

我尝试像reuse在 Elasticsearch 容器上一样使用参数,但这并没有产生任何影响。我最新的配置是

    private static final String ELASTICSEARCH_VERSION = "7.11.2";
    private static ElasticsearchContainer elasticsearchContainer;
    private static final DockerImageName ELASTICSEARCH_IMAGE =
          DockerImageName
                .parse("docker.elastic.co/elasticsearch/elasticsearch")
                .withTag(ELASTICSEARCH_VERSION);
Run Code Online (Sandbox Code Playgroud)
            elasticsearchContainer = new ElasticsearchContainer(ELASTICSEARCH_IMAGE)
                  .withEnv("foo", "bar").withSharedMemorySize(1000000000L);
            elasticsearchContainer.addExposedPorts(9200, 9300);
            elasticsearchContainer.withStartupTimeout(Duration.of(5, ChronoUnit.MINUTES));
            elasticsearchContainer.start();
Run Code Online (Sandbox Code Playgroud)
    private static RestHighLevelClient getRestHighLevelClient(ElasticsearchContainer container) {
        final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
        credentialsProvider.setCredentials(AuthScope.ANY,
                                           new UsernamePasswordCredentials(ELASTICSEARCH_USERNAME,
                                                                           ELASTICSEARCH_PASSWORD));
        RestClientBuilder restClientBuilder = RestClient.builder(HttpHost.create(container.getHttpHostAddress()))
              .setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder
                    .setDefaultCredentialsProvider(credentialsProvider)
                    .setKeepAliveStrategy((response, context) -> 3 * 60 * 1000));
        // Try to prevent …
Run Code Online (Sandbox Code Playgroud)

java elasticsearch spring-data-elasticsearch testcontainers testcontainers-junit5

2
推荐指数
1
解决办法
2459
查看次数

使用 Junit5 的参数化 testcontainer 镜像标签

在 Testcontainers 文档中,有一个使用 @ParameterizedTest 参数化 docker 映像的示例。

这是一个 junit4 示例。

https://github.com/testcontainers/testcontainers-java/blob/main/core/src/test/java/org/testcontainers/junit/ParameterizedDockerfileContainerTest.java

@RunWith(Parameterized.class)
public class ParameterizedDockerfileContainerTest {

    private final String expectedVersion;

    @Rule
    public GenericContainer container;

    public ParameterizedDockerfileContainerTest(String baseImage, String expectedVersion) {
        container =
            new GenericContainer(
                new ImageFromDockerfile()
                    .withDockerfileFromBuilder(builder -> {
                        builder
                            .from(baseImage)
                            // Could potentially customise the image here, e.g. adding files, running
                            //  commands, etc.
                            .build();
                    })
            )
                .withCommand("top");
        this.expectedVersion = expectedVersion;
    }

    @Parameterized.Parameters(name = "{0}")
    public static Object[][] data() {
        return new Object[][] { //
            { "alpine:3.12", "3.12" }, …
Run Code Online (Sandbox Code Playgroud)

java junit5 testcontainers testcontainers-junit5

1
推荐指数
1
解决办法
542
查看次数