Python开源项目:自动化测试工具HttpRunner的简单介绍(三)

发表于:2021-7-22 09:49

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:波小艺    来源:掘金

  hook机制
  涉及hook处理。

  背景:https://debugtalk.com/post/httprunner-hook/
  在自动化测试中,执行用例前,需要执行一些预处理操作,执行用例后,需要做一些清理工作。如果手动去操作的话,就不是很合适。所以就需要用到hook机制,在执行用例前后执行hook函数。

  使用
  hook 机制分为两个层级:
  ·测试用例层面(testcase)
  在测试用例层面,主要在config字段新增两个关键字 setup_hooks 和 teardown_hooks。在这里,其主要目的就是用于测试前的准备工作以及测试后的清理工作。
  ·测试步骤层面(teststep)
  在每个teststep中新增关键字 setup_hooks 和 teardown_hooks。实现对请求的 request 内容进行预处理以及实现对响应的 response 进行修改。

  编写hook函数
  ·hook 函数的定义放置在项目的 debugtalk.py 中,在 YAML/JSON 中调用 hook 函数仍然是采用 {func(a, $b)} 的形式。
  ·可传自定义参数:对于测试用例层面的 hook 函数,与 YAML/JSON 中自定义的函数完全相同,可通过自定义参数传参的形式来实现灵活应用。
  ·可传request与response参数:对于单个测试用例层面的 hook 函数,除了可传入自定义参数外,还可以传入与当前测试用例相关的信息,包括请求的 request(请求头,请求体,请求方法等)和响应的request(请求头,请求体,请求方法等)和响应的 request(请求头,请求体,请求方法等)和响应的response(对于requests.Response,也就是响应体),用于实现更复杂场景的灵活应用。如${print_req(``$request``)} 。
# ${print_request($request)}
2021-07-18 09:30:46.740 | DEBUG    | httprunner.runner:__call_hooks:121 - call hook function: ${print_reqeust($request)}
{'method': 'GET', 'url': '/get', 'params': {'foo1': 'bar11', 'foo2': 'bar21', 'sum_v': 3}, 'headers': {'User-Agent': 'HttpRunner/3.1.5', 'HRUN-Request-ID': 'HRUN-7768261f-0abf-4ce5-abf2-06327de85fd7-846739'}, 'req_json': None, 'data': None, 'cookies': {}, 'timeout': 120, 'allow_redirects': True, 'verify': False}
# ${print_req($response)}
2021-07-18 09:36:03.019 | DEBUG    | httprunner.runner:__call_hooks:121 - call hook function: ${print_req($response)}
<httprunner.response.ResponseObject object at 0x109c87e50>

  环境(.env)
  涉及env的处理:https://ontheway.cool/HttpRunner3DocsForCN/concepts/dot-env/
# parser.py
def get_mapping_function(
    function_name: Text, functions_mapping: FunctionsMapping
) -> Callable:
    #省略
    if function_name in functions_mapping:
        return functions_mapping[function_name]

    elif function_name in ["environ", "ENV"]:
        return utils.get_os_environ
#省略
    raise exceptions.FunctionNotFound(f"{function_name} is not found.")

# utils.py

def set_os_environ(variables_mapping):
    """ set variables mapping to os.environ
    """
    for variable in variables_mapping:
        os.environ[variable] = variables_mapping[variable]
        logger.debug(f"Set OS environment variable: {variable}")
        
def get_os_environ(variable_name):
    try:
        return os.environ[variable_name]
    except KeyError:
        raise exceptions.EnvNotFound(variable_name)

  加载用例之前,会先把.env文件中的变化加载到环境中,如果用例用含有ENV或者environ,则通过os.environ去读取相应的值。

  参数化:
  实现
  HttpRunner 实现参数化数据驱动机制:https://debugtalk.com/post/httprunner-data-driven/
  HttpRunner 再议参数化数据驱动机制:https://debugtalk.com/post/httprunner-data-driven-refactor/

  使用
  需要注意的是,从v2.0开始,参数化只支持在 testsuite 中实现。不再支持在测试用例文件中进行参数化配置。

  参数配置概述
  独立参数:指的是不与其他参数有任何关联关系,与其他参数是相互独立的。
  关联参数:假如测试用例中定义了多个参数,那么测试用例在运行时会对参数进行笛卡尔积组合,覆盖所有参数组合情况。
  具体使用:https://v2.httprunner.org/prepare/parameters/

  extract/export
  底层使用jmespath:https://jmespath.org/,提取和验证json响应,使得提取更简单。
  extract用来抓取响应体中的字段,export导出当前用例抓取的字段,供引用该用例的用例使用。

  测试报告
  pytest内置报告
  hrun /path/to/testcase --html=report.html
  allure报告
  pip install allure-pytest
  执行:hrun /path/to/testcase --alluredir=/tmp/my_allure_results
  在线打开报告:allure serve /tmp/my_allure_results  或者  生成html报告:allure generate reports/allure -o reports/allure/html

  总结
  好好利用httprunner,可以覆盖80%的场景,可以说是一个不错的工具,当然我们除了学习应该如何使用之外,更应该学习人家设计的思想,这样自己之后才能有机会做好一点的工具。

      本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号