提示:我們上一篇文章介紹了什麼是Moco框架,以及Moco框架的啟動方式。本篇文章主要說說如何使用Moco框架來輔助我們進行測試。
當需要呼叫介面來編寫測試用例的時候,此時該介面並沒有被實現,這個時候我們就可以用Moco框架來模擬一個介面出來。
使用Moco模擬介面以下功能:
- 攔截服務:
http
,https
。 - 請求方式:GET,POST。
- 模擬請求地址:URL。
- 模擬引數:包括
header
和cookie
的資料。 - 模擬響應結果。
- 支援重定向。
1、Moco框架第一個練習
編寫一個Json檔案,介面所有的資訊都配置在該json檔案中。
[
{
"description": "第一個Moco框架例子。", # 描述:增加介面的可讀性
"request": {
"uri": "/api/moco/demo",
},
"response": {
"text": "hello Moco !"
}
}
]
把Moco框架的jar包和上面編輯好的Json檔案放在同一個資料夾中。
在cmd命令列或者PyCharm的命令列終端執行啟動命令。
- 進入Json檔案的所在目錄。
- 執行命令:
java -jar ./moco-runner-0.12.0-standalone.jar http -p 12306 -c test.json
Moco服務啟動後,我們可以使用Requests庫請求介面,也可以用瀏覽器介面。
# 1.匯入requests庫
import requests
# 2.明確請求地址
url = "http://127.0.0.1:12306/api/moco/demo"
# 3.傳送請求
response = requests.get(url=url)
print(response.text)
瀏覽器訪問介面:
2、Get方法的Mock實現
我們主要是看Json檔案怎麼寫,其他步驟和上面練習一樣。
(1)沒有引數的get請求
[
{
"description": "模擬一個沒有引數的get請求。",
"request": {
"uri": "/api/moco/get/demo",
"method": "get" # 這裡新增了要給method屬性
},
"response": {
"text": "hello get request !"
}
}
]
(2)有引數的get請求
[
{
"description": "模擬一個沒有引數的get請求。",
"request": {
"uri": "/api/moco/get/demo",
"method": "get"
},
"response": {
"text": "hello get request !"
}
},
{
"description": "模擬一個帶引數的get請求。",
"request": {
"uri": "/api/moco/get/param/demo",
"method": "get",
"queries": { # get請求引數的選項,queries固定屬性。
"name": "xiaoming",
"age": "18"
}
},
"response": {
"text": "hello xiaoming !"
}
}
]
說明:請求地址為:
http://127.0.0.1:12306/api/moco/get/param/demo?name=xiaoming&age=18
3、Post方法的Mock實現
(1)沒有引數的post請求
[
{
"description": "模擬一個不帶資料的post請求。",
"request": {
"uri": "/api/moco/post/demo",
"method": "post"
},
"response": {
"text": "hello post request !"
}
}
]
提示:POST請求就不能用瀏覽器進行檢視了。只能用Request庫或者JMeter,Postman等進行檢視。(能進行介面呼叫的工具都可以)
# 1.匯入requests庫
import requests
# 2.明確請求地址
url = "http://127.0.0.1:12306/api/moco/post/demo"
# 3.傳送請求
response = requests.post(url=url)
print(response.text)
(2)有引數的post請求
[
{
"description": "模擬一個帶資料post請求。",
"request": {
"uri": "/api/moco/post/param/demo",
"method": "post",
"forms": { # post請求帶引數,引數要新增到forms屬性中。
"name": "xiaoming",
"age": "18"
}
},
"response": {
"text": "hello post xiaoming !"
}
}
]
呼叫介面檢視結果,如下所示:
# 1.匯入requests庫
import requests
# 2.明確請求地址
url = "http://127.0.0.1:12306/api/moco/post/param/demo"
data = {
"name": "xiaoming",
"age": "18"
}
# 3.傳送請求
response = requests.post(url=url, data=data)
print(response.text)
4、請求中加入Cookies
使用的是request
中的cookies
屬性。
(1)get請求
[
{
"description": "模擬一個帶cookie的get請求。",
"request": {
"uri": "/api/moco/get/cookies/demo",
"method": "get",
"cookies": { # 這裡新增cookies引數
"login": "true"
}
},
"response": {
"text": "hello get cookies !"
}
}
]
呼叫介面檢視結果,如下所示:
# 1.匯入requests庫
import requests
# 2.明確請求地址
url = "http://127.0.0.1:12306/api/moco/get/cookies/demo"
cookies = {
"login": "true"
}
# 3.傳送請求
response = requests.get(url=url, cookies=cookies)
print(response.text)
(2)post請求
[
{
"description": "模擬一個帶cookie的post請求。",
"request": {
"uri": "/api/moco/post/cookies/demo",
"method": "post",
"cookies": {
"login": "true"
},
"json": { # post請求的引數也可以用json格式的資料進行傳輸
"name": "xiaoming",
"age": "18"
}
},
"response": {
"status": 201,
"json": {
"text": "hello post cookies !"
}
}
}
]
呼叫介面檢視結果,如下所示:
# 1.匯入requests庫
import requests
# 2.明確請求地址
url = "http://127.0.0.1:12306/api/moco/post/cookies/demo"
cookies = {
"login": "true"
}
json = {
"name": "xiaoming",
"age": "18"
}
# 3.傳送請求
response = requests.post(url=url, json=json ,cookies=cookies)
print(response.text)
5、請求中加入Header
使用的是request
中的headers
屬性。
Header
是新增請求頭資訊,關於請求頭資訊get請求和post請求都是一樣的。
[
{
"description": "模擬一個帶Header的post請求。",
"request": {
"uri": "/api/moco/post/headers/demo",
"method": "post",
"headers": { # 新增請求頭資訊
"content-type": "application/json"
},
"json": {
"name": "xiaoming",
"age": "18"
}
},
"response": {
"status": 201,
"json": {
"text": "hello get Headers !"
}
}
}
]
呼叫介面檢視結果,如下所示:
# 1.匯入requests庫
import requests
# 2.明確請求地址
url = "http://127.0.0.1:12306/api/moco/post/headers/demo"
headers = {
"content-type": "application/json"
}
json = {
"name": "xiaoming",
"age": "18"
}
# 3.傳送請求
response = requests.post(url=url, json=json, headers=headers)
print(response.text)
6、Moco模擬重定向
重定向使用的是和request
同級的redirectTo
屬性。
[
{
"description": "重定向到百度",
"request": {
"uri": "/api/moco/redirect/demo",
"method": "get"
},
"redirectTo": "http://www.baidu.com"
},
{
"description": "重定向到自己的介面",
"request": {
"uri": "/api/moco/redirect/new/demo",
"method": "get"
},
"redirectTo": "http://www.baidu.com",
"response": {
"text": "hello redirectTo !"
}
}
]
使用瀏覽器進行測試就可以。
還有更多的使用方式請檢視文件:https://github.com/dreamhead/moco/blob/master/moco-doc/apis.md
7、綜合練習
Json檔案內容,如下所示:
[
{
"description": "department by dep_id",
"request": {
"uri": "/api/departments/",
"method": "get",
"queries": {
"$dep_id_list": "T001"
}
},
"response": {
"json": {
"count": 1,
"next": null,
"previous": null,
"results": [
{
"dep_id": "T001",
"dep_name": "php學院",
"master_name": "老李",
"slogan": "啦啦啦啦"
}
]
}
}
},
{
"description": "update department by dep_id",
"request": {
"uri": "/api/departments/T03/",
"method": "put",
"json": {
"data": [
{
"dep_id": "T03",
"dep_name": "C++",
"master_name": "C++-Master",
"slogan": "Here is Slogan"
}
]
}
},
"response": {
"status": 201,
"json": {
"dep_id": "T03",
"dep_name": "C++",
"master_name": "C++-Master",
"slogan": "Here is Slogan"
}
}
}
]
8、總結:
(1)Json檔案的配置屬性說明:
像我們上面練習過的Json檔案配置,所有的資料值是固定的,
如:description
、request
、response
、redirectTo
等這些都是固定的,不能修改,修改可能連Moco服務都啟動不來。
還有request
的屬性值,如:uri
、method
、cookies
、headers
,也是必須這樣寫的。
還有GET請求傳遞引數用queries
屬性,POST請求傳遞引數用forms
和json
屬性都可以。(PUT,DELETE請求同Post請求。)
(2)Moco框架原理:
就是把所有介面的資料,包括髮送請求的所有資料和返回結果的所有資料,以Json資料格式進行編寫。
把這些資料放入Moco框架提供的HTTP或者HTTPS的服務上,就實現了介面資料的模擬。
在使用的時候,我們只要按照json檔案中介面配置的資訊進行請求即可,如果呼叫介面傳遞的資料和Json檔案中介面編寫要接收的資料不一致,則無法請求成功。