测试容器:服务就绪后同步日志

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()

如何将日志服务的数据秒级同步到表格存储

解决Docker容器时区及时间不同步问题

started.FATAL:日志语句不同步:当前测试套件“TestTarget.xctest”不存在

MariaDBMySQL数据库主从同步

Rsync 自动同步压缩日志文件至备份服务器