介面測試進階篇
1、準備工作
a、本機已配置好Python 3.X開發環境。開發工具推薦PyCharm
b、安裝requests庫,命令:pip install requests。
c、準備好要測試介面的相關資訊:請求url,header,body等。
本次測試使用的介面是使用Django框架開發的簡單介面,header為空,不涉及cookie,實際的介面測試過程中header一般不為空。
2、編寫介面測試程式碼
以post請求為例,測試程式碼如下:
1 #coding:utf-8 2 #匯入request庫 3 importrequests 4 #請求URL 5 url = "http://127.0.0.1:8089/login/" 6 #請求資料 7 data = { 8"username":"stephen", 9"password":123456 10 } 11 #傳送請求,一般還需要提供header資訊,此處為demo,暫不關注 12 reponse1 = requests.post(url=url,data=data) 13 res_json = reponse1.json() 14 print(res_json) 15 flag =reponse1.status_code == 200and res_json["status"] == 200and res_json["msg"]=="login sucesss" 16 #假如http code為200,status為“200” msg為“login sucesss”則測試通過 17 if flag: 18print("pass") 19 else: 20print("fail") postRequestDemo
執行結果:
以get介面為例,測試程式碼如下:
1 #coding:utf-8 2 #匯入request庫 3 importrequests 4 #請求URL 5 url = "http://127.0.0.1:8089/login?username=vicent&tel=15209876533" 6 res = requests.get(url=url) 7 print(res.json()) requestGetDemo
執行結果:
3、優化
上面的程式碼雖然實現了介面自動化,但是程式碼不可複用。GET請求傳送使用的是方法:requests.get,POST請求傳送使用的是方法:requests.psot。
可以編寫一個函式,傳入請求的型別是GET,還是POST或者其它的型別。
1 #coding:utf-8 2 #匯入request庫 3 importrequests 4 def http_run(method,url,data=None,headers=None): 5if method == "GET": 6res = requests.get(url=url,data=data,headers=headers) 7else: 8res =requests.post(url=url,data=data,headers=headers) 9return res 10 11 #case1 psot 12 url = "http://127.0.0.1:8089/login/" 13 data = { 14"username":"stephen", 15"password":123456 16 } 17 #傳送請求 18 res = http_run("POST",url=url,data=data) 19 #校驗結果 20 21 assert res.json()["status"] == 200 22 #case2 get 23 #傳送請求 24 url1 = "http://127.0.0.1:8089/login?username=vicent&tel=15209876533" 25 res1= http_run("GET",url=url1) 26 #校驗結果 27 assert res1.json()["tel"] =="15209876533"
4、引入unittest單元測試框架管理用例
先將上面優化過的http_run方法,抽象成一個class,方便後續呼叫。
1 import requests 2 class http_run: 3def http_run(self,method,url,data=None,headers=None): 4if method == "GET": 5res = requests.get(url=url,data=data,headers=headers) 6else: 7res =requests.post(url=url,data=data,headers=headers) 8return res
1 #匯入unittest包 2 import unittest 3 #定義一個class http_test,繼承於unittest.TestCase 4 class http_test(unittest.TestCase): 5#在每個測試用例執行前執行的方法 6def setUp(self): 7print("run before test case") 8#例項化 http_run 9self.run = http_run() 10 11#測試用例,必須以test開頭 12def test_get(self): 13url1 = "http://127.0.0.1:8089/login?username=vicent&tel=15209876533" 14res = self.run.http_run("GET",url1) 15print(res.json()) 16self.assertEqual(res.json()["tel"],"15209876533") 17def test_post(self): 18url = "http://127.0.0.1:8089/login/" 19data = { 20"username":"stephen", 21"password":123456 22} 23res = self.run.http_run("POST",url,data) 24print(res.json()) 25self.assertEqual(res.json()["status"],200) 26#在每個測試用例執行後執行的方法 27def tearDown(self): 28print("run after test case") 29 if__name__ == "__main__": 30#建立測試套 31suite = unittest.TestSuite() 32#往測試套中新增用例 33suite.addTest(http_test("test_get")) 34suite.addTest(http_test("test_post")) 35runner = unittest.TextTestRunner() 36#執行測試用例 37runner.run(suite)
執行結果:
unittest除了用於寫單元測試外,還可以完成介面自動化,基於unittest可以完成介面自動化框架的開發。