使用 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" 可搜索。
我正在开发一个使用 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" 可搜索。