业务流本质上还是接口依赖,接口关联:
- 1.if实现动态数据替换,详见项目实战-充值接口优化(接口关联)_Ly_LittleStar的博客-CSDN博客
- 正则表达式(第一个技术)
- 数据提取(extract)
- 以投资接口为例
- 进一步优化(封装)
投资接口的实现依赖于登录、添加项目、审核项目接口。
1.实现代码
import unittest
import requests
import json
from common.excel import read_excel
from ddt import ddt, data
from setting.config import config_file, host
from tests.base import ApiCase
from setting.secret import user, admin_user
from jsonpath import jsonpath
# 得到测试数据
excel_data = read_excel(file=config_file, sheet_name='invest')
@ddt
class TestInvest(unittest.TestCase, ApiCase):
@classmethod
def setUpClass(cls) -> None:
# 直接从配置文件中读取需要的数据。然后设置成ApiCase的属性
cls.investor_phone = user["mobile_phone"]
cls.investor_pwd = user["pwd"]
cls.loan_phone = user["mobile_phone"]
cls.loan_pwd = user["pwd"]
cls.admin_phone = admin_user["mobile_phone"]
cls.admin_pwd = admin_user["pwd"]
@data(*excel_data)
def test_invest(self, info):
# 1.对数据进行预处理,提供给接口进行访问。数据替换,字符串转化为字典
# prev_data(info) -->返回info
json_data = info['json']
headers = info['headers']
# 通过正则表达式完成数据替换
json_data = self.replace_date(json_data)
headers = self.replace_date(headers)
# 将json数据转化为字典
json_data = json.loads(json_data)
headers = json.loads(headers)
expected = json.loads(info['expected'])
extractor = {}
if info["extractor"]:
extractor = json.loads(info["extractor"])
# 2.访问接口,得到接口的返回结果
resp = requests.request(method=info['method'],
url=host + info['url'],
headers=headers,
json=json_data).json()
# 3.响应结果当中读取接下来接口需要的数据,设置成# #同名属性
# 获取投资人登录的id (investor_member_id)和 token (investor_token)
for prop_name, jsonpath_expression in extractor.items():
value = jsonpath(resp, jsonpath_expression)[0]
# 设置ApiCase的类属性
setattr(ApiCase, prop_name, value)
# 4.断言
for key, value in expected.items():
self.assertEqual(value, resp[key])
2.封装
对test_invest测试方法中的四个步骤进行封装:
import requests
import re
import json
from setting.config import host
from jsonpath import jsonpath
from setting.secret import user, admin_user
class ApiCase:
"""访问项目接口需要用到的独立的方法或者属性"""
@classmethod
def login(cls):
"""访问登录接口"""
url = host + '/member/login'
method = 'post'
headers = {"X-Lemonban-Media-Type": "lemon