gpt4 book ai didi

c# - 我们如何对服务结构(无状态服务)进行集成测试?

转载 作者:太空狗 更新时间:2023-10-29 21:21:23 27 4
gpt4 key购买 nike

我想在服务结构中对无状态服务执行集成。请帮助我。我已经创建了像 c# web api 这样的无状态服务。

最佳答案

为了对您的 Reliable Service 执行集成测试,您需要模拟和处理许多依赖项。您将无法像 FabricRuntime 那样以这种方式测试您的服务的所有情况或行为。主机和运行服务难以复制(无需编写您自己的 FabricRuntime 等效项)。另外值得注意的是,没有办法运行FabricRuntime没有集群(包括本地开发集群)。

您还需要考虑集成测试的高级程度。例如,您的服务是否使用要包含在集成测试中的结构传输(默认通信模型)调用同一集群中的其他服务(包括参与者)?您是否需要确保状态在同一服务分区的多次激活中保持不变?

首先,您需要摆脱对 FabricRuntime 的所有硬依赖。 (对于依赖它的东西)以及代码中的静态支持类:

服务/Actor 代理

不要使用静态 ServiceProxy.Create<..)(..)>调用其他服务时,请确保您的服务接受 IServiceProxyFactory 的实例。在构造函数中并使用该实例创建代理来为您的服务调用提供服务。 ActorProxy.Create<..>(..) 也是如此,将其替换为 IActorProxyFactory 的实例.在您的 program.cs在服务构建的地方,给服务 new ServiceProxyFactory()new ActorProxyFactory() .这是最简单的部分,现在您需要模拟它们,以便您的集成测试实际上可以为下游服务创建某种形式的代理。您还需要创建某种形式的容器(如模拟 FabricRuntime),其中包含被调用的服务和参与者的实例。如果您不想测试 RunAsync,这也会变得很棘手。您的服务的方法执行某些功能。如果您想在测试运行器中运行它,请注意创建此静态,
您不希望在同一个容器中混合不同的测试。

服务上下文

你需要模拟你的 StatefulServiceContext以及您的服务是如何创建的。您的服务构造函数需要接受 StatefulServiceContext 的实例。传递给基类,因此您可以在创建服务时自由地在那里提供自己的模拟上下文实例。

public StatefulService(StatefulServiceContext serviceContext)
: base(serviceContext) {}

服务设置和激活上下文

您还需要查看您的服务实现是否尝试读取 ICodePackageActivationContext或服务 list 中的任何设置(如此 SO 答案 Where do you set and access run-time configuration parameters per environment for service fabric? 中所示)。在这种情况下,您需要将其替换为您自己的可模拟版本,并且您还需要将其注入(inject)到构造函数中。您在大多数示例中发现的是对服务上下文的调用,如下所示:
this.Context.CodePackageActivationContext.GetConfigurationPackageObject("Config");

如果你在你的服务中这样做,那么你需要确保你有一个模拟 StatefulServiceContext以及您的服务是如何创建的。当您在 Program.Main() 中向运行时注册您的服务时然后你会得到 StatefulServiceContext 的实例在注册调用中:
ServiceRuntime.RegisterServiceAsync("ServiceType", 
context => new Service(context)).GetAwaiter().GetResult();

国家

为了模拟状态并使其行为类似于在真实集群中运行时的行为,您需要模拟底层处理程序以获得可靠状态: IReliableStateManagerReplica并且您需要向您的服务添加一个重载构造函数,该构造函数接受该实例并将其发送到基类:
public StatefulService(StatefulServiceContext serviceContext, IReliableStateManagerReplica reliableStateManagerReplica)
: base(serviceContext, reliableStateManagerReplica) {}

对于 Actor 其 IActorStateProvider如果您想在集成测试中处理状态,则需要模拟。

摘要

根据您希望集成测试的高级程度以及您希望它与实际执行模型的接近程度,您最终可能不得不模拟和替换大量的类/接口(interface)。 Web 引用应用程序示例
https://github.com/Azure-Samples/service-fabric-dotnet-web-reference-app对所需的类有一些 Mocks 的实现,还有 https://github.com/loekd/ServiceFabric.Mocks包含用于测试的 Mocks,但如果您真的想运行 ,您可能需要更改代码。集成测试 而不仅仅是单元测试。

关于c# - 我们如何对服务结构(无状态服务)进行集成测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41782300/

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