【问题标题】:Get the access to default java container (TestContainers) in spock test在 spock 测试中获取对默认 java 容器 (TestContainers) 的访问权限
【发布时间】:2022-01-05 01:50:56
【问题描述】:

我有一个启动额外容器的 spock 集成测试。

@Shared
protected GenericContainer seleniumStandalone =
        new GenericContainer<>("selenium/standalone-chrome:latest")
                .withExposedPorts(4444)
                .withCreateContainerCmdModifier({ cmd -> cmd.withName('dockerized-chrome') })
                .withCopyFileToContainer(
                        MountableFile.forClasspathResource("install_python.sh", 0744),"/install_python.sh")
                .withCopyFileToContainer(
                        MountableFile.forClasspathResource("test.py", 0744),"/test.py")

容器“dockerized-chrome”有一个 python 脚本。他内部的脚本试图向最初在 java 源代码中的端点发出请求。这就是为什么我很好奇这是获取有关名称或 id java 容器的信息的原因,该容器由 TestContainers 注释创建,该注释还具有在 java 项目中创建的端点。 为了更清楚,我添加了一张图片。

【问题讨论】:

  • 我不明白你想说什么,你能否重新表述你的问题以使其更清楚。什么需要和什么谈?用哪种方法?您是尝试连接端口,还是尝试调用容器接口上的方法?
  • @LeonardBrünings 我进行了更改。我想在集成测试运行时使用 python 脚本向 Testcontainers 创建的 java 容器发出请求。
  • 如果你想做一些浏览器测试,我建议你使用很棒的Geb framework,而不是仅仅使用java来启动一个容器,然后尝试连接一个python脚本。

标签: java docker spock testcontainers


【解决方案1】:

如果您想使用 Testcontainers 在两个容器之间进行通信,请确保将它们放在同一个网络中。

您可以为每个容器添加一个网络别名,以避免通过主机进行任何 IP 查找和端口暴露。

以下示例来自 Testcontainers 文档和dedicated section for Advanced Networking 的一部分:

try (
        Network network = Network.newNetwork();

        GenericContainer<?> foo = new GenericContainer<>(TestImages.TINY_IMAGE)
                .withNetwork(network)
                .withNetworkAliases("foo")
                .withCommand("/bin/sh", "-c", "while true ; do printf 'HTTP/1.1 200 OK\\n\\nyay' | nc -l -p 8080; done");

        GenericContainer<?> bar = new GenericContainer<>(TestImages.TINY_IMAGE)
                .withNetwork(network)
                .withCommand("top")
) {
    foo.start();
    bar.start();

    String response = bar.execInContainer("wget", "-O", "-", "http://foo:8080").getStdout();
    assertEquals("received response", "yay", response);
}

将其用作您的设置蓝图并命名您的 Java 容器,例如application。接下来,您可以使用 http://application:YOUR_DEFAULT_PORT 从您的 Selenium 容器和 Python 脚本中访问此容器。

【讨论】:

    猜你喜欢
    • 2017-10-08
    • 2020-07-30
    • 2013-12-17
    • 1970-01-01
    • 2019-11-01
    • 2020-11-11
    • 2013-01-25
    • 1970-01-01
    • 2011-06-20
    相关资源
    最近更新 更多