如何用tep完成增刪改查接口自動化

tep的設計理念是讓人人均可以用Python寫自動化,本文就來介紹如何用tep完成增刪改查接口自動化。python

環境變量

編輯fixtures/fixture_admin.py數據庫

"qa": {
    "domain": "https://qa.com",
},

修改qa環境的domainjson

登陸

由於非登陸接口須要從登陸接口拿token,放在請求參數中,因此先在fixtures/fixture_admin.py中實現登陸,修改urljsonapi

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

說明:函數

  1. 能夠複製login爲多個fixture,如login_adminlogin_some_user,靈活運用。
  2. scope="session",表示只登陸一次,全部測試用例使用同一個token。能夠改成function,讓每條用例使用不一樣token

寫用例

新建測試

新建tests\crud_test.pypost

from loguru import logger
from tep.client import request


def test(faker_ch, login, url):

pytest的fixture做爲參數傳入test()函數來使用,faker_chloginurlfixture_admin.py中定義好的fixture。

  • from loguru import logger 用於在測試用例中打印日誌
  • from tep.client import request tep封裝了請求日誌功能,也能夠用原生from requests import request

新增

請求參數爲nicknamephone,使用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_idcreated_atupdated_at

刪除

請求方法爲deleteurl中傳入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部分組成。接口之間經過變量實現參數化和關聯。

相關文章
相關標籤/搜索