我正在使用 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
是否可以在 Java 测试中将 Testcontainers 与 Podman 一起使用?
截至 2022 年 3 月,Testcontainers 库未将已安装的 Podman 检测为有效的 Docker 环境。
Podman 可以在采用 Apple 芯片的 MacOS(本地开发环境)和 Linux x86_64(CI/CD 环境)上替代 Docker 吗?
我有多个测试类使用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) 在为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
我正在使用 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]
http://wiremock:8081并不断获取Connection refused.waitingFor((...)forPort(8081)(...)));发生超时。java spring-boot docker-java testcontainers testcontainers-junit5
我有一个名为 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) …
我在机器上运行应用程序JUnit5的集成测试(使用)时遇到问题。我的测试依赖于两个容器,我使用Testcontainers java 库定义:和。版本是.micronautWindows 10 ProRabbitMQMS SQL serverDockerv19.03.13
运行集成测试后,我收到以下异常:
\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)\nRun Code Online (Sandbox Code Playgroud)\n不过,从机器运行测试时我没有收到此异常macOS。我的假设是它是Windows特定的。
谁能告诉我如何解决它?我应该自己创建所需的文件吗?或者也许有一种方法可以在运行 IT 期间跳过读取此文件的步骤?
\n我有两个 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) 我在我的oss软件中使用testcontainer,但我认为我的配置或docker/testcontainer运行时有问题......
我有一些测试,当它们分开运行时,一切正常,但是当我尝试运行所有测试时,最后一个测试由于应用程序尝试与容器连接时出现问题而失败。
调试问题我发现容器在一个端口启动,但应用程序正在尝试在其他端口连接,其中大部分在最后运行的测试类中使用
所有测试正在运行:
失败的测试之一向我显示了以下日志:
当类启动时容器启动UserControllerTest使用另一个端口,如下所示:
我的测试配置基于一个抽象类(见下文),就像所说的那样,如果运行仅显示错误的类,则一切正常。
@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
我已将 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
在 Testcontainers 文档中,有一个使用 @ParameterizedTest 参数化 docker 映像的示例。
这是一个 junit4 示例。
@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) testcontainers ×11
docker ×4
java ×4
spring-boot ×3
kotlin ×2
docker-java ×1
java-11 ×1
junit5 ×1
micronaut ×1
mongodb ×1
podman ×1