您好,登錄后才能下訂單哦!
今天小編給大家分享一下python+pytest接口自動化之token關聯登錄怎么實現的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
在PC端登錄公司的后臺管理系統或在手機上登錄某個APP時,經常會發現登錄成功后,返回參數中會包含token,它的值為一段較長的字符串,而后續去請求的請求頭中都需要帶上這個token作為參數,否則就提示需要先登錄。
這其實就是狀態或會話保持的第三種方式token
。
token 由服務端產生,是客戶端用于請求的身份令牌。第一次登錄成功時,服務端會生成一個包含用戶信息的加密字符串token,返回給客戶端并保存在本地,后續客戶端只需要帶上token進行請求即可,無需帶上用戶名密碼。
token原理簡單概括如下:
用戶首次登錄成功后,服務端會生成一個token值,服務端會將它保存保存在數據庫中,同時也會將它返回給客戶端;
客戶端拿到token值后,保存在本地;
后續客戶端再次發送除登錄外的其他請求時,會把保存在本地的token值作為參數一起發送給服務端;
服務端收到客戶端的請求后,會拿發送過來的token值與保存在數據庫中的token值進行比較;
如果兩個token值相同, 則說明當前用戶處于登錄狀態;
如果數據庫中沒有這個token值或者token值已經生效,則需用戶重新登錄。
公司某管理后臺系統,登錄后返回token,接著去請求其他接口時請求頭中都需要加上這個token,否則提示請先登錄。
請求該系統的登錄接口如下:
import requests import json 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).text print(res)
結果如下:
{
"code": 1000,
"msg": "登錄成功!",
"token": "sh44ljjl08s32730djsh44ljjl08s32730djsh44ljjl08s32730djsh44ljjl08s32730djsh44ljjl08s32730djsh44ljjl08s32730dj"
}
在對扎樣的項目做接口自動化測試時,需要先請求登錄接口拿到token,再去請求別的接口。每次請求其他接口時先請求一次登錄接口,這樣做雖然可行,但這樣不僅會降低自動化的執行效率,而且每次都請求登錄也會對服務器資源造成浪費。
在執行用例之前,先請求登錄接口,并將返回的token值存儲在文件中(如yaml文件),后續請求需要用到token值則從該文件。
python中yaml文件的讀寫請參考我之前的文章Python讀寫yaml文件(使用PyYAML庫)。
1,運行接口自動化測試框架,初始化時先請求登錄接口,獲取token值,并寫入指定的yaml文件中。
import requests import json import yaml def 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).text res = json.loads(res) token = res["token"] return token def write_yaml(token): 寫入yaml文件 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() # 獲取token write_yaml(token) # 將token值寫入yaml文件
2,執行測試用例時先讀取yaml文件中token值,并將token加入headers中(也有些是將token放在請求參數中,視被測試項目具體情況而定),再發送請求。
import requests import yaml import pytest import json def 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 token def test_check_user(): 查詢個人信息(需要先登錄系統) # 先從yaml文件中讀取token token = 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是否為1000 assert res["code"] == 1000 if __name__ == '__main__': pytest.main()
這里僅僅只是舉例說明,而在實際的框架中,我們需要把這些諸如yaml文件的讀寫這樣的函數單獨封裝在某個模塊中,供其他模塊調用,這樣會代碼會更加清晰簡潔。
利用pytest中的Fixture函數,作用域設置為session,并返回token值,后續測試方法/函數調用該Fixture函數。
pytest中Fixture的使用請參考我之前的文章pytest(6)-Fixture(固件)。
1,首先,在conftest中定義一個作用域為session的Fixture函數,用于請求登錄接口返回token。
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).text res = 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).text res = json.loads(res) print(res) print(headers) assert res["code"] == 1000 if __name__ == '__main__': pytest.main()
執行測試用例結果如下:
以上就是“python+pytest接口自動化之token關聯登錄怎么實現”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。