我想要在服务fabric中执行无状态服务的集成。请帮我解决这个问题。我已经创建了像C#web api这样的无状态服务。我们如何执行服务结构(无状态服务)的集成测试?
回答
为了在您的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包含嘲笑了测试,虽然你可能需要改变的代码,如果你真的想运行集成测试而不仅仅是单元测试。
无状态web api上的集成测试与常规api没有区别。
- 1. 如何在服务结构中单元测试无状态服务
- 2. Java执行服务集成测试
- 3. 在Azure集群中调试服务结构DNX/asp.net 5无状态服务
- 4. 服务结构有状态OData服务
- 5. 服务结构无状态服务行为
- 6. 如何调试服务结构有状态服务/参与者状态
- 7. 自动缩放服务结构无状态服务?
- 8. 微软服务结构有状态服务将无法启动
- 9. 是否在Azure服务结构中提供服务无状态或有状态
- 10. 在服务项目外访问服务结构无状态服务配置值
- 11. 测试取决于$状态的服务
- 12. 服务结构 - 调用有状态服务的命名分区
- 13. Azure服务结构:无法运行本地服务结构簇
- 14. 使用持续集成服务器执行Django单元测试
- 15. 服务结构参与者状态
- 16. 服务结构使用单个数据库持久服务的状态服务
- 17. WCF服务的“快速”集成测试
- 18. Web服务和XHR的集成测试
- 19. 外部Web服务的集成测试
- 20. 服务结构 - 有状态服务持久性
- 21. 服务结构有状态服务远程处理V2
- 22. 服务结构有状态服务分区 - 分布很好
- 23. 如何将我们的服务器与swagger集成来测试虚拟数据?
- 24. 如何进行dropwizard服务器资源的集成测试?
- 25. 集成测试使用尤里卡服务的Spring Boot服务
- 26. 服务结构Asp.Net核心无状态服务上的HTTP和HTTPS端点
- 27. 无状态/有状态服务OnPre。 OnPost服务方法| Azure的服务织物
- 28. 服务结构容器 - 无法访问集群内的服务
- 29. 服务Fabric群集状态“升级服务无法访问”
- 30. 服务结构反向代理服务器有状态服务端口设置
如果您的无状态Web API使用Fabric传输与集群中的其他服务进行通信,或尝试使用CodePackageActivationContext读取服务的配置(例如连接字符串),那么集成测试将失败,除非您允许某种形式的模拟这些依赖关系,或者实际上是在真正的集群上运行集成测试。 – yoape
我认为这是用于集成测试。所以没有什么应该是嘲笑。 – alltej
在这种情况下,您唯一的选择就是在真正的集群上运行测试,在这种情况下,您的测试将涉及自动部署到集群,填充一些已知数据状态并推动与服务交互的某种形式。是的,在这种情况下可以这样运行,但可能需要很多工作。在这种情况下,可以使用[''FabricClient.TestManagementClient''](https://docs.microsoft.com/zh-cn/dotnet/api/system.fabric.fabricclient.testmanagementclient)来设置所需的数据状态。 – yoape