[英]How we can perform integration test on service fabric (stateless service)?
我想在服務架構中對無狀態服務進行集成。請幫我解決這個問題。 我創建了像c#web api這樣的無狀態服務。
為了對您的可靠服務執行集成測試,您需要模擬和處理許多依賴項。 您將無法以這種方式測試服務的所有情況或行為, 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
或服務清單中的任何設置(如此答案中所示)您在哪里設置和訪問服務結構的每個環境的運行時配置參數? )。 在這種情況下,您需要將其替換為您自己的可模擬版本,並且您還需要在構造函數中注入它。 您在大多數示例中找到的是對服務上下文的調用,如下所示:
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。模擬包含用於測試的模擬,但如果您真的想要運行集成測試而不僅僅是單元測試,則可能需要更改代碼。
使用常規api對無狀態web api進行集成測試沒有區別。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.