如何使用 Teprunner 測(cè)試平臺(tái)編寫(xiě)從登錄到下單的大流程接口自動(dòng)化用例
大家好,我是剛哥。
對(duì)于登錄→搜索商品→添加購(gòu)物車→下單→支付這樣的大流程,使用teprunner測(cè)試平臺(tái)該如何編寫(xiě)接口自動(dòng)化用例呢?
假設(shè)這幾個(gè)節(jié)點(diǎn)的接口和參數(shù)如下:
- # 登錄
- url:/login
- method: post
- body: {"username": "dongfanger", "password": "123456"}
- response: {"token": "de2e3ffu29"}
- # 搜索商品
- url:/searchSku
- method: get
- headers: {"token": "de2e3ffu29"}
- body: {"skuName": "電子書(shū)"}
- response: {"skuId": "222", "price": "2.3"}
- # 添加購(gòu)物車
- url:/addCart
- method: post
- headers: {"token": "de2e3ffu29"}
- body: {"skuId": "222", "skuNum": "3"}
- response: {"skuId": "222", "price": "2.3", "skuNum": "3", "totalPrice": "6.9"}
- # 下單
- url:/order
- method: post
- headers: {"token": "de2e3ffu29"}
- body: {"skuId": "222", "price": "2.3", "skuNum": "3", "totalPrice": "6.9"}
- response: {"orderId": "333"}
- # 支付
- url:/pay
- method: post
- headers: {"token": "de2e3ffu29"}
- body: {"orderId": "333", "payAmount": "6.9"}
- response: {"success": "true"}
我不會(huì)直接在teprunner測(cè)試平臺(tái)的界面上直接寫(xiě)新用例的代碼,而是先在PyCharm中把代碼寫(xiě)好調(diào)通,再手動(dòng)復(fù)制粘貼或者經(jīng)過(guò)Git同步到平臺(tái)上。本文就來(lái)介紹下怎么在PyCharm中借助tep編寫(xiě)這個(gè)大流程的接口自動(dòng)化用例。
先使用命令檢查tep已經(jīng)是0.9.1以上版本:
- $ tep -V
- 0.9.1
然后初始化項(xiàng)目:
- $ tep startproject login-pay-big-process
- 2021-12-27 12:41:26.721 | INFO | tep.scaffold:create_scaffold:53 - Create new project: login-pay-big-process
- Project root dir: /Users/dongfanger/PycharmProjects/login-pay-big-process
- Created folder: login-pay-big-process
- Created folder: login-pay-big-process/fixtures
- Created folder: login-pay-big-process/tests
- Created folder: login-pay-big-process/files
- Created folder: login-pay-big-process/reports
- Created file: login-pay-big-process/.gitignore
- Created file: login-pay-big-process/conf.yaml
- Created file: login-pay-big-process/conftest.py
- Created file: login-pay-big-process/pytest.ini
- Created file: login-pay-big-process/requirements.txt
- Created file: login-pay-big-process/fixtures/__init__.py
- Created file: login-pay-big-process/fixtures/fixture_admin.py
- Created file: login-pay-big-process/fixtures/fixture_env_vars.py
- Created file: login-pay-big-process/fixtures/fixture_login.py
- Created file: login-pay-big-process/fixtures/fixture_your_name.py
- Created file: login-pay-big-process/tests/__init__.py
- Created file: login-pay-big-process/tests/test_login.py
- Created file: login-pay-big-process/tests/test_post.py
- Created file: login-pay-big-process/tests/test_mysql.py
- Created file: login-pay-big-process/tests/test_request.py
修改fixtures/fixture_env_vars.py環(huán)境變量里面的域名:
- mapping = {
- "qa": {
- "domain": "https://qa.com", # 1
- "mysql_engine": mysql_engine("127.0.0.1", # host
- "2306", # port
- "root", # username
- "123456", # password
- "qa"), # db_name
- },
- "release": {
- "domain": "https://release.com",
- "mysql_engine": mysql_engine("127.0.0.1",
- "2306",
- "root",
- "123456",
- "release"),
- }
- # Add your environment and variables
- }
可以只修改domain,數(shù)據(jù)庫(kù)可以先不管。
編輯fixtures/fixture_login.py:
- from tep.client import request
- from tep.fixture import *
- def _jwt_headers(token):
- return {"Content-Type": "application/json", "authorization": f"Bearer {token}"}
- @pytest.fixture(scope="session")
- def login(env_vars):
- # Code your login
- logger.info("Administrator login")
- response = request(
- "post",
- url=env_vars.domain + "/login", # 1
- headers={"Content-Type": "application/json"},
- json={"username": "dongfanger", "password": "123456"} # 2
- )
- 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
修改url。
修改body。
然后可以跑一下tests/test_login.py看能否登錄成功。
在tests目錄下新建test_login_pay.py文件:
- from tep.client import request
- def test(env_vars, login):
- # 搜索商品
- # 添加購(gòu)物車
- # 下單
- # 支付
先把流程架子備注清楚。再一個(gè)接口一個(gè)接口添加。
搜索商品:
- # 搜索商品
- response = request(
- "get",
- url=env_vars.domain + "/searchSku",
- headers={"token": login.token},
- params={"skuName": "電子書(shū)"}
- )
- sku_id = jmespath.search("skuId", response.json())
- sku_price = jmespath.search("price", response.json())
- assert response.status_code < 400
- token直接從login fixture中取值。
- 從響應(yīng)中提取sku_id 和sku_price。
添加購(gòu)物車:
- # 添加購(gòu)物車
- sku_num = 3
- response = request(
- "post",
- url=env_vars.domain + "/addCart",
- headers={"token": login.token},
- json={"skuId": sku_id, "skuNum": sku_num}
- )
- total_price = jmespath.search("totalPrice", response.json())
- assert response.status_code < 400
- token直接從login fixture中取值。
- 入?yún)⑿薷臑樗阉魃唐诽崛〉淖兞亢妥远x的sku_num變量。
- 提取商品總價(jià)total_price。
下單:
- # 下單
- response = request(
- "post",
- url=env_vars.domain + "/order",
- headers={"token": login.token},
- json={"skuId": sku_id, "price": sku_price, "skuNum": sku_num, "totalPrice": total_price}
- )
- order_id = jmespath.search("orderId", response.json())
- assert response.status_code < 400
- token直接從login fixture中取值。
- 入?yún)⑷渴褂米兞刻鎿Q。
- 提取訂單id。
支付:
- # 支付
- response = request(
- "post",
- url=env_vars.domain + "/pay",
- headers={"token": login.token},
- json={"orderId": order_id, "payAmount": "6.9"}
- )
- assert response.status_code < 400
- assert response.json()["success"] == "true"
token直接從login fixture中取值。
入?yún)⑹褂孟聠翁崛〉膐rder_id變量。
添加一條支付成功的斷言。
這樣一個(gè)大流程用例就寫(xiě)好了。完整代碼如下:
- import jmespath
- from tep.client import request
- def test(env_vars, login):
- # 搜索商品
- response = request(
- "get",
- url=env_vars.domain + "/searchSku",
- headers={"token": login.token},
- params={"skuName": "電子書(shū)"}
- )
- sku_id = jmespath.search("skuId", response.json())
- sku_price = jmespath.search("price", response.json())
- assert response.status_code < 400
- # 添加購(gòu)物車
- sku_num = 3
- response = request(
- "post",
- url=env_vars.domain + "/addCart",
- headers={"token": login.token},
- json={"skuId": sku_id, "skuNum": sku_num}
- )
- total_price = jmespath.search("totalPrice", response.json())
- assert response.status_code < 400
- # 下單
- response = request(
- "post",
- url=env_vars.domain + "/order",
- headers={"token": login.token},
- json={"skuId": sku_id, "price": sku_price, "skuNum": sku_num, "totalPrice": total_price}
- )
- order_id = jmespath.search("orderId", response.json())
- assert response.status_code < 400
- # 支付
- response = request(
- "post",
- url=env_vars.domain + "/pay",
- headers={"token": login.token},
- json={"orderId": order_id, "payAmount": "6.9"}
- )
- assert response.status_code < 400
- assert response.json()["success"] == "true"