1. 什么是mock?
在軟件測試過程中,對於一些不容易構造、獲取的對象,用一個虛擬的對象來替代它,以達到相同的效 果,這個虛擬的對象就是Mock。
在前后端分離項目中,當后端工程師還沒有完成接口開發的時候,前端開發工程師利用Mock技術,自 己用mock技術先調用一個虛擬的接口,模擬接口返回的數據,來完成前端頁面的開發。
其實,接口測試和前端開發有一個共同點,就是都需要用到后端工程師提供的接口。所以,當我們做接 口測試的時候,如果后端某些接口還不成熟、所依賴的接口不穩定或者所依賴的接口為第三方接口、構 造依賴的接口數據太復雜等問題時,我們可以用mock的方式先虛擬這些接口返回來代替。提高工作效 率。
2. moco介紹
實現mock的技術很多,這些技術中,可以分為兩類,mock數據和mock服務: mock數據:即 mock 一個對象,寫入一些預期的值,通過它進行自己想要的測試。常見的有: EasyMock、Mockito 、WireMock、JMockit。主要適用於單元測試。 mock 服務:即mock 一個 sever,構造一個依賴的服務並給予他預期的服務返回值,適用范圍 廣,更加適合集成測試。如 moco框架。
Moco 是類似一個 Mock 的工具框架,一個簡單搭建模擬服務器的程序庫/工具,下載就是一個JAR包。 有如下特點:
只需要簡單的配置 request、response 等即可滿足要求 支持 http、https、socket 協議,可以說是非常的靈活性 支持在 request 中設置 Headers , Cookies , StatusCode 等 對 GET、POST、PUT、DELETE 等請求方式都支持
無需環境配置,有 Java 環境即可 修改配置后,立刻生效。只需要維護接口,也就是契約即可 支持多種數據格式,如 JSON、Text、XML、File 等 可與其他工具集成,如 Junit、Maven等
3. 下載moco
我們可以直接去github上獲取moco的jar包,當前版本是:V1.1.0。
地址:https://github.com/dreamhead/moco 這里展示了關於moco的介紹和源碼,我們可以點擊箭頭 處直接下載它的jar包。
下載完成后:
4. 配置json文件
我們需要先編輯一個json文件,用來模擬不同的請求,返回不同的響應。 新建一個文件,格式改為json,然后打開這個文件進行編輯。如下
[{ "description":"demo", "request":{ "uri":"/demo" }, "response": { "text":"Hello,demo" } }]
其中
description是注釋(描述),由於json無法寫注釋,所以提供了用這個key
uri就是我們這個接口的統一資源標識符,可以根據模擬的接口自行定義
response里的內容即為返回的值
這是一個非常簡單的mock
5. 啟動moco
moco項目是采用java開發的,所以啟動moco前,需要安裝jdk。如果以前安裝過的,請忽略!!!
首先:把我們下載下來的moco的jar包和剛剛編輯好的json文件放到同一個文件夾路徑下,如圖:
然后在該路徑下打開cmd命令行
在該路徑下,輸入cmd,按回車,彈出命令行.
輸入命令:java -jar moco-runner-1.1.0-standalone.jar http -p 9090 -c test.json
其中
jar包的名稱可根據自己下載的jar包版本來寫
http代表這個模擬的是http請求
-p 9090定義是端口號
-c test.json 是我們編輯的那個json文件名。
執行命名后,如圖:
此時我們mock的服務以及啟動成功了,相當於在我們本地的9090端口上啟動的,所以我們可以通過瀏覽 器訪問一下localhost:9090/demo 來看看返回的結果,注意,這里/demo就是我們在json文件中定義的 uri
如圖,我們訪問后得到了json文件中編輯的返回值。以上我們就完成了用moco來幫助我們生成mock
6. 配置不同的請求
Demo1:約定URI
[{ "description":"demo1=約定URI", "request":{ "uri":"/demo1" }, "response":{ "text":"Hello,demo1" } }]
Demo2:約定請求參數
[{ "description":"demo2=約定請求參數", "request":{ "queries":{ "key1":"abc", "key2":"123" } }, "response":{ "text":"Hello,demo2" } }]
3.Demo3:約定請求方法
[{ "description":"demo3=約定請求方法", "request":{ "method":"DELETE" }, "response":{ "text":"Hello,demo3" } }]
因為換了請求方法,所以在postman里請求
4.Demo4:約定請求頭
[{ "description":"demo4=約定請求頭", "request":{ "method":"POST", "headers":{ "Content-Type":"application/xml" } }, "response":{ "text":"Hello,demo4" } }]
5.Demo5:約定請求體參數-form
[{ "description":"demo5=約定請求體參數-form", "request":{ "forms":{ "key1":"abc" } }, "response":{ "text":"Hello,demo5" } }]
6.Demo6:約定請求體參數-json
[{ "description":"demo6=約定請求體參數-json", "request":{ "json":{ "key1":"value1", "key2":"value2" } }, "response":{ "text":"Hello,demo6" } }]
7.Demo7:uri-startsWith匹配 :
[{ "description":"demo7=uri-startsWith匹配", "request":{ "uri":{ "startsWith":"/sq" #只要地址里以sq開頭就可以 } }, "response":{ "text":"Hello,demo7" } }]
8.Demo8:uri-endWith匹配
[{ "description":"demo8=uri-endsWith匹配", "request":{ "uri":{ "endsWith":"sq" #以sq結尾 } }, "response":{ "text":"Hello,demo8" } }]
9.Demo9:uri-contain包含
[{ "description":"demo9=uri-contain匹配", "request":{ "uri":{ "contain":"fcl" } }, "response":{ "text":"Hello,demo9" } }]
10.Demo10:返回狀態碼
[{ "description":"demo10=響應狀態碼", "request":{ "uri":"demo10" }, "response":{ "status":200 } }]
11.Demo11:返回響應頭
[{ "description":"demo11=響應頭", "request":{ "uri":"demo11" }, "response":{ "headers":{ "Content-Type":"application/json" } } }]
12.Demo12:重定向
[{ "description":"demo12=重定向", "request":{ "uri":"demo12" }, "redirectTo":"http://www.baidu.com" }]
重定向直接跳轉到了百度頁面
13.Demo13:返回JSON格式的數據
[{ "description":"demo13=返回json格式的數據", "request":{ "uri":"/demo13" }, "response":{ "json":{"key1":"value1","key2":"value2"} } }]
7. moco總結
Moco還可以通過在json文件中添加cookies、header、重定向這些參數,來模擬各種情況下的請求和
返回值,可以根據自己工作的需求去對這些東西進行了解。
Moco是熱更新的,所以啟動了jar包的服務之后,即使修改了json文件中的內容,也不需要重啟服務就
生效。
掌握了mock測試的技術,可以讓我們在開發沒有完成對應接口的時候,有接口文檔就提前進入到測試
狀態,是現在敏捷模式下不可或缺的技術,也是持續集成中一個重要的組成部分