使用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