写点什么

软件测试学习笔记丨 HttpRunnerV4 用例转换

作者:测试人
  • 2024-03-28
    北京
  • 本文字数:1682 字

    阅读完需:约 6 分钟

本文转自测试人社区,原文链接:https://ceshiren.com/t/topic/30218

httprunner 是支持用例以 Yaml 形式维护,但是在运行的时候其实是要先将其转换成 py 文件。

hmake xxxx
复制代码

或者是

hrun xxxx
复制代码

其中 hrun 等价于 hmake xxx && httprunner run xxx 这部分逻辑可以参考 httprunner/cli.py

def main():    """API test: parse command line options and run commands."""    if sys.argv[1] == "run":        sys.exit(main_run(extra_args))    elif sys.argv[1] == "make":        main_make(args.testcase_path)
复制代码

用例转换的相关代码在 httprunner/make.py

加载指定路径下的测试文件:

可以参考 httprunner/loader.py 中 load_folder_files

归一化测试脚本内容

httprunner/make.py 的__make 方法中

# 这里其实就是解析json或者yaml文件test_content = load_test_file(test_file)# 统一用例格式test_content = ensure_testcase_v4_api(test_content)
复制代码

将脚本内容渲染成 xxx_test.py 文件,这里主要用的是 Jinja2 来做模板

具体怎么生成 data 中各个字段的,直接参考其函数就好

data = {        "version": __version__,        "testcase_path": testcase_path,        "class_name": f"TestCase{testcase_cls_name}",        "imports_list": imports_list,        "config_chain_style": make_config_chain_style(config),        "skip": make_config_skip(config),        "marks": config.get("marks", []),        "parameters": config.get("parameters"),        "reference_testcase": any(step.get("testcase") for step in teststeps),        "teststeps_chain_style": [            make_teststep_chain_style(step) for step in teststeps        ],    }    content = __TEMPLATE__.render(data)
复制代码

httprunner 执行用例底层用的是 pytest,所以后续有功能需要扩展,部分修改点就可以在 jinja 模板上进行修改。

__TEMPLATE__ = jinja2.Template(    """# NOTE: Generated By HttpRunner {{ version }}# FROM: {{ testcase_path }}
{%- if parameters or skip %}import pytest{% endif %}from httprunner import HttpRunner, Config, Step, RunRequest
{%- if parameters %}from httprunner import Parameters{%- endif %}
{%- if reference_testcase %}from httprunner import RunTestCase{%- endif %}
{%- for import_str in imports_list %}{{ import_str }}{%- endfor %}
class {{ class_name }}(HttpRunner):
{% if parameters and skip and marks%} @pytest.mark.parametrize("param", Parameters({{ parameters }})) @pytest.mark.skip(reason="{{ skip }}") {% for mark in marks %} @pytest.mark.{{ mark }} {% endfor %} def test_start(self, param): super().test_start(param)
{% elif parameters and marks %} @pytest.mark.parametrize("param", Parameters({{parameters}})) {% for mark in marks %} @pytest.mark.{{ mark }} {% endfor %} def test_start(self, param): super().test_start(param)
{% elif parameters %} @pytest.mark.parametrize("param", Parameters({{ parameters }})) def test_start(self, param): super().test_start(param)
{% elif skip %} @pytest.mark.skip(reason="{{ skip }}") def test_start(self): super().test_start() {% endif %}
config = {{ config_chain_style }}
teststeps = [ {% for step_chain_style in teststeps_chain_style %} {{ step_chain_style }}, {% endfor %} ]
if __name__ == "__main__": {{ class_name }}().test_start()
""")
复制代码

比如原本 httprunner 不支持 mark 标记用例,我就直接修改了模板,增加了一个 marks 的参数来实先标记用例功能,那么我就可以可以通过命令行参数来筛选执行用例

hrun -m "qa and sometag" xxx
复制代码

免费领取:测试资料+测试用例+简历模板+测试文档


发布于: 刚刚阅读数: 6
用户头像

测试人

关注

专注于软件测试开发 2022-08-29 加入

霍格沃兹测试开发学社,测试人社区:https://ceshiren.com/t/topic/22284

评论

发布
暂无评论
软件测试学习笔记丨HttpRunnerV4 用例转换_软件测试_测试人_InfoQ写作社区