如何用tep完成增刪改查介面自動化
阿新 • • 發佈:2020-12-25
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部分組成。介面之間通過變數實現引數化和