在 spock 测试中获取对默认 java 容器 (TestContainers) 的访问权限
Get the access to default java container (TestContainers) in spock test
我有一个启动附加容器的 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 项目中创建的端点。
为了更清楚,我加了一张图。
如果你想用 Testcontainer 在两个容器之间进行通信,请确保将它们放在同一个网络中。
您可以为每个容器添加一个网络别名,以避免通过主机进行任何 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
。接下来,您可以从您的 Selenium 容器和 Python 脚本中使用 http://application:YOUR_DEFAULT_PORT
.
访问此容器
我有一个启动附加容器的 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 项目中创建的端点。 为了更清楚,我加了一张图。
如果你想用 Testcontainer 在两个容器之间进行通信,请确保将它们放在同一个网络中。
您可以为每个容器添加一个网络别名,以避免通过主机进行任何 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
。接下来,您可以从您的 Selenium 容器和 Python 脚本中使用 http://application:YOUR_DEFAULT_PORT
.