在如今的軟件開發過程當中,特別是app的部分,須要的不少數據以及內容,都是來自server端的API,可是不能保證前端
在客戶端開發的時候,api在server端已經開發完成,專門等着前端來調用,理想的狀況是前端在開發的時候,已經有人寫java
好了接口,直接調用就能夠了,可是這僅僅是理想的狀況,不少時候,現實老是比理想多一層思考和磨難,若是在前端開發python
的時候,提供api的同窗沒有提供,那麼怎麼辦?等待仍是本身先開發,等待確定是愚蠢的作法,那麼本身開發怎麼來解決git
api提供數據的這個問題,那麼使用mock就能夠很好的解決,什麼是mock?mock簡單的理解就是開發在開發的過程當中,github
須要依賴一部分的接口,可是對方沒有提供或者環境等等狀況,總之是沒有,那麼開發使用mock server本身來mockjson
數據,方便本身正常的進行開發和對編寫的功能進行自測。api
在https://github.com/dreamhead/moco地址中能夠下載到moco-runner-0.12.0-standalone.jar,下載下來app
就是一個jar,在該地址中,做者對這部分有詳細的說明和啓動mock server方法,這裏不在重複的再次說明。下來咱們ide
簡單的編寫一個登陸的,見編寫的login.json字符串,一個是登陸請求,一個是根據車牌查詢停車費的請求:post
[
{
"request":
{
"method":"post",
"uri":"/login",
"json":
{
"username":"admin",
"password":"admin",
"roleID":22
}
},
"response":
{
"file":"login_response.json"
}
},
{
"request":
{
"method":"post",
"uri":"/parkinside",
"json":
{
"token":"asdgfhh32456asfgrsfss",
"vpl":"AJ3585"
}
},
"response":
{
"file":"parkinside.json"
}
}
]
在UI或者接口的自動化測試中,咱們知道在TDD的模式中,對數據進行分離,這樣也是爲了維護的方便,這樣的目的是爲了後期自動化測試用例的擴展性,和它的易維護性。
login_response.json文件的內容:
{
"username":"wuya", "userID":22, "token":"asdgfhh32456asfgrsfss" }
parkinside.json文件的內容:
{
"vplInfo": { "userID":22, "username":"wuya", "vpl":"京AJ3585" }, "Parking time long":"20小時18分鐘", "Parking fee":"20$" }
在運行命令前,最好讓mock server與編寫的login.json文件是在同一個目錄下,見執行的命令:
java -jar moco-runner-0.10.0-standalone.jar http -p 12306 -c login.json
在如上的命令中,java -jar moco-runner-0.10.0-standalone.jar是啓動jar,沒什麼可說的,http表示進行的是http協議,
-p後面跟的是端口號,這裏端口號指的是12306,-c後面跟編寫的json文件,這裏是login.json,見執行如上的命令後出現的
信息(切記無任何的錯誤信息表示OK,若是有錯誤,慢慢的進行檢查錯誤),見截圖:
OK,下來咱們使用postman來驗證下,咱們mock的登陸接口是否是OK的,見postman中填寫的信息,見截圖:
header爲:
下面咱們經過python語言,來對如上的二個接口進行實戰的操做,切記parkinside的接口是在登陸以後才能夠操做的業務,未登陸操做該業務,返回502無效的
token,見實現的代碼:
#!/usr/bin/env python # -*- coding:utf-8 -*- import unittest import requests class MockTest(unittest.TestCase): def setUp(self): self.url='http://localhost:12306' def tearDown(self): pass def test_login(self,url='/login'): '''驗證登陸的接口''' data={ "username":"admin", "password":"admin", "roleID":22 } r=requests.post(self.url+url,json=data) self.assertEqual(r.status_code,200) self.assertEqual(r.json()['username'],'wuya') def getToken(self,url='/login'): '''登陸成功後獲取token''' data={ "username":"admin", "password":"admin", "roleID":22 } r=requests.post(self.url+url,json=data) return r.json()['token'] def test_parkingside(self,url='/parkinside'): '''驗證查詢停車時長接口''' data={ "token":self.getToken(), "vpl":"AJ3585" } r=requests.post(self.url+url,json=data) self.assertEqual(r.status_code,200) self.assertEqual(r.json()['Parking time long'],u'20小時18分鐘') self.assertEqual(r.json()['Parking fee'], u'20$') if __name__=='__main__': unittest.main(verbosity=2)