接口測試07-接口自動化測試-cookie,session


1 接口自動化測試

1.1 概念

接口自動化測試: 以程序代替人工驅動的接口測試

1.2 實現方式

  • 工具: Jmeter、POSTman....

  • 編碼: Python、Java....

1.3 比較

  • 工具

    • 優點: 上手快,效率高

    • 缺點: 定制化實現較為復雜(以加密為例:1.開發編寫加密算法導出jar包 2.測試需要集成jar包,還需要編碼調用jar包實現)

  • 編碼

    • 優點: 定制化需求實現流程比工具簡單,靈活性更強

    • 缺點: 不易上手(需要有一定的編程基礎),需要自實現常用功能(效率偏低)

  • 注意

    1. 面試時,自動化測試可能專指編碼實現的自動化方案

    2. 面試時,自動化測試語言不同,怎么答? 思想和流程都是相通的

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)

2.5 基本實現請求-PUT

"""
    以 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)

2.6 基本實現請求-DELETE

"""
    訪問學生管理系統:
        根據指定的 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)

2.7 基本實現響應-response

"""
    響應由行頭體三部分組成,在響應結果中如何提取行頭體數據
"""
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"))

2.8 登錄案例之 Cookie

需求:使用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"},非 JSON 提交

"""
    需求: 使用 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())

 

2.9 登錄案例之 Session

"""
    場景: 獲取 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()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM