6

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

4

2 回答 2

10

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

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

首先,您需要摆脱FabricRuntime代码中的所有硬依赖(对具有依赖关系的事物)以及静态支持类:

服务/演员代理

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

服务上下文

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

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

服务设置和激活上下文

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

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) {}

对于演员来说IActorStateProvider,如果你想在集成测试中处理状态,你需要模拟它。

概括

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

于 2017-01-21T19:35:39.050 回答
0

无状态 Web api 与常规 api 的集成测试没有区别。

于 2017-01-23T00:41:04.590 回答