使用 Nest 在 C# 中进行 Elasticsearch 测试(unit/integration)最佳实践
Elasticsearch testing(unit/integration) best practices in C# using Nest
我已经搜索了一段时间,我应该如何测试我的数据访问层,但没有取得太大的成功。让我列出我的顾虑:
- 单元测试
这个人(这里:)说:
Although asserting the serialized form of a request matches your
expectations in the SUT may be sufficient.
断言请求的序列化形式真的值得吗?这些测试有什么价值吗?似乎不太可能更改不应更改序列化请求的功能。
如果值得,断言这些请求的正确方法是什么?
- 再次进行单元测试
另一个人(这里:)展示了一个好看的例子:
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
总是 return people
列表。然后他模拟一个 IElasticClient
到 return 之前对他所做的任何搜索请求的搜索响应。
好吧,在那之后断言是真的,我并不感到惊讶。这些测试有什么意义?
- 集成测试
集成测试对我来说测试数据访问层更有意义。所以经过一番搜索,我找到了这个 (https://www.nuget.org/packages/elasticsearch-inside/) 包。如果我没记错的话,这只是关于嵌入式 JVM 和 ES。使用它是一种好习惯吗?我不应该使用我已经 运行 的实例吗?
如果有人对我没有包括的测试有很好的经验,我也很乐意听到这些。
您列出的每种方法都可能是一种合理的方法,具体取决于您尝试通过测试实现的目标。你没有在你的问题中指定这个:)
让我们检查一下您列出的选项
- 如果您根据不同数量的输入构建对 Elasticsearch 的请求,则断言对 Elasticsearch 的请求的序列化形式可能是一种足够的方法。您的测试可能会提供不同的输入实例,并断言将针对每个实例发送到 Elasticsearch 的查询形式。这些类型的测试将很快执行,但假设生成的查询和您断言的形式将 return 您期望的结果。
- 这是另一种形式的单元测试,可以消除与 Elasticsearch 客户端的交互。此示例中的被测系统 (SUT) 不是客户端,而是内部使用客户端的另一个组件,因此与客户端的交互是通过存根对象控制到 return 预期的响应。该示例是人为设计的,因为在实际测试中,您不会像您指出的那样断言客户端调用的结果,而是断言 SUT 的输出。
- Integration/Behavioural 针对 Elasticsearch 集群中已知数据集的测试可能会提供最大价值并超越第 1 点和第 2 点,因为它们不仅会附带测试针对给定输入发送到 Elasticsearch 的生成查询,但也将测试交互并产生预期结果。毫无疑问,这些类型的测试比 1 和 2 更难设置,但设置投资可能会超过它们对您项目的好处。
因此,您需要问问自己,什么样的测试足以达到您所需要的保证级别,以断言您的系统正在按照您的预期运行;它可能是针对系统不同元素的所有三种不同方法的组合。
您可能想要 check out how the .NET client itself is tested; there are components within the Tests project that spin up an Elasticsearch cluster with different plugins installed, seed it with known generated data and make assertions on the results. The source is open and licensed under Apache 2.0 license,因此请随意使用项目中的元素 :)
我已经搜索了一段时间,我应该如何测试我的数据访问层,但没有取得太大的成功。让我列出我的顾虑:
- 单元测试
这个人(这里:
Although asserting the serialized form of a request matches your expectations in the SUT may be sufficient.
断言请求的序列化形式真的值得吗?这些测试有什么价值吗?似乎不太可能更改不应更改序列化请求的功能。
如果值得,断言这些请求的正确方法是什么?
- 再次进行单元测试
另一个人(这里:
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
总是 return people
列表。然后他模拟一个 IElasticClient
到 return 之前对他所做的任何搜索请求的搜索响应。
好吧,在那之后断言是真的,我并不感到惊讶。这些测试有什么意义?
- 集成测试
集成测试对我来说测试数据访问层更有意义。所以经过一番搜索,我找到了这个 (https://www.nuget.org/packages/elasticsearch-inside/) 包。如果我没记错的话,这只是关于嵌入式 JVM 和 ES。使用它是一种好习惯吗?我不应该使用我已经 运行 的实例吗?
如果有人对我没有包括的测试有很好的经验,我也很乐意听到这些。
您列出的每种方法都可能是一种合理的方法,具体取决于您尝试通过测试实现的目标。你没有在你的问题中指定这个:)
让我们检查一下您列出的选项
- 如果您根据不同数量的输入构建对 Elasticsearch 的请求,则断言对 Elasticsearch 的请求的序列化形式可能是一种足够的方法。您的测试可能会提供不同的输入实例,并断言将针对每个实例发送到 Elasticsearch 的查询形式。这些类型的测试将很快执行,但假设生成的查询和您断言的形式将 return 您期望的结果。
- 这是另一种形式的单元测试,可以消除与 Elasticsearch 客户端的交互。此示例中的被测系统 (SUT) 不是客户端,而是内部使用客户端的另一个组件,因此与客户端的交互是通过存根对象控制到 return 预期的响应。该示例是人为设计的,因为在实际测试中,您不会像您指出的那样断言客户端调用的结果,而是断言 SUT 的输出。
- Integration/Behavioural 针对 Elasticsearch 集群中已知数据集的测试可能会提供最大价值并超越第 1 点和第 2 点,因为它们不仅会附带测试针对给定输入发送到 Elasticsearch 的生成查询,但也将测试交互并产生预期结果。毫无疑问,这些类型的测试比 1 和 2 更难设置,但设置投资可能会超过它们对您项目的好处。
因此,您需要问问自己,什么样的测试足以达到您所需要的保证级别,以断言您的系统正在按照您的预期运行;它可能是针对系统不同元素的所有三种不同方法的组合。
您可能想要 check out how the .NET client itself is tested; there are components within the Tests project that spin up an Elasticsearch cluster with different plugins installed, seed it with known generated data and make assertions on the results. The source is open and licensed under Apache 2.0 license,因此请随意使用项目中的元素 :)