版本5(模擬行為)
基本上一個功能還算完善的mock server成型了。但這就夠了么?對于要模擬各種場景的測試還遠遠不夠。我們很多接口有回調的功能,我們通常還需要模擬接口超時的情況,而對于一些支付相關的接口經常需要對參數進行加密解密,而且這些情況都需要是可配置的。有沒有發現,前面我們介紹的所有實際上都是mock值。也就是我們設置一些值,然后調用的時候將值返回。但是很多時候我們不僅需要mock值,更要mock行為。這樣我們有了mock server中最核心的組件:命令執行引擎(好牛的名字,其實就那樣)。在設置mock的時候我們不再是設置一個值,而是設置一個預定義命令組合成的流水線(即按照類似下面xml的配置一步一步執行,并且可以將上一步的執行結果傳遞給下一步):
1000
{“ret”:”true”}
{“ret”:”true”}
上面的流水線被命令執行引擎解析執行后就是按順序執行對應的DelayCommand, CallbackCommand以及ReturnCommand命令了,具體命令就不介紹了。采取這種方式給我們mock server帶來了很大的靈活性:只需要簡單的擴展一個子命令,就可以擴充mock server的行為。比如mock某網關接口時需要使用MD5加密,只需要擴展一個MD5Command(下面代碼中的$result表示前一步驟 加密后的結果):
$result
DSL
現在我們的mock不僅可以mock值了,對于各種行為的模擬也得心應手。但是要使用方便,還要提供便于使用的接口。Mock server提供兩類接口:針對自動化測試的DSL,以及針對手工測試使用的管理界面。這里主要介紹這種DSL(因為我們的測試用例是使用xml編寫,轉換成編程語言也很容易):
1000
$result
service是對被mock的服務的描述,比如對于SMTP,我們可以這樣定義: service="smtp:9000"。這個表示在9000端口上監聽smtp協議。而matcher即前面介紹的matcher組件所使用的各種匹配器,用于匹配被測系統調用mock server時傳遞的數據。比如上面的例子表示的就是如果被測系統調用http接口/ticket.jsp,并且參數里包含orderNo則延遲1秒鐘,然后返回一個json值 。
總結
前面幾節介紹了一個比較完善的通用mock server從簡到繁演化的設計思路,希望可以為想要構建類似設施的讀者提供一個參照。
這個mock系統包含兩個主要部分:mock admin和mock server。Mock admin是管理界面,主要提供監控(可以在界面上實時看到被測系統與mock server交互)以及手工測試時的配置界面。 Mock server即前面介紹的主體,其架構如上圖所示。Mock server包含幾個核心組件:協議、extractor、matcher、命令執行引擎、存儲(即mock server中使用的各種數據的存儲)。Mock server提供三類接口:配置、被mock接口(各種服務,通過協議組件提供)、查詢。