测试容器:服务就绪后同步日志
Posted
技术标签:
【中文标题】测试容器:服务就绪后同步日志【英文标题】:Testcontainers: Synchronizing on Logs after the Service Was Ready 【发布时间】:2021-11-04 23:48:15 【问题描述】:我正在使用 Testcontainers 开发一些组件测试。我可以同步服务就绪测试。但是,一旦服务准备好,我需要准备夹具并运行测试,直到夹具完全加载。
被测容器写了一个日志,我可以用它来了解夹具何时完全加载。但是,我找不到在该日志上同步的方法。
Testcontainers 库是否为此提供任何实用程序?
【问题讨论】:
【参考方案1】:如果您使用的是 GenericContainer 对象类型,您可以简单地执行以下操作:
WaitingConsumer consumer = new WaitingConsumer();
container.followOutput(consumer, STDOUT);
consumer.waitUntil(frame ->
frame.getUtf8String().contains("STARTED"), 30, TimeUnit.SECONDS);
否则,您可以使用以下方法处理整个日志:
container.getLogs();
希望这对您有所帮助!
【讨论】:
感谢您的回复。我意识到我的问题没有重点。对不起。真正的问题是我需要等待日志STARTED
,例如在日志中出现n次。
我不知道是否有开箱即用的功能。也许您应该创建一个使用日志输出并验证特定条件的方法。【参考方案2】:
可以使用日志消息等待策略来实现。
public GenericContainer containerWithLogWait = new GenericContainer(DockerImageName.parse("redis:5.0.3"))
.withExposedPorts(6379)
.waitingFor(
Wait.forLogMessage(".*Ready to accept connections.*\\n", 3)
);
您还可以通过从AbstractWaitStrategy
扩展来创建自己的策略。
查看this page了解更多详情。
【讨论】:
感谢您的贡献。但是,我没有问如何等待准备就绪;)以上是关于测试容器:服务就绪后同步日志的主要内容,如果未能解决你的问题,请参考以下文章
(转) Java线程同步阻塞, sleep(), suspend(), resume(), yield(), wait(), notify()