欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python+pytest接口自動(dòng)化之token關(guān)聯(lián)登錄的實(shí)現(xiàn)

 更新時(shí)間:2022年04月06日 15:41:56   作者:給你一頁(yè)白紙  
公司某管理后臺(tái)系統(tǒng),登錄后返回token,接著去請(qǐng)求其他接口時(shí)請(qǐng)求頭中都需要加上這個(gè)token,否則提示請(qǐng)先登錄,今天通過(guò)本文給大家介紹下python+pytest接口自動(dòng)化之token關(guān)聯(lián)登錄的實(shí)現(xiàn),感興趣的朋友一起看看吧

在PC端登錄公司的后臺(tái)管理系統(tǒng)或在手機(jī)上登錄某個(gè)APP時(shí),經(jīng)常會(huì)發(fā)現(xiàn)登錄成功后,返回參數(shù)中會(huì)包含token,它的值為一段較長(zhǎng)的字符串,而后續(xù)去請(qǐng)求的請(qǐng)求頭中都需要帶上這個(gè)token作為參數(shù),否則就提示需要先登錄。

這其實(shí)就是狀態(tài)或會(huì)話(huà)保持的第三種方式token。

一. 什么是token

token 由服務(wù)端產(chǎn)生,是客戶(hù)端用于請(qǐng)求的身份令牌。第一次登錄成功時(shí),服務(wù)端會(huì)生成一個(gè)包含用戶(hù)信息的加密字符串token,返回給客戶(hù)端并保存在本地,后續(xù)客戶(hù)端只需要帶上token進(jìn)行請(qǐng)求即可,無(wú)需帶上用戶(hù)名密碼。

token原理簡(jiǎn)單概括如下:

  • 用戶(hù)首次登錄成功后,服務(wù)端會(huì)生成一個(gè)token值,服務(wù)端會(huì)將它保存保存在數(shù)據(jù)庫(kù)中,同時(shí)也會(huì)將它返回給客戶(hù)端;
  • 客戶(hù)端拿到token值后,保存在本地;
  • 后續(xù)客戶(hù)端再次發(fā)送除登錄外的其他請(qǐng)求時(shí),會(huì)把保存在本地的token值作為參數(shù)一起發(fā)送給服務(wù)端;
  • 服務(wù)端收到客戶(hù)端的請(qǐng)求后,會(huì)拿發(fā)送過(guò)來(lái)的token值與保存在數(shù)據(jù)庫(kù)中的token值進(jìn)行比較;
  • 如果兩個(gè)token值相同, 則說(shuō)明當(dāng)前用戶(hù)處于登錄狀態(tài);
  • 如果數(shù)據(jù)庫(kù)中沒(méi)有這個(gè)token值或者token值已經(jīng)生效,則需用戶(hù)重新登錄。

二. token場(chǎng)景處理

公司某管理后臺(tái)系統(tǒng),登錄后返回token,接著去請(qǐng)求其他接口時(shí)請(qǐng)求頭中都需要加上這個(gè)token,否則提示請(qǐng)先登錄。

請(qǐng)求該系統(tǒng)的登錄接口如下:

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)

結(jié)果如下:

{
  "code": 1000, 
  "msg": "登錄成功!", 
  "token": "sh34ljjl08s32730djsh34ljjl08s32730djsh34ljjl08s32730djsh34ljjl08s32730djsh34ljjl08s32730djsh34ljjl08s32730dj"
}

在對(duì)扎樣的項(xiàng)目做接口自動(dòng)化測(cè)試時(shí),需要先請(qǐng)求登錄接口拿到token,再去請(qǐng)求別的接口。每次請(qǐng)求其他接口時(shí)先請(qǐng)求一次登錄接口,這樣做雖然可行,但這樣不僅會(huì)降低自動(dòng)化的執(zhí)行效率,而且每次都請(qǐng)求登錄也會(huì)對(duì)服務(wù)器資源造成浪費(fèi)。

這里介紹如下兩種處理思路。

1. 思路一

在執(zhí)行用例之前,先請(qǐng)求登錄接口,并將返回的token值存儲(chǔ)在文件中(如yaml文件),后續(xù)請(qǐng)求需要用到token值則從該文件。

python中yaml文件的讀寫(xiě)請(qǐng)參考我之前的文章Python讀寫(xiě)yaml文件(使用PyYAML庫(kù))。

1,運(yùn)行接口自動(dòng)化測(cè)試框架,初始化時(shí)先請(qǐng)求登錄接口,獲取token值,并寫(xiě)入指定的yaml文件中。

import requests
import json
import yaml
def get_token():
    '''
    請(qǐng)求登錄接口,獲取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):
    寫(xiě)入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值寫(xiě)入yaml文件

2,執(zhí)行測(cè)試用例時(shí)先讀取yaml文件中token值,并將token加入headers中(也有些是將token放在請(qǐng)求參數(shù)中,視被測(cè)試項(xiàng)目具體情況而定),再發(fā)送請(qǐng)求。

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():
    查詢(xún)個(gè)人信息(需要先登錄系統(tǒng))
    # 先從yaml文件中讀取token
    token = read_yaml()
    # 再將token添加到請(qǐng)求頭中
    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
    # 返回結(jié)果為json格式,轉(zhuǎn)換為字典
    res = json.loads(res)
    # 斷言code是否為1000
    assert res["code"] == 1000
if __name__ == '__main__':
    pytest.main()

這里僅僅只是舉例說(shuō)明,而在實(shí)際的框架中,我們需要把這些諸如yaml文件的讀寫(xiě)這樣的函數(shù)單獨(dú)封裝在某個(gè)模塊中,供其他模塊調(diào)用,這樣會(huì)代碼會(huì)更加清晰簡(jiǎn)潔。

2. 思路二

利用pytest中的Fixture函數(shù),作用域設(shè)置為session,并返回token值,后續(xù)測(cè)試方法/函數(shù)調(diào)用該Fixture函數(shù)。

pytest中Fixture的使用請(qǐng)參考我之前的文章pytest(6)-Fixture(固件)。

1,首先,在conftest中定義一個(gè)作用域?yàn)閟ession的Fixture函數(shù),用于請(qǐng)求登錄接口返回token。

import pytest
import requests
import json

@pytest.fixture(scope="session")
def get_token_fixture():
    '''
    作用域?yàn)閟ession的fixture函數(shù),返回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,接著,測(cè)試用例調(diào)用該Fixture。

def test_check_user(get_token_fixture):
    '''
    查詢(xún)個(gè)人信息(需要先登錄系統(tǒng))
    :return:
    '''
    # 通過(guò)Fixture函數(shù)g獲取et_token_fixture值,即token,再將token添加到請(qǐng)求頭中
    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()

執(zhí)行測(cè)試用例結(jié)果如下:

說(shuō)明思路二也是可行的,當(dāng)然這里只執(zhí)行了一條測(cè)試用例,如果執(zhí)行很多的用例,效果會(huì)是怎樣還沒(méi)去驗(yàn)證,大家可以試試看。

三. 總結(jié)

  • 相對(duì)于Session/Cookies來(lái)說(shuō),請(qǐng)求量較大或者涉及第三方接口的系統(tǒng),使用token更適合。
  • 有些項(xiàng)目token是放在請(qǐng)求頭中發(fā)送的,而有一些項(xiàng)目則是放在請(qǐng)求參數(shù)里發(fā)送的,做接口自動(dòng)化時(shí)要明確是哪種方式。
  • 接口自動(dòng)化處理token時(shí)這兩種思路可任選一種,如果使用pytest框架的話(huà)建議嘗試思路二。

到此這篇關(guān)于python+pytest接口自動(dòng)化(13)-token關(guān)聯(lián)登錄的文章就介紹到這了,更多相關(guān)python接口自動(dòng)化token關(guān)聯(lián)登錄內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 在keras 中獲取張量 tensor 的維度大小實(shí)例

    在keras 中獲取張量 tensor 的維度大小實(shí)例

    這篇文章主要介紹了在keras 中獲取張量 tensor 的維度大小實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-06-06
  • python 自定義對(duì)象的打印方法

    python 自定義對(duì)象的打印方法

    今天小編就為大家分享一篇python 自定義對(duì)象的打印方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01
  • Django中使用CORS實(shí)現(xiàn)跨域請(qǐng)求過(guò)程解析

    Django中使用CORS實(shí)現(xiàn)跨域請(qǐng)求過(guò)程解析

    這篇文章主要介紹了Django中使用CORS實(shí)現(xiàn)跨域請(qǐng)求過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • Python headers請(qǐng)求頭如何實(shí)現(xiàn)快速添加

    Python headers請(qǐng)求頭如何實(shí)現(xiàn)快速添加

    這篇文章主要介紹了Python headers請(qǐng)求頭如何實(shí)現(xiàn)快速添加,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Python+tkinter制作經(jīng)典登錄界面和點(diǎn)擊事件

    Python+tkinter制作經(jīng)典登錄界面和點(diǎn)擊事件

    Tkinter是?Python?標(biāo)準(zhǔn)?GUI?庫(kù),簡(jiǎn)稱(chēng)?“Tk”;從本質(zhì)上來(lái)說(shuō),它是對(duì)?TCL/TK?工具包的一種?Python?接口封裝。本文將利用tkinter制作一個(gè)經(jīng)典的登錄界面和點(diǎn)擊事件,需要的可以參考一下
    2022-09-09
  • python 匿名函數(shù)相關(guān)總結(jié)

    python 匿名函數(shù)相關(guān)總結(jié)

    這篇文章主要介紹了python 匿名函數(shù)的的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下
    2021-03-03
  • Python?matplotlib?繪制散點(diǎn)圖詳解建議收藏

    Python?matplotlib?繪制散點(diǎn)圖詳解建議收藏

    在數(shù)據(jù)統(tǒng)計(jì)圖表中,有一種圖表是散列點(diǎn)分布在坐標(biāo)中,反應(yīng)數(shù)據(jù)隨著自變量變化的趨勢(shì)。這篇文章主要介紹了如何通過(guò)matplotlib繪制散點(diǎn)圖,需要的朋友可以參考一下
    2021-12-12
  • Python中搜索和替換文件中的文本的實(shí)現(xiàn)(四種)

    Python中搜索和替換文件中的文本的實(shí)現(xiàn)(四種)

    本文主要介紹了Python中搜索和替換文件中的文本的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • Python內(nèi)建函數(shù)之raw_input()與input()代碼解析

    Python內(nèi)建函數(shù)之raw_input()與input()代碼解析

    這篇文章主要介紹了Python內(nèi)建函數(shù)之raw_input()與input()代碼解析,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-10-10
  • django中media媒體路徑設(shè)置的步驟

    django中media媒體路徑設(shè)置的步驟

    在本篇文章里小編給大家整理的是關(guān)于django media媒體路徑設(shè)置相關(guān)知識(shí)點(diǎn),有興趣的朋友們可以學(xué)習(xí)下。
    2019-11-11

最新評(píng)論