Python3簡易介面自動化測試框架設計與實現(上)
- 2019 年 12 月 12 日
- 筆記
來源:http://www.51testing.com
目錄
1、開發環境
2、用到的模組
3、框架設計 ?3.1、流程
3.2、項目結構
5、日誌列印
6、介面請求類封裝
1、開發環境
作業系統:Ubuntu18
開發工具:IDEA+PyCharm插件
Python版本:3.6
2、用到的模組
requests:用於發送請求
xlrd:操作Excel,組織測試用例
smtplib,email:發送測試報告
logging:日誌追蹤
json:數據格式化
Django:介面開發
configparser:讀取配置文件
3、框架設計
3.1、流程

介面用例是通過Excel來組織的,定義了URL,Request Body等列。執行流程如下:
使用xlrd工具讀取Excel中的資訊,拼接成一個個完整的請求。
介面請求類拿到一個個完整的請求的去執行,這個過程需要記錄日誌,每一次執行情況都要有跡可循。
回填測試結果,發送郵件,歸檔每次的運行結果。更好一點的做法是把歷史運行情況做個報表,更直觀。
優點:
用例通過Excel來組織,不需要編寫程式碼,上手難度小。
在用例個數不是很多的情況,開發速度快。
缺點:
用例依賴是痛點。
只能支援介面自動化用例。
Excel中用例無法預先檢查正確性,只有跑一把才能知道。
無法很好地管理大量用例,且不支援團隊協同作業,個人用來回歸測試或上線後的冒煙測試會是一個不錯的選擇。
通過優缺點的對比,可以明顯發現這個框架的硬傷其實很多了。所以無論是業界開源的自動化測試框架或企業自研的還沒有見過用Excel來組織用例的。值得一提的是個別企業自研的自動化框架非常難用,抑或是把一堆工具簡單組合到一起。根本無法提高團隊的生產力。不過好的產品也不是一蹴而就的,需要一個持續優化的過程。所以上面用Excel組織用例的框架還是值的玩一玩的,暫且命名為apitest吧。目前比較好的自動化測試框架有unittest,testng,pytest等。
3.2、項目結構

testcase:存放測試用例或請求的json文件。
config:配置文件。
report:測試報告和日誌文件及其歸檔。
untils:工具集,send_request用來發送請求,email_tool用來發送郵件,excel_tool用來讀取Excel中的數據,check_result用來校驗結果,run_main用例執行入口,log_trace用來追蹤日誌。
5、日誌列印
採用內置logging模組才記錄運行日誌,設置日誌級別。
log_trace.log:
import logging filename = "../report/test_case_run.log" logging.basicConfig(level=logging.INFO, format='%(asctime)s %(levelname)s1 %(filename)s [line:%(lineno)d] %(message)s', datefmt='%a, %d %b %Y %H:%M:%S', filename=filename, filemode='w') |
---|
6、介面請求類封裝
安裝第三方模組requests
pip install requests |
---|
定義函數send_request,根據傳入的方法類型分別去調用request的get,post,delete,put等方法去發送請求。send_request.py:
import requests from untils. log_trace import * #發送get請求 def get_request(url,data=None,headers=None): res = requests.get(url=url,data=data,headers=headers) return res #發送post請求 def post_request(url,data,headers=None): res = requests.post(url=url,data=data,headers=headers) return res #發送delete請求 def del_request(url,data=None,headers=None): res = requests.delete(url,data=data) return res #發送put請求 def put_request(url,data,headers=None): pass def send_request(method,url,data=None,headers=None): try: logging.info(headers) if headers: if method == "GET": return get_request(url,data,headers=headers) if method == "POST": return post_request(url,data=data,headers=headers) if method == "DELETE": return del_request(url,data=data,headers=headers) #put使用頻率低,暫時不寫 if method == "PUT": return put_request(url,data=data,headers=headers) else: logging.info("Header is null") except Exception as e: logging.info("send request fail:%s"%e) |
---|
在untils_test.py中編寫程式碼測試send_request方法,程式碼如下:
#coding:utf-8 from untils.send_request import send_request def test_send_request(): url="http://127.0.0.1:9000/articles/" headers = { "X-Token":"0a6db4e59c7fff2b2b94a297e2e5632e" } res = send_request("GET",url,headers=headers) print(res.json()) if __name__ == "__main__": test_send_request() |
---|
運行結果:
/usr/bin/python3.6 /home/stephen/IdeaProjects/apitest/untils/untils_test.py {'status': 'BS.200', 'all_titles': {'amy1': 'alive', 'modifytest': 'alive', 'addTest': 'alive'}, 'msg': 'query articles sucess.'} Process finished with exit code 0 |
---|
星雲測試
http://www.teststars.cc
奇林軟體
http://www.kylinpet.com
聯合通測
http://www.quicktesting.net