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

物联沃分享整理
物联沃-IOTWORD物联网 » 使用Python Requests、Pytest、YAML与Allure构建接口自动化测试框架的全面指南

发表回复