回答

5

为了在您的Reliable Service上执行集成测试,您需要模拟和处理一些依赖关系。您将无法以这种方式测试服务的所有情况或行为,FabricRuntime托管和运行服务的方式难以复制(无需编写您自己的FabricRuntime等效项)。还值得注意的是,没有集群(包括本地开发集群),没有办法运行FabricRuntime

你还需要考虑你的集成测试应该有多高级。例如,您的服务是否使用要包含在集成测试中的光纤传输(默认通信模型)向同一群集内的其他服务(包括参与者)发出呼叫?你是否需要确保该状态在同一服务分区的多个激活中保持不变?

首先,你需要摆脱所有的硬盘依赖于FabricRuntime(对事情的依赖于它),也支持静态类在代码:

服务/演员代理

不要请在调用其他服务时使用静态的ServiceProxy.Create<..)(..)>,而是确保您的服务在构造函数中接受IServiceProxyFactory的实例,并使用该实例来创建代理来服务您的服务调用。用ActorProxy.Create<..>(..)也是如此,用IActorProxyFactory的实例代替它。在您的服务构建的program.cs中,提供服务new ServiceProxyFactory()new ActorProxyFactory()。这很简单,现在你需要嘲笑这些,这样你的集成测试实际上可以为下游服务创建某种形式的代理。您还需要创建某种形式的容器(如模拟FabricRuntime),该容器包含所谓的服务和参与者的实例。如果您不想测试服务的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?)。在这种情况下,你需要用你自己的mockable版本替换它,并且你还需要在构造函数中注入它。什么是你最样本中找到的是对服务情境中的呼叫,像这样:

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有需要的类嘲笑的一些实施,也https://github.com/loekd/ServiceFabric.Mocks包含嘲笑了测试,虽然你可能需要改变的代码,如果你真的想运行集成测试而不仅仅是单元测试。

0

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

+0

如果您的无状态Web API使用Fabric传输与集群中的其他服务进行通信,或尝试使用CodePackageActivationContext读取服务的配置(例如连接字符串),那么集成测试将失败,除非您允许某种形式的模拟这些依赖关系,或者实际上是在真正的集群上运行集成测试。 – yoape

+0

我认为这是用于集成测试。所以没有什么应该是嘲笑。 – alltej

+1

在这种情况下,您唯一的选择就是在真正的集群上运行测试,在这种情况下,您的测试将涉及自动部署到集群,填充一些已知数据状态并推动与服务交互的某种形式。是的,在这种情况下可以这样运行,但可能需要很多工作。在这种情况下,可以使用[''FabricClient.TestManagementClient''](https://docs.microsoft.com/zh-cn/dotnet/api/system.fabric.fabricclient.testmanagementclient)来设置所需的数据状态。 – yoape

相关问题