def assert_result(response: Response, expected: str) -> None:
""" 断言方法
:param response: 实际响应对象
:param expected: 预期响应内容,从excel中或者yaml读取、或者手动传入
return None
"""
if expected is None:
logging.info("当前用例无断言!")
return
if isinstance(expected, str):
expect_dict = eval(expected)
else:
expect_dict = expected
index = 0
for k, v in expect_dict.items():
# 获取需要断言的实际结果部分
for _k, _v in v.items():
if _k == "http_code":
actual = response.status_code
else:
if response_type(response) == "json":
actual = json_extractor(response.json(), _k)
else:
actual = re_extract(response.text, _k)
index += 1
logging.info(f'第{index}个断言数据,实际结果:{actual} | 预期结果:{_v} 断言方式:{k}')
allure_step(f'第{index}个断言数据', f'实际结果:{actual} = 预期结果:{v}')
try:
if k == "eq": # 相等
assert actual == _v
elif k == "in": # 包含关系
assert _v in actual
elif k == "gt": # 判断大于,值应该为数值型
assert actual > _v
elif k == "lt": # 判断小于,值应该为数值型
assert actual < _v
elif k == "not": # 不等于,非
assert actual != _v
else:
logging.exception(f"判断关键字: {k} 错误!")
except AssertionError:
raise AssertionError(f'第{index}个断言失败 -|- 断言方式:{k} 实际结果:{actual} || 预期结果: {_v}')
case_handle.py Case数据读取工具类
def get_case_data():
case_type = ReadYaml(config_path + "config.yaml").read_yaml["case"]
if case_type == CaseType.EXCEL.value:
cases = []
for file in [excel for excel in os.listdir(data_path) if os.path.splitext(excel)[1] == ".xlsx"]:
data = ReadExcel(data_path + file).read_excel()
name = os.path.splitext(file)[0]
class_name = name.split("_")[0].title() + name.split("_")[1].title()
gen_case(name, data, class_name)
cases.extend(data)
return cases
elif case_type == CaseType.YAML.value:
cases = []
for yaml_file in [yaml for yaml in os.listdir(data_path) if
os.path.splitext(yaml)[1] in [".yaml", "yml"]]:
data = ReadYaml(data_path + yaml_file).read_yaml
name = os.path.splitext(yaml_file)[0]
class_name = name.split("_")[0].title() + name.split("_")[1].title()
gen_case(name, data, class_name)
cases.extend(data)
return cases
else:
cases = []
for file in [excel for excel in os.listdir(data_path) if
os.path.splitext(excel)[1] in [".yaml", "yml", ".xlsx"]]:
if os.path.splitext(file)[1] == ".xlsx":
data = ReadExcel(data_path + file).read_excel()
name = os.path.splitext(file)[0]
cases.extend(data)
else:
data = ReadYaml(data_path + file).read_yaml
name = os.path.splitext(file)[0]
cases.extend(data)
class_name = name.split("_")[0].title() + name.split("_")[1].title()
gen_case(name, data, class_name)
return cases
对于框架任何问题,欢迎联系我!
一、框架架构
二、项目目录结构
三、框架功能说明
解决痛点:
通过session会话方式,解决了登录之后cookie关联处理
框架天然支持接口动态传参、关联灵活处理
支持Excel、Yaml文件格式编写接口用例,通过简单配置框架自动读取并执行
执行环境一键切换,解决多环境相互影响问题
支持http/https协议各种请求、传参类型接口
响应数据格式支持json、str类型的提取操作
断言方式支持等于、包含、大于、小于、不等于等方
框架可以直接交给不懂代码的功能测试人员使用,只需要安装规范编写接口用例就行
框架使用说明:
pip install -r requirements.txt
run.py
文件Excel
或者Yaml
文件里面,按照示例编写即可,也可以在test_case
目录下通过python脚本编写casejsonpath
、正则表达式
提取数据Excel
和test_case
目录下用例四、核心逻辑说明
工具类封装
配置文件
输出目录
日志输出目录
报告目录
执行case后自动生成,执行之前自动删除
allure 数据目录
执行case后自动生成,执行之前自动删除
请求工具类
base_request.py 请求封装工具类
pre_handle_utils.py 请求前置处理工具类
after_handle_utils.py 后置操作处理工具类
代码编写case
程序主入口
执行记录
allure 报告
日志记录