繁体   English   中英

使用Mocha进行集成测试时如何处理Elasticsearch的索引计时

[英]How do I handle elasticsearch's index timing when doing integration testing with mocha

我正在使用弹性搜索的节点项目上。 我的测试链是gulp,mocha,chai,sinon。 我很难使我的集成​​测试能够始终如一地工作。 我想将样本数据加载到数据库中,然后对其进行一些测试。 我相信我遇到了问题,因为我正在加载的文档在使用它们的测试运行时尚未被索引。

我通过以下方法解决了这个问题:

    before(function (done) {
        testData.simpleLoadData(100, 2000);
        setTimeout(function () {
            done();
        }, 5000);
    });

这在本地工作正常,偶尔在travis上工作。 当我将计时器设置为10000时,它通常可以在两个地方工作。

有没有办法在测试代码中不诉诸setTimeouts? 手动处理时间会让我有些胆怯。

手动处理超时是我最好的选择,还是有更好的方法?

注意:这些是集成测试,我明确希望使用外部依赖项。 我的单元测试已经不依赖数据库了。

这里有两件事可能会让您绊倒:分片分配和刷新周期。

当您创建新索引时,可能会发生第一个事件。 主节点确认请求并开始创建过程后,Create Index api将返回200 OK。 但是实际的分片分配在后台异步发生。 而且虽然速度很快,但是集成测试有时可以在索引完全启动和运行之前执行,从而在尝试索引文档时导致错误。

使此功能更强大的最简单方法是创建索引,然后使用wait_for_status=green (或黄色,取决于您是否使用副本)来调用Health API 该调用将一直阻塞,直到完全分配了索引。

下一个问题涉及搜索的近实时性。 默认情况下,Elasticsearch每秒刷新一次搜索索引。 对于集成测试而言,这可能太慢,并且您的文档可能已建立索引,但在运行测试时不可搜索。

要解决此问题,请为所有文档建立索引,然后在目标索引上调用Refresh API 该调用返回后,您的文档将“处于活动状态”并且可以搜索。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM