使用Python Requests、Pytest、YAML与Allure构建接口自动化测试框架的全面指南
接口自动化测试框架
一、项目目录

项目整体框框分为core(核心执行器,负责加载用例执行),example(测试用例模板),extend(常用关键操作封装,例如发送请求,提取变量,断言),parse(用例处理),utils(常用工具,例如渲染变量),cli.py程序执行主入口,生成测试数据和报告
执行入口代码如下
pytest_args = ['-s', '-v','--capture=sys',
'./core/ApiTestRunner.py',
'--clean-alluredir','--alluredir=results'
]
pytest.main(pytest_args)
os.system("allure generate ./results -o ./report_allure --clean")
二、extend模块
主要针对使用频率较高的方法进行封装,例如常用请求方法,断言,数据提取等


三、example模块
该模块主要存放测试用例以及全局变量文件

四、parse 用例处理模块

def load_yaml_parse(folder):
case_infos = []
case_names = []
cases = load_yaml_files(folder)
for case in cases:
ddts = case.get('ddts', [])
if len(ddts) > 0:
case.pop('ddts')
if len(ddts) == 0:
case_name = case.get('desc', uuid.uuid4().__str__())
case.update({"_case_name": case_name})
case_names.append(case_name)
case_infos.append(case)
else:
for ddt in ddts:
# 复制当前用例
new_case = copy.deepcopy(case)
context = new_case.get('context', {})
ddt.update(context)
new_case.update({"context": ddt})
# print("当前新用例为:===", new_case)
case_name = f'{case.get("desc",uuid.uuid4().__str__())}-{ddt.get("desc",uuid.uuid4().__str__())}'
new_case.update({"_case_name": case_name})
case_infos.append(new_case)
case_names.append(case_name)
return {
"case_info": case_infos,
"case_name": case_names
}
五、utils工具封装,例如变量渲染
from jinja2 import Template
def ReFresh(target, context):
return Template(str(target)).render(context)
# s = {"id":3456788}
# k = '{"name":"zhangsan","token":{{id}}}'
# data = eval(ReFresh(k, s))
{'name': 'zhangsan', 'token': 3456788}
六、core核心执行器,用例加载及执行
class TestRunner:
data = load_yaml_parse('./example')
@pytest.mark.parametrize("caseinfo",data['case_info'])
def test_case_excute(self, caseinfo):
# print("当前的测试用例数据是:", caseinfo)
kw = KeyWord()
dynamicTitle(caseinfo)
steps = caseinfo.get('steps', None)
# 获取ddt数据驱动的context
local_context = caseinfo.get("context", {})
for step in steps:
# print(step)
step_name = list(step.keys())[0]
step_value = list(step.values())[0]
print(f"当前的步骤名===>{step_name}====需要的值>{step_value}")
context = copy.deepcopy(g_context().show_dict())
context.update(local_context)
step_value = eval(ReFresh(step_value, context))
key = step_value['关键字']
try:
k_func = kw.__getattribute__(key)
except Exception as e:
print(e)
k_func(**step_value)
七、report测试报告生成
需要使用allure插件,安装allure-pytest装好插件,前提,安装jdk

作者:bad_girls