本文转自测试人社区,原文链接:https://ceshiren.com/t/topic/30218
httprunner 是支持用例以 Yaml 形式维护,但是在运行的时候其实是要先将其转换成 py 文件。
或者是
其中 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
复制代码
评论