如何正确集成测试ElasticSearch?我的集成测试是不确定的

1wnzp6jl  于 2023-10-17  发布在  ElasticSearch
关注(0)|答案(1)|浏览(110)

我想集成测试一个在ElasticSearch中存储数据的类。通常,我想使用测试类添加一些数据,然后检查Elastic上是否存在数据。
测试方法示例:

[SetUp]
public void Setup()
{
    ElasticClient.DeleteByQuery(Indices.Index(IndexName), d =>
        d.Query(x => x.MatchAll())
    );
}

[Test]
public async Task GetAllConversations_ShouldReturnAllConversations()
{
    // Arrange
    Guid[] randomGuids = new[]
    {
        Guid.NewGuid(),
        Guid.NewGuid(),
        Guid.NewGuid(),
        Guid.NewGuid(),
    };

    foreach (var randomGuid in randomGuids)
    {
        await _conversationStorage.AddMessage(randomGuid, new Message()
        {
            Text = "test",
            Type = MessageType.UserMade
        });
    }

    // Act
    var result = await _sut.GetAllConversations();
    
    // Assert
    Assert.That(result?.Conversations.Count, Is.EqualTo(4));
}

AddMessage在内部执行IndexAsync
我的问题是,我的方法似乎是不确定的。它通常会通过(我可以看到数据出现在Elastic上),但有时不会。再次运行它会使测试再次通过。
我能否以某种方式确保最近添加的所有数据都在Elastic上建立了索引,并且我可以安全地执行“Assert”检查?
我使用Elastic.Clients.Elasticsearch .NET库和ElasticSearch版本8.10.2

yebdmbv4

yebdmbv41#

在elasticsearch中索引的文档在索引后不能立即搜索。我真的很惊讶它能起作用。我想你可能也不太会打扫。对于要在搜索中显示的文档,索引应该是refreshed。默认情况下,此操作每秒自动发生一次。但你可以强迫它。
在生产环境中,不建议在每次索引后强制执行刷新操作,因为这会导致性能下降,但在您的场景中,这完全没有问题。
另一个注意事项:通常,删除并重新创建索引比从索引中删除所有记录要快得多,也更干净。

相关问题