如何用tep完成增刪改查接口自動(dòng)化

本文的文字及圖片來(lái)源于網(wǎng)絡(luò),僅供學(xué)習(xí)、交流使用,不具有任何商業(yè)用途,,版權(quán)歸原作者所有,如有問(wèn)題請(qǐng)及時(shí)聯(lián)系我們以作處理

作者:dongfanger ? 來(lái)源:掘金

鏈接:https://juejin.cn/post/6910414324712996872

想要獲取更多Python學(xué)習(xí)資料,了解更多關(guān)于Python的知識(shí),可以加Q群630390733踴躍發(fā)言,大家一起來(lái)學(xué)習(xí)討論吧!

tep的設(shè)計(jì)理念是讓人人都可以用Python寫自動(dòng)化,本文就來(lái)介紹如何用tep完成增刪改查接口自動(dòng)化。

環(huán)境變量

編輯fixtures/fixture_admin.py:

"qa": {

? ? "domain": "https://qa.com",

},

復(fù)制代碼

修改qa環(huán)境的domain。

登錄

因?yàn)榉堑卿浗涌谛枰獜牡卿浗涌谀胻oken,放在請(qǐng)求參數(shù)中,所以先在fixtures/fixture_admin.py中實(shí)現(xiàn)登錄,修改url和json:

response = request(

? ? "post",

? ? url=url("/api/users/login"),

? ? headers={"Content-Type": "application/json"},

? ? json={

? ? ? ? "username": "admin",

? ? ? ? "password": "123456",

? ? }

)

復(fù)制代碼

根據(jù)實(shí)際響應(yīng)數(shù)據(jù)結(jié)構(gòu),修改response_token賦值:

response_token = jmespath.search("token", response.json())

class Clazz:

? ? ? ? token = response_token

? ? ? ? jwt_headers = _jwt_headers(response_token)

return Clazz

復(fù)制代碼

參考_jwt_headers()實(shí)現(xiàn)自定義headers:

def _jwt_headers(token):

? ? return {"Content-Type": "application/json", "authorization": f"Bearer {token}"}

復(fù)制代碼

_表示內(nèi)部函數(shù),外部無(wú)法訪問(wèn),遵循conftest.py只對(duì)外提供fixture的原則。

完整代碼

def _jwt_headers(token):

? ? return {"Content-Type": "application/json", "authorization": f"Bearer {token}"}

@pytest.fixture(scope="session")

def login():

? ? # Code your login

? ? logger.info("Administrator login")

? ? response = request(

? ? ? ? "post",

? ? ? ? url=url("/api/users/login"),

? ? ? ? headers={"Content-Type": "application/json"},

? ? ? ? json={

? ? ? ? ? ? "username": "admin",

? ? ? ? ? ? "password": "123456",

? ? ? ? }

? ? )

? ? assert response.status_code < 400

? ? response_token = jmespath.search("token", response.json())

? ? class Clazz:

? ? ? ? token = response_token

? ? ? ? jwt_headers = _jwt_headers(response_token)

? ? return Clazz

復(fù)制代碼

說(shuō)明:

可以復(fù)制login為多個(gè)fixture,如login_admin、login_some_user,靈活運(yùn)用。

scope="session",表示只登錄一次,所有測(cè)試用例使用同一個(gè)token。可以改為function,讓每條用例使用不同token。

寫用例

新建測(cè)試

新建tests\crud_test.py:

from loguru import logger

from tep.client import request

def test(faker_ch, login, url):

復(fù)制代碼

pytest的fixture作為參數(shù)傳入test()函數(shù)來(lái)使用,faker_ch、login、url是fixture_admin.py中定義好的fixture。

from loguru import logger用于在測(cè)試用例中打印日志

from tep.client import requesttep封裝了請(qǐng)求日志功能,也可以用原生from requests import request

新增

請(qǐng)求參數(shù)為nickname和phone,使用faker_ch造1條測(cè)試數(shù)據(jù):

fake = faker_ch

nickname = fake.name()

phone = fake.phone_number()

復(fù)制代碼

請(qǐng)求方法為post,headers取登錄返回值login.jwt_headers:

response = request(

? ? "post",

? ? url=url("/api/users"),

? ? headers=login.jwt_headers,

? ? json={

? ? ? ? "nickname": nickname, "phone": phone

? ? }

)

復(fù)制代碼

添加斷言,簡(jiǎn)單判斷下響應(yīng)狀態(tài)碼<400:

assert response.status_code < 400

復(fù)制代碼

也可以查數(shù)據(jù)庫(kù)來(lái)斷言。

提取修改接口需要的數(shù)據(jù):

user_id = jmespath.search("id", response.json())

created_at = jmespath.search("createdAt", response.json())

updated_at = jmespath.search("updatedAt", response.json())

復(fù)制代碼

推薦用jmespath來(lái)提取json。

查詢

請(qǐng)求參數(shù)傳入剛才定義的局部變量nickname,使用get請(qǐng)求并斷言,headers取登錄返回值login.jwt_headers:

response = request(

? ? "get",

? ? url=url("/api/users"),

? ? headers=login.jwt_headers,

? ? params={

? ? ? ? "page": 1,

? ? ? ? "perPage": 10,

? ? ? ? "keyword": nickname

? ? }

)

assert response.status_code < 400

復(fù)制代碼

get請(qǐng)求需要把json關(guān)鍵字改為params。

修改

使用faker再造1條新數(shù)據(jù):

nickname_new = fake.name()

phone_new = fake.phone_number()

復(fù)制代碼

請(qǐng)求方法為put,headers取登錄返回值login.jwt_headers:

response = request(

? ? ? ? "put",

? ? ? ? url=url(f"/api/users/{user_id}"),

? ? ? ? headers=login.jwt_headers,

? ? ? ? json={

? ? ? ? ? ? "id": user_id, "createdAt": created_at, "updatedAt": updated_at,

? ? ? ? ? ? "phone": phone_new, "nickname": nickname_new

? ? ? ? }

? ? )

assert response.status_code < 400

復(fù)制代碼

請(qǐng)求參數(shù)中用到了新增接口提取的數(shù)據(jù)user_id、created_at、updated_at。

刪除

請(qǐng)求方法為delete,url中傳入user_id,headers取登錄返回值login.jwt_headers:

response = request(

? ? "delete",

? ? url=url(f"/api/users/{user_id}"),

? ? headers=login.jwt_headers

)

assert response.status_code < 400

復(fù)制代碼

刪除接口沒(méi)有json和params。

完整用例

"""

@Author? :? Don

@Date? ? :? 12/25/2020 1:02 PM

@Desc? ? :? 增刪改查

"""

import jmespath

from loguru import logger

from tep.client import request

def test(faker_ch, login, url):

? ? fake = faker_ch

? ? logger.info("新增")

? ? nickname = fake.name()

? ? phone = fake.phone_number()

? ? response = request(

? ? ? ? "post",

? ? ? ? url=url("/api/users"),

? ? ? ? headers=login.jwt_headers,

? ? ? ? json={

? ? ? ? ? ? "nickname": nickname, "phone": phone

? ? ? ? }

? ? )

? ? assert response.status_code < 400

? ? user_id = jmespath.search("id", response.json())

? ? created_at = jmespath.search("createdAt", response.json())

? ? updated_at = jmespath.search("updatedAt", response.json())

? ? logger.info("查詢")

? ? response = request(

? ? ? ? "get",

? ? ? ? url=url("/api/users"),

? ? ? ? headers=login.jwt_headers,

? ? ? ? params={

? ? ? ? ? ? "page": 1,

? ? ? ? ? ? "perPage": 10,

? ? ? ? ? ? "keyword": nickname

? ? ? ? }

? ? )

? ? assert response.status_code < 400

? ? logger.info("修改")

? ? nickname_new = fake.name()

? ? phone_new = fake.phone_number()

? ? response = request(

? ? ? ? "put",

? ? ? ? url=url(f"/api/users/{user_id}"),

? ? ? ? headers=login.jwt_headers,

? ? ? ? json={

? ? ? ? ? ? "id": user_id, "createdAt": created_at, "updatedAt": updated_at,

? ? ? ? ? ? "phone": phone_new, "nickname": nickname_new

? ? ? ? }

? ? )

? ? assert response.status_code < 400

? ? logger.info(f"用戶姓名手機(jī) {nickname} {phone} 修改后 {nickname_new} {phone_new}")

? ? logger.info("刪除")

? ? response = request(

? ? ? ? "delete",

? ? ? ? url=url(f"/api/users/{user_id}"),

? ? ? ? headers=login.jwt_headers

? ? )

? ? assert response.status_code < 400

復(fù)制代碼

小結(jié)

本文介紹了tep的基本使用,先配置環(huán)境變量,再修改登錄代碼,然后新增測(cè)試,最后編寫增刪改查的接口請(qǐng)求。每條用例放在一個(gè)函數(shù)中,通過(guò)函數(shù)參數(shù)引用fixture來(lái)使用全局環(huán)境變量,函數(shù)內(nèi)部可以定義測(cè)試需要的局部變量。每個(gè)接口是一個(gè)代碼塊,由接口描述、測(cè)試數(shù)據(jù)、請(qǐng)求、斷言和數(shù)據(jù)提取5部分組成。接口之間通過(guò)變量實(shí)現(xiàn)參數(shù)化和關(guān)聯(lián)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容