之前學習了使用jmeter+ant做介面測試,並實現了介面的批量維護管理(大概500多條用例),對“介面”以及“介面測試”有了一個基礎瞭解,最近找了一些用python做介面測試的資料,一方面為了學習下如何使用python進行介面測試(如何做出一個簡單基礎的介面測試框架),另一方面也為了鍛鍊下如何用python寫程式碼(接觸python也有一段時間了,但是每次自己程式設計總有種提筆忘字的感覺,真是欠練!!)
首先,用python做介面測試,主要用到就是requests庫和json庫。
1.先看一個簡單的demo
1 # -*- coding: UTF-8 -*- 2 import requests 3 get_url = 'http://localhost:7001/XXX' 4 data = {'userCode':'csqy123456','userPWD':'123456'} 5 r = requests.get(url=get_url, params=data, timeout=5) #產生一個名為r的Response物件,可以從這個物件中獲取我們想要的資訊; #get請求傳引數時,使用params關鍵字 #timeout引數用來設定停止等待響應的時間 6 print(r.url) #返回請求url 7 print(r.json()) #以JSON格式解析響應內容 8 print(r.status_code) #返回狀態碼 9 print(r.raise_for_status()) #如果傳送了一個錯誤請求,如404、500等,可以通過raise_for_status()來丟擲異常 10 print(r.encoding) #檢視requests使用了什麼編碼,同時可以用r.encoding屬性來改變它 11 print(r.raw) #獲取來自伺服器的原始套接字響應 12 print(r.headers) #伺服器返回給我們的響應頭資訊,也可以在傳參時通過headers=XXX來定製請求頭 13 print(r.request) #獲取原來建立的Request物件 14 print(r.request.headers) #傳送到伺服器的請求頭
1 # -*- coding: UTF-8 -*- 2 import requests 3 post_url = 'http://localhost:7001/XXX' 4 data = {'approveSeq':'6610','userCode':'qyzh123456_88','projName':'測試專案'} 5 r = requests.post(post_url, data=payload2, timeout=1) #get請求傳引數時,使用data關鍵字
6 print(r.json()) 7print(r.status_code)
2.然後通過函式呼叫來傳送get/post請求
# -*- coding: UTF-8 -*- import requests def send_get(url, data): """ 定義send_get函式,用來接收引數,傳送get請求 """ r = requests.get(url=url, params=data) result = r.json() return result def send_post(url, data): """ 定義send_post函式,用來接收引數,傳送post請求 """ r = requests.get(url=url, data=data) result = r.json() return result def main(url, method, data): """ 定義一個主函式,根據method是get或post,來呼叫send_post()或send_get() """ if method == 'POST': r = send_post(url, data) # 如果是POST請求,則呼叫send_post() else: r = send_get(url, data) # 如果是GET請求,則呼叫send_get() return r # 將結果返回出去 url = 'http://localhost:7001/XXX' data = { 'controlSeq': '2018118325' } demo = main(url, 'GET', data) print(demo)
3.定義一個類,對post請求和get請求進行封裝
run_method.py
# -*- coding: UTF-8 -*- import requests import json class RunMain: """含有構造器""" def __init__(self, url, method, data=None): self.t = self.run_main(url, method, data) def send_post(self, url, data): r = requests.post(url=url, data=data) result = r.json() return json.dumps(result, indent=2, sort_keys=False, ensure_ascii=False) def send_get(self, url, data): r = requests.get(url=url, params=data) result = r.json() return json.dumps(result, indent=2, sort_keys=False, ensure_ascii=False) # 利用json.dumps將響應資料進行json格式的編碼解析 # indent=2將輸出結果縮排2個字元顯示 # sort_keys=False,輸出結果是否按照關鍵字排序 # json.dumps 序列化時對中文預設使用的ascii編碼,ensure_ascii=False才會輸出中文 # return result def run_main(self, url, method, data=None): if method == 'GET': r = self.send_get(url, data) else: r = self.send_post(url, data) return r if __name__ == '__main__': url = 'http://localhost:7001/XXX' data = { 'controlSeq': '2018118325' } test = RunMain(url, 'GET', data) # 因為有構造器 __init__,例項化時要帶引數 print(test.t)
run_method.py
# -*- coding: UTF-8 -*- import requests import json
class RunMain: """無構造器""" def send_get(self, url, data): res = requests.get(url=url, params=data).json() return res def send_post(self, url, data): res = requests.post(url=url, data=data).json() return res def run_main(self, url, method, data=None): res = None if method == 'GET': res = self.send_get(url, data) else: res = self.send_post(url, data) return res if __name__ == '__main__': url = 'http://192.168.0.53:7001/CommonService/api/control/controlProgress/query.v' data = { 'controlSeq': '2018118325' } run = RunMain() # 先例項化,例項化時不需要帶引數 print(run.run_main(url, 'GET', data))
ps.建議在封裝執行方法類時,不要加構造器,這樣就不需要在例項化時傳參,在後面的主函式中從excel中取出引數後再傳給類中的方法即可
下面是json.dumps使用前後的對比圖
第一目的內容到此結束,一方面簡單介紹下requests的用法,另一方面將post和get請求進行基本封裝,通過例項化物件進行呼叫