我想在服务架构中对无状态服务进行集成。请帮我解决这个问题。我创建了无状态服务,如c#web api。
答案 0 :(得分:8)
为了对您的Reliable Service执行集成测试,您需要模拟和处理许多依赖项。您将无法以这种方式测试服务的所有情况或行为,FabricRuntime
托管和运行服务的方式难以复制(无需编写自己的FabricRuntime等效项)。值得注意的是,如果没有集群(包括本地开发集群),就无法运行FabricRuntime
。
您还需要考虑集成测试的高级程度。例如,您的服务是否使用要在集成测试中包含的结构传输(默认通信模型)调用同一集群中的其他服务(包括演员)?您是否需要确保在同一服务分区的多次激活中持久保存状态?
首先,您需要摆脱FabricRuntime
(对于依赖于它的事物)的所有硬依赖关系以及代码中的静态支持类:
服务/演员代理
在调用其他服务时不要使用静态ServiceProxy.Create<..)(..)>
,而是确保您的服务在构造函数中接受IServiceProxyFactory
的实例,并使用该实例为服务调用的服务创建代理。同样适用于ActorProxy.Create<..>(..)
,将其替换为IActorProxyFactory
的实例。在构建服务的program.cs
中,提供服务new ServiceProxyFactory()
和new ActorProxyFactory()
。这是最简单的部分,现在您需要模拟这些,以便您的集成测试实际上可以为下游服务创建某种形式的代理。您还需要创建某种形式的容器(如模拟FabricRuntime),它包含被调用服务和actor的实例。如果您不想测试服务的RunAsync
方法执行某些功能,那么它也会变得棘手。如果你想在测试运行器中运行它,请注意创建这个静态,
你不希望不同的测试在同一个容器中混淆。
服务背景
您需要模拟StatefulServiceContext
以及如何创建服务。您的服务构造函数需要接受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) {}
对于actor IActorStateProvider
,如果要在集成测试中处理状态,则需要进行模拟。
<强>摘要强>
根据您希望集成测试的高级程度以及您希望它与实际执行模型的接近程度,您可能最终必须模拟并替换大量的类/接口。 Web参考应用程序示例 https://github.com/Azure-Samples/service-fabric-dotnet-web-reference-app对所需的类有一些Mocks的实现,https://github.com/loekd/ServiceFabric.Mocks包含用于测试的Mocks,尽管如果你真的想要运行集成测试而你可能需要更改代码只是单元测试。
答案 1 :(得分:0)
使用常规api对无状态web api进行集成测试没有任何区别。