本文的文字及圖片來(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)。