使用 mocha 进行集成测试时如何处理 elasticsearch 的索引时间

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

我正在开发一个使用 elasticsearch 的节点项目。我的测试链是 gulp,mocha,chai,sinon。我很难让我的集成测试始终如一地工作。我想在数据库中加载示例数据,然后 运行 对其进行一些测试。我相信我遇到了问题,因为我正在加载的文档在使用它们的测试时没有被索引 运行。

我已经通过执行以下操作解决了这个问题:

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

这在本地运行良好,偶尔在 travis 上运行。当我将计时器调到 10000 时,它通常在两个地方都有效。

有没有不用在测试代码中使用 setTimeouts 的方法?手动处理时间让我有点娇气

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

注意:这些是集成测试,我明确想要使用外部依赖项。我有不依赖于数据库的单元测试。

这里有两件事会让您感到困惑:分片分配和刷新周期。

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

实现这种健壮性的最简单方法是创建索引,然后使用 wait_for_status=green(或黄色,取决于您是否使用副本)调用 Health API。此调用将阻塞,直到索引完全分配。

下一期与搜索的近实时方面有关。默认情况下,Elasticsearch 每秒刷新一次搜索索引。这对于集成测试来说可能太慢了,并且当您的测试 运行.

时,您的文档可能会被索引但不可搜索

要解决此问题,请为所有文档编制索引,然后对目标索引调用 Refresh API。此调用 return 后,您的文档将 "live" 可搜索。