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),我们将立即处理