1. 程式人生 > >如何用tep完成增刪改查介面自動化

如何用tep完成增刪改查介面自動化

tep的設計理念是讓人人都可以用Python寫自動化,本文就來介紹如何用tep完成增刪改查介面自動化。 # 環境變數 編輯`fixtures/fixture_admin.py`: ```python "qa": { "domain": "https://qa.com", }, ``` 修改`qa`環境的`domain`。 # 登入 因為非登入介面需要從登入介面拿`token`,放在請求引數中,所以先在`fixtures/fixture_admin.py`中實現登入,修改`url`和`json`: ```python response = request( "post", url=url("/api/users/login"), headers={"Content-Type": "application/json"}, json={ "username": "admin", "password": "123456", } ) ``` 根據實際響應資料結構,修改`response_token`賦值: ```python response_token = jmespath.search("token", response.json()) class Clazz: token = response_token jwt_headers = _jwt_headers(response_token) return Clazz ``` 參考`_jwt_headers()`實現自定義headers: ```python def _jwt_headers(token): return {"Content-Type": "application/json", "authorization": f"Bearer {token}"} ``` > `_`表示內部函式,外部無法訪問,遵循`conftest.py`只對外提供fixture的原則。 **完整程式碼** ```python 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 ``` 說明: 2. 可以複製`login`為多個fixture,如`login_admin`、`login_some_user`,靈活運用。 3. `scope="session"`,表示只登入一次,所有測試用例使用同一個`token`。可以改為`function`,讓每條用例使用不同`token`。 # 寫用例 ## 新建測試 新建`tests\crud_test.py`: ```python 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條測試資料: ```python fake = faker_ch nickname = fake.name() phone = fake.phone_number() ``` 請求方法為`post`,headers取登入返回值`login.jwt_headers`: ```python response = request( "post", url=url("/api/users"), headers=login.jwt_headers, json={ "nickname": nickname, "phone": phone } ) ``` 新增斷言,簡單判斷下響應狀態碼<400: ```python assert response.status_code < 400 ``` > 也可以查資料庫來斷言。 提取修改介面需要的資料: ```python 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`: ```python 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條新資料: ```python nickname_new = fake.name() phone_new = fake.phone_number() ``` 請求方法為`put`,headers取登入返回值`login.jwt_headers`: ```python 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`: ```python response = request( "delete", url=url(f"/api/users/{user_id}"), headers=login.jwt_headers ) assert response.status_code < 400 ``` > 刪除介面沒有json和params。 # 完整用例 ```python """ @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部分組成。介面之間通過變數實現引數化和