tep的設計理念是讓人人均可以用Python寫自動化,本文就來介紹如何用tep完成增刪改查接口自動化。python
編輯fixtures/fixture_admin.py
:數據庫
"qa": { "domain": "https://qa.com", },
修改qa
環境的domain
。json
由於非登陸接口須要從登陸接口拿token
,放在請求參數中,因此先在fixtures/fixture_admin.py
中實現登陸,修改url
和json
:api
response = request( "post", url=url("/api/users/login"), headers={"Content-Type": "application/json"}, json={ "username": "admin", "password": "123456", } )
根據實際響應數據結構,修改response_token
賦值:session
response_token = jmespath.search("token", response.json()) class Clazz: token = response_token jwt_headers = _jwt_headers(response_token) return Clazz
參考_jwt_headers()
實現自定義headers:數據結構
def _jwt_headers(token): return {"Content-Type": "application/json", "authorization": f"Bearer {token}"}
_
表示內部函數,外部沒法訪問,遵循conftest.py
只對外提供fixture的原則。app
完整代碼dom
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
說明:函數
login
爲多個fixture,如login_admin
、login_some_user
,靈活運用。scope="session"
,表示只登陸一次,全部測試用例使用同一個token
。能夠改成function
,讓每條用例使用不一樣token
。新建tests\crud_test.py
:post
from loguru import logger from tep.client import request def test(faker_ch, login, url):
pytest的fixture做爲參數傳入test()
函數來使用,faker_ch
、login
、 url
是fixture_admin.py
中定義好的fixture。
from loguru import logger
用於在測試用例中打印日誌from tep.client import request
tep封裝了請求日誌功能,也能夠用原生from requests import request
請求參數爲nickname
和phone
,使用faker_ch
造1條測試數據:
fake = faker_ch nickname = fake.name() phone = fake.phone_number()
請求方法爲post
,headers取登陸返回值login.jwt_headers
:
response = request( "post", url=url("/api/users"), headers=login.jwt_headers, json={ "nickname": nickname, "phone": phone } )
添加斷言,簡單判斷下響應狀態碼<400:
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())
推薦用jmespath來提取json。
請求參數傳入剛纔定義的局部變量nickname
,使用get
請求並斷言,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
get請求須要把
json
關鍵字改成params
。
使用faker再造1條新數據:
nickname_new = fake.name() phone_new = fake.phone_number()
請求方法爲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
請求參數中用到了新增接口提取的數據user_id
、created_at
、updated_at
。
請求方法爲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
刪除接口沒有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"用戶姓名手機 {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
本文介紹了tep的基本使用,先配置環境變量,再修改登陸代碼,而後新增測試,最後編寫增刪改查的接口請求。每條用例放在一個函數中,經過函數參數引用fixture來使用全局環境變量,函數內部能夠定義測試須要的局部變量。每一個接口是一個代碼塊,由接口描述、測試數據、請求、斷言和數據提取5部分組成。接口之間經過變量實現參數化和關聯。