Categories
程式開發

攜程Mock本地化實踐


一、引言

這裡說的Mock指的是系統測試或者接口測試場景下,模擬被依賴的其他服務接口進行響應返回的工具。測試人員通過服務接口級Mock的手段隔絕真實外部依賴,創造可控、穩定的測試運行環境,以提升問題的查全率和查准率。

然而,隨著業務的發展和微服務化的進程,我們系統的結構越發的龐雜,Mock工具的實際效果開始變得差強人意。這裡給大家分享我們遇到的挑戰以及解決思路。

二、問題的出現

隨著業務發展和微服務化進程,系統結構越發龐雜。服務化場景下使用Mock,有兩個問題開始浮現出來。

1)工作串擾,啟用Mock影響其他應用的測試工作

理想中的場景:

攜程Mock本地化實踐 1

操作註冊中心,使依賴指向Mock服務。

現實中的場景:

攜程Mock本地化實踐 2

通過註冊中心切換被測應用的依賴指向到Mock服務的動作,同樣會影響到環境中其他應用的依賴指向,引發串擾(上圖中應用B受到影響)。

PS:有被問及為何不調整被測應用的代碼或者配置指向目標Mock,避免串擾其他應用。這種入侵代碼的手段是下策。常在河邊走哪有不濕鞋,總會有忘記改回來造成生產事件的時候的。

2)生效延遲

Mock的生效依賴註冊中心的服務註冊生效過程。由於緩存的存在,實際的生效時間是無法確定的,存在幾秒到幾分鐘的延時。

對於功能測試場景而言,這些延時並無大礙,而在接口自動化測試場景中,這些延時將導致結果的不穩定性激增。為了避免延時帶來的不確定性,通常會在測試框架中添加隱式等待的機制,重試調用被測接口,直到期望結果的出現,或者在達到最大等待時間後拋出異常。這麼做的代價是測試執行效率的犧牲。在case數量很大時,這累計起來的等待時間就讓人有些痛苦了。

現在問題比較清楚了,由於Mock的生效過程依賴服務架構中的“註冊中心”,所以導致了Mock的串擾和延遲的出現。看著不是大問題,但確實用著不舒服。抽像一點說就是,“測試的過程依賴了被測系統的一個基礎組件,造成測試執行穩定性的下降”。

三、解決思路

1)Mock 邊車化,為應用提供本地化的Mock,使Mock同具體服務架構解耦。 Mock一對一服務被測應用,以隔絕多應用間串擾的可能。

2)Mock 的啟用和斷開,通過控制被測應用所在JVM代理相關係統變量進行。即Mock的存在對應用透明,不依賴服務架構也不侵入應用代碼和配置。

下圖展示了應用與Mock的概要部署關係:

攜程Mock本地化實踐 3

解決方案概述

上述問題的解決方案由四部分組成——servlet agent、本地 Mock代理、Mock server、Mock 配置客戶端。

  1. servlet agent(開關):設置被測應用所在JVM的網絡代理相關係統變量,導出應用對外請求,轉發至“本地 Mock代理”。同時提供API供“Mock配置客戶端”調用,以供人員或者腳本控制Mock的鏈接可斷開。就是被測應用Mock與否的熱開關。如圖:

攜程Mock本地化實踐 4

  1. 本地 Mock代理(橋樑):根據自身維護的路由配置轉發請求至Mock server或者原始目標服務器。同時提供API供“Mock配置客戶端”進行路由表的配置。在Mock啟用的狀態下,作為被測應用到Mock服務或者真實依賴之間橋樑。如圖:

攜程Mock本地化實踐 5

  1. Mock server:就是原本意義上的Mock。根據Mock的配置內容進行具體response的返回。市面上也有不少開源的Mock工具可以放在這塊來用,最好選擇提供了API供外部調用進行設置的。這樣跟“Mock 配置客戶端”對接起來工作量就很小了,在方案中的位置如上圖。

  2. Mock 配置客戶端:提供簡單的API,在方案中的問題如上圖。

  • 供測試腳本調用,在測試腳本中直接控制Mock的鏈接,斷開,啟動,停止,和具體Mock的設置。
  • 供GUI工具調用,讓測試人員可以控制Mock行為。

最終對測試腳本暴露出來就是這個“Mock配置客戶端”吐出的具體API。這部分可以發揮想像力,結合具體場景包裝的使用起來方便些就行了。

Mock的開關和配置過程簡圖:

攜程Mock本地化實踐 6

Mock打開時的依賴請求過程簡圖:

攜程Mock本地化實踐 7

四、小結

我們通過使Mock本地化,給Mock加開關(servlet agent),做橋樑(本地Mock代理)的方法解開了Mock工具同服務架構之間的耦合關係,解決了啟用Mock時的串擾和延時問題。

我們發現這個方案存在一定的普適性,未來可以考慮把Mock開關從 JVM層(servlet agent)下降到系統層,那麼也就具備了服務其他語言應用的能力了。

作者介紹

Peter Sun,攜程高級測試經理。

本文轉載自公眾號攜程技術(ID:ctriptech)。

原文鏈接

https://mp.weixin.qq.com/s?__biz=MjM5MDI3MjA5MQ==&mid=2697269453&idx=2&sn=4062e1028d0bedab3ba9b4bc6b044c77&chksm=8376eff9b40166eff5ceeab6aea2be9917e8d5559c4101a28b9cd165b42f9aed16f4b5435d3f&scene=27#wechat_redirect