1.1 概念
接口自動化測試: 以程序代替人工驅動的接口測試
1.2 實現方式
-
工具: Jmeter、POSTman....
-
編碼: Python、Java....
1.3 比較
-
工具
-
優點: 上手快,效率高
-
缺點: 定制化實現較為復雜(以加密為例:1.開發編寫加密算法導出jar包 2.測試需要集成jar包,還需要編碼調用jar包實現)
-
-
編碼
-
優點: 定制化需求實現流程比工具簡單,靈活性更強
-
缺點: 不易上手(需要有一定的編程基礎),需要自實現常用功能(效率偏低)
-
-
注意
-
面試時,自動化測試可能專指編碼實現的自動化方案
-
面試時,自動化測試語言不同,怎么答? 思想和流程都是相通的
-
2 requests庫(重點)
2.1 概念
requests 庫是使用 Python 編寫的,基於 urllib 實現,可以調用該庫的部分 API 直接向服務器發送請求,並接收響應(角色定位: 類似於Jmeter、POSTman、瀏覽器)
2.2 安裝
聯網的前提下,打開命令行,鍵入命令行命令: pip install requests
2.3 基本實現請求-GET
""" 以 GET 方式向服務器發送請求,訪問學生管理系統的查詢學院信息功能 """ # 1. 導包 import requests # 2. 設計接口測試的三要素 # 要素1: URL url = "http://127.0.0.1:8000/api/departments/" # 要素2: 提交的測試數據 myParams = {"$dep_id_list":"T2005N,T2008N"} # 要素3: 發送請求,然后接收響應結果 response = requests.get(url,params=myParams) # 處理結果 print("狀態碼:",response.status_code) print("響應體:",response.text)
2.4 基本實現請求-POST
""" 以 POST 方式訪問服務器,向學生管理系統插入一條學院信息 注意: GET DELETE POST PUT 提交數據是有差異的,一般情況下: GET 和 DELETE 提交的數據都是鍵值對格式,且設置在請求行中 對應的發送請求時: requests.get|delete(url, params=提交的數據) POST 和 PUT 提交的數據既可以是鍵值對格式又可以是JSON格式,且設置在請求體中 對應的發送請求時: 如果提交的是 JSON 數據: requests.put|post(url,json=提交的數據) 如果提交的是鍵值對數據: requests.put|post(url,data=提交的數據) """ # 1. 導包 import requests # 2. 設計三要素 # 要素1: URL url = "http://127.0.0.1:8000/api/departments/" # 要素2: 提交的數據 myJson = { "data": [ { "dep_id":"T02", "dep_name":"Test學院", "master_name":"Test-Master", "slogan":"Here is Slogan" } ] } # 要素3: 響應結果 response = requests.post(url,json=myJson) print("狀態碼:",response.status_code) print("響應體:",response.text)
""" 以 PUT 方式訪問服務器,修改某條學院信息 """ # 1. 導包 import requests # 2. 三要素 # 要素1: URL url = "http://127.0.0.1:8000/api/departments/T02/" # 要素2: 提交的數據 myJson = { "data": [ { "dep_id": "T02", "dep_name": "C++/學院xxx", "master_name": "C++-Master yyyy", "slogan": "Here is Slogan ZZZZZ" } ] } # 要素3: 響應結果 response = requests.put(url,json=myJson) print("狀態碼:",response.status_code) print("響應體:",response.text)
""" 訪問學生管理系統: 根據指定的 id 列表刪除學院信息 """ # 1. 導包 import requests # 2. 設置三要素 # 要素1:URL url = "http://127.0.0.1:8000/api/departments/" # 要素2:id列表,$dep_id_list=8,9,11 myParams = {"$dep_id_list":"T2005N,T2008N"} # 要素3: 發送請求,然后接收響應結果 response = requests.delete(url,params=myParams) print("狀態碼:",response.status_code) print("響應體:",response.text)
""" 響應由行頭體三部分組成,在響應結果中如何提取行頭體數據 """ import requests response = requests.get("http://127.0.0.1:8000/api/departments/") #response = requests.get("http://www.baidu.com") # 響應解析 # 行解析 print("-"*80) print("狀態碼:",response.status_code) print("URL:",response.url) # 頭解析 print("-"*80) print("所有響應頭:",response.headers) print("獲取內容類型:",response.headers.get("Content-Type")) print("獲取cookie:",response.cookies) print("獲取編碼集:",response.encoding) # 體解析 print("-"*80) print("文本顯示響應體:",response.text) print("以字節方式顯示響應體:",response.content) print("以 JSON 方式顯示數據:",response.json().get("next"))
需求:使用requests庫調用TPshop登錄功能的相關接口,完成登錄操作,登錄成功后獲取‘我的訂單’頁面
相關接口:獲取驗證碼:http://localhost/index.php?m=Home&c=User&a=verify GET登錄:http://localhost/index.php?m=Home&c=User&a=do_login POST
我的訂單:http://localhost/Home/Order/order_list.html GET
登錄提交的參數: {"username":"xxxxx","password":"yyyy","verify_code":"zzzz"},
""" 需求: 使用 requests 庫實現 TPShop 的登錄功能 分析: 步驟 1. 先獲取驗證碼(訪問驗證碼接口) 2. 再設置賬號密碼驗證碼訪問登錄接口 框架搭建完畢,但是登錄失敗,為什么? 核心: cookie 1. 第一次發送請求,獲取驗證碼時,相當於第一次去銀行開戶 服務器為客戶端創建了 Session,並將Session的ID以Cookie 的方式響應回了客戶端 2. 第二次訪問時,按道理講,應該提交第一次請求響應的 Cookie,但是實際沒有提交 解決: 1. 從第一次響應中提取出 Cookie(銀行卡) 2. 第二次請求時,提交步驟1提取的 Cookie """ # 1. 導包 import requests # 2. 訪問獲取驗證碼的接口 url = "http://localhost/index.php?m=Home&c=User&a=verify" response = requests.get(url) print(response.status_code) print(response.content) print(response.headers.get("Content-Type")) # 核心1:獲取服務器響應的 Cookie print("獲取所有cookie:",response.cookies) # 獲取指定 Cookie myCookieValue = response.cookies.get("PHPSESSID") print("銀行卡卡號:", myCookieValue) # 3. 訪問登錄接口 # 要素1 url = "http://localhost/index.php?m=Home&c=User&a=do_login" # 要素2 myData = {"username":"13012345678","password":"123456","verify_code":"8888"} # 要素3 # 核心2:提交 Cookie response = requests.post(url,data=myData,cookies={"PHPSESSID":myCookieValue}) print("-"*80) print("狀態碼:",response.status_code) print("響應體:",response.json())
""" 場景: 獲取 Cookie 數據后,后續的每一次請求都需要提交 Cookie,導致代碼高度重復 解決: requests 庫提供了相關的封裝實現,可以自動的提取 Cookie 並提交 Cookie,該封裝體稱之為 Session 注意: requests 庫中的 Session 和 服務器端的 Session 只是重名 服務器端的 Session ---> 保存用戶數據 requests 的 Session -> 封裝 Cookie 調用 優點: 簡化了代碼實現,提高了編寫效率 """ # 1. 導包 import requests # 2. 獲取驗證碼 # 首先,通過 requests 庫獲取一個 Session 對象,然后通過 Session 對象發送請求 session = requests.Session() response = session.get("http://localhost/index.php?m=Home&c=User&a=verify") print(response.status_code) print(response.content) print(response.headers.get("Content-Type")) # 3. 執行登錄 myData = {"username":"13012345678","password":"123456","verify_code":"8888"} response = session.post("http://localhost/index.php?m=Home&c=User&a=do_login",data=myData) print("登錄狀態碼:",response.status_code) print("登錄響應體:",response.json()) # 4.訂單查看 response = session.get("http://localhost/Home/Order/order_list.html") print("訂單響應體:",response.text) # 建議: session 調用完畢,即時銷毀 session.close()
