在PC端登錄公司的后臺管理系統或在手機上登錄某個APP時,經常會發現登錄成功后,返回參數中會包含token,它的值為一段較長的字符串,而后續去請求的請求頭中都需要帶上這個token作為參數,否則就提示需要先登錄。
這其實就是狀態或會話保持的第三種方式token
。
一. 什么是token
token 由服務端產生,是客戶端用于請求的身份令牌。第一次登錄成功時,服務端會生成一個包含用戶信息的加密字符串token,返回給客戶端并保存在本地,后續客戶端只需要帶上token進行請求即可,無需帶上用戶名密碼。
token原理簡單概括如下:
-
用戶首次登錄成功后,服務端會生成一個token值,服務端會將它保存保存在數據庫中,同時也會將它返回給客戶端;
-
客戶端拿到token值后,保存在本地;
-
后續客戶端再次發送除登錄外的其他請求時,會把保存在本地的token值作為參數一起發送給服務端;
-
服務端收到客戶端的請求后,會拿發送過來的token值與保存在數據庫中的token值進行比較;
-
如果兩個token值相同, 則說明當前用戶處于登錄狀態;
-
如果數據庫中沒有這個token值或者token值已經生效,則需用戶重新登錄。
二. token場景處理
公司某管理后臺系統,登錄后返回token,接著去請求其他接口時請求頭中都需要加上這個token,否則提示請先登錄。
請求該系統的登錄接口如下:
# @author: 給你一頁白紙
# 微信公眾號:測試上分之路import requests
import jsonheaders = {"Content-Type": "application/json;charset=utf8"}
url = "http://127.0.0.1:5000/login"
_data = {"username": "劉德華","password": "123456"
}
res = requests.post(url=url, headers=headers, json=_data).text
print(res)
結果如下:
{"code": 1000, "msg": "登錄成功!", "token": "sh34ljjl08s32730djsh34ljjl08s32730djsh34ljjl08s32730djsh34ljjl08s32730djsh34ljjl08s32730djsh34ljjl08s32730dj"
}
在對扎樣的項目做接口自動化測試時,需要先請求登錄接口拿到token,再去請求別的接口。每次請求其他接口時先請求一次登錄接口,這樣做雖然可行,但這樣不僅會降低自動化的執行效率,而且每次都請求登錄也會對服務器資源造成浪費。
這里介紹如下兩種處理思路。
?自動化測試相關教程推薦:
2023最新自動化測試自學教程新手小白26天入門最詳細教程,目前已有300多人通過學習這套教程入職大廠!!_嗶哩嗶哩_bilibili
2023最新合集Python自動化測試開發框架【全棧/實戰/教程】合集精華,學完年薪40W+_嗶哩嗶哩_bilibili
測試開發相關教程推薦
2023全網最牛,字節測試開發大佬現場教學,從零開始教你成為年薪百萬的測試開發工程師_嗶哩嗶哩_bilibili
postman/jmeter/fiddler測試工具類教程推薦
講的最詳細JMeter接口測試/接口自動化測試項目實戰合集教程,學jmeter接口測試一套教程就夠了!!_嗶哩嗶哩_bilibili
2023自學fiddler抓包,請一定要看完【如何1天學會fiddler抓包】的全網最詳細視頻教程!!_嗶哩嗶哩_bilibili
2023全網封神,B站講的最詳細的Postman接口測試實戰教學,小白都能學會_嗶哩嗶哩_bilibili
1. 思路一
在執行用例之前,先請求登錄接口,并將返回的token值存儲在文件中(如yaml文件),后續請求需要用到token值則從該文件。
python中yaml文件
1,運行接口自動化測試框架,初始化時先請求登錄接口,獲取token值,并寫入指定的yaml文件中。
# @author: 給你一頁白紙
# 微信公眾號:測試上分之路import requests
import json
import yamldef get_token():'''請求登錄接口,獲取token:return:'''headers = {"Content-Type": "application/json;charset=utf8"}url = "http://127.0.0.1:5000/login"_data = {"username": "劉德華","password": "123456"}res = requests.post(url=url, headers=headers, json=_data).textres = json.loads(res)token = res["token"]return tokendef write_yaml(token):'''寫入yaml文件:return:'''t_data = {"token": token}with open("yaml文件路徑", "w", encoding="utf-8") as f:yaml.dump(data=t_data, stream=f, allow_unicode=True)if __name__ == '__main__':token = get_token() # 獲取tokenwrite_yaml(token) # 將token值寫入yaml文件
2,執行測試用例時先讀取yaml文件中token值,并將token加入headers中(也有些是將token放在請求參數中,視被測試項目具體情況而定),再發送請求。
# @author: 給你一頁白紙
# 微信公眾號:測試上分之路import requests
import yaml
import pytest
import jsondef read_yaml():'''讀yaml文件:return:'''with open('yaml文件路徑', 'r', encoding='utf-8') as f:result = yaml.load(f.read(), Loader=yaml.FullLoader)token = result["token"]return tokendef test_check_user():'''查詢個人信息(需要先登錄系統):return:'''# 先從yaml文件中讀取tokentoken = read_yaml()# 再將token添加到請求頭中headers = {"Content-Type": "application/json;charset=utf8","token": token}url = "http://127.0.0.1:5000/users/3"res = requests.get(url=url, headers=headers).text# 返回結果為json格式,轉換為字典res = json.loads(res)# 斷言code是否為1000assert res["code"] == 1000if __name__ == '__main__':pytest.main()
這里僅僅只是舉例說明,而在實際的框架中,我們需要把這些諸如yaml文件的讀寫這樣的函數單獨封裝在某個模塊中,供其他模塊調用,這樣會代碼會更加清晰簡潔。
2. 思路二
利用pytest中的Fixture函數,作用域設置為session,并返回token值,后續測試方法/函數調用該Fixture函數。
pytest中Fixture的使用請參考我之前的文章pytest(6)-Fixture(固件)。
1,首先,在conftest中定義一個作用域為session的Fixture函數,用于請求登錄接口返回token。
# @author: 給你一頁白紙
# 微信公眾號:測試上分之路import pytest
import requests
import json@pytest.fixture(scope="session")
def get_token_fixture():'''作用域為session的fixture函數,返回token:return:'''headers = {"Content-Type": "application/json;charset=utf8"}url = "http://127.0.0.1:5000/login"_data = {"username": "劉德華","password": "123456"}res = requests.post(url=url, headers=headers, json=_data).textres = json.loads(res)token = res["token"]return token
2,接著,測試用例調用該Fixture。
def test_check_user(get_token_fixture):'''查詢個人信息(需要先登錄系統):return:'''# 通過Fixture函數g獲取et_token_fixture值,即token,再將token添加到請求頭中headers = {"Content-Type": "application/json;charset=utf8","token": get_token_fixture}url = "http://127.0.0.1:5000/users/3"res = requests.get(url=url, headers=headers).textres = json.loads(res)print(res)print(headers)assert res["code"] == 1000if __name__ == '__main__':pytest.main()
執行測試用例結果如下:
說明思路二也是可行的,當然這里只執行了一條測試用例,如果執行很多的用例,效果會是怎樣還沒去驗證,大家可以試試看。
三. 總結
- 相對于Session/Cookies來說,請求量較大或者涉及第三方接口的系統,使用token更適合。
- 有些項目token是放在請求頭中發送的,而有一些項目則是放在請求參數里發送的,做接口自動化時要明確是哪種方式。
- 接口自動化處理token時這兩種思路可任選一種,如果使用pytest框架的話建議嘗試思路二。
-
?總結:
?光學理論是沒用的,要學會跟著一起敲,要動手實操,才能將自己的所學運用到實際當中去,這時候可以搞點實戰案例來學習。
如果對你有幫助的話,點個贊收個藏,給作者一個鼓勵。也方便你下次能夠快速查找。
如有不懂還要咨詢下方小卡片,博主也希望和志同道合的測試人員一起學習進步
在適當的年齡,選擇適當的崗位,盡量去發揮好自己的優勢。
我的自動化測試開發之路,一路走來都離不每個階段的計劃,因為自己喜歡規劃和總結,
測試開發視頻教程、學習筆記領取傳送門!!