本文转自测试人社区,原文链接: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
复制代码
评论