gpt4 book ai didi

testing - 使用 Nest 在 C# 中进行 Elasticsearch 测试(单元/集成)最佳实践

转载 作者:行者123 更新时间:2023-11-28 19:51:23 24 4
gpt4 key购买 nike

我已经搜索了一段时间,我应该如何测试我的数据访问层,但没有取得太大的成功。让我列出我的顾虑:

  1. 单元测试

这个人(这里:Using InMemoryConnection to test ElasticSearch)说:

Although asserting the serialized form of a request matches your expectations in the SUT may be sufficient.

断言请求的序列化形式真的值得吗?这些测试有什么值(value)吗?它似乎不太可能更改不应更改序列化请求的功能。

如果值得,断言这些请求的正确方法是什么?

  1. 再次进行单元测试

另一个人(这里:ElasticSearch 2.0 Nest Unit Testing with MOQ)展示了一个好看的例子:

void Main()
{
var people = new List<Person>
{
new Person { Id = 1 },
new Person { Id = 2 },
};

var mockSearchResponse = new Mock<ISearchResponse<Person>>();
mockSearchResponse.Setup(x => x.Documents).Returns(people);

var mockElasticClient = new Mock<IElasticClient>();
mockElasticClient.Setup(x => x
.Search(It.IsAny<Func<SearchDescriptor<Person>, ISearchRequest>>()))
.Returns(mockSearchResponse.Object);

var result = mockElasticClient.Object.Search<Person>(s => s);

Assert.AreEqual(2, result.Documents.Count()).Dump();
}

public class Person
{
public int Id { get; set;}
}

可能我遗漏了一些东西,但我看不到这段代码的意义。首先,他模拟了一个 ISearchResponse 以始终返回 people 列表。然后他模拟一个 IElasticClient 以将之前的搜索响应返回到他发出的任何搜索请求。

好吧,在那之后断言是真的,我并不感到惊讶。这些测试有什么意义?

  1. 集成测试

集成测试对我来说测试数据访问层更有意义。因此,经过一番搜索后,我找到了这个 ( https://www.nuget.org/packages/elasticsearch-inside/) 包。如果我没记错的话,这只是关于嵌入式 JVM 和 ES。使用它是一种好习惯吗?我不应该使用我已经运行的实例吗?

如果有人对我没有包括的测试有很好的经验,我也很乐意听到这些。

最佳答案

您列出的每种方法都可能是一种合理的方法,具体取决于您尝试通过测试实现的目标。你没有在你的问题中指定这个:)

让我们回顾一下您列出的选项

  1. 如果您根据不同数量的输入构建对 Elasticsearch 的请求,则向 Elasticsearch 断言请求的序列化形式可能是一种足够的方法。您的测试可能会提供不同的输入实例,并断言将针对每个实例发送到 Elasticsearch 的查询形式。这些类型的测试执行起来会很快,但假设生成的查询和您断言的形式将返回您期望的结果。
  2. 这是另一种形式的单元测试,可以消除与 Elasticsearch 客户端的交互。本例中的被测系统(SUT)不是客户端,而是内部使用客户端的另一个组件,因此通过 stub 对象控制与客户端的交互,返回一个预期的响应。该示例是人为设计的,因为在实际测试中,您不会像您指出的那样对客户端调用的结果进行断言,而是对 SUT 的输出进行断言。
  3. 针对 Elasticsearch 集群中已知数据集的集成/行为测试可能会提供最大值(value)并超越第 1 点和第 2 点,因为它们不仅会附带测试针对给定输入发送到 Elasticsearch 的生成查询,而且还会测试交互并产生预期结果。然而,毫无疑问,这些类型的测试比 1 和 2 更难设置,但它们对您项目的好处可能会超过设置投资。

因此,您需要问问自己,什么样的测试足以达到您所需要的保证级别,以断言您的系统正在按照您的预期运行;它可能是针对系统不同元素的所有三种不同方法的组合。

您可能想要 check out how the .NET client itself is tested ;有components within the Tests projectspin up an Elasticsearch clusterdifferent plugins installed , seed it with known generated data并对结果做出断言。 The source is open and licensed under Apache 2.0 license , 所以请随意在您的项目中使用元素 :)

关于testing - 使用 Nest 在 C# 中进行 Elasticsearch 测试(单元/集成)最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39305929/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com