李浩 - 云代码空间
——
pytest-html 是一个插件,pytest 用于生成测试结果的 html 报告。
先简单写个例子生成报告看看。
此次主要是针对 environment 和 results 两部分进行修改配置,让列表部分展示的数据更清晰,增加和删减列数据。
这里先介绍下 conftest.py 文件,主要作用如下:
比如公共用例前置和后置部分,数据清理都可以放在该文件里执行。
主要分为增加配置或删除配置:
def pytest_configure(config): # 添加配置 config._metadata["项目名称"] = "测试报告" # 删除配置 config._metadata.pop("java_home") config._metadata.pop("plugins") config._metadata.pop("packages") config._metadata.pop("platform")
从上面生成的报告列表中,看到主要分为下面几列数据:result、test、links、duration。这里面的数据其实可以看出都没有包含我们的测试数据,无法直观看出输入、输出结果。
做如下优化:
基于上述需求,要在报告中添加我们自己的测试数据展示,故需要添加一个全局变量在一个 case 执行过程中进行记录供调用。
创建全局变量:
# 定义一个全局变量,用于存储内容 global_data = {} @pytest.fixture(scope="function") def set_global_data(): """ 设置全局变量,用于关联参数 :return: """ def _set_global_data(key, value): global_data[key] = value yield _set_global_data global_data.clear()
@user2ize("data", case_list) def test_case(data, set_global_data): set_global_data("id", data.get("id")) set_global_data("method", data.get("method")) set_global_data("case_input", data.get("case_input")) set_global_data("case_output", data.get("case_output")) try: assert data.get("case_input") == data.get("case_output") except assertionerror: set_global_data("error_step", "断言失败") raise
@user3hook def pytest_html_results_table_header(cells): """ 更改表头信息 :param cells: :return: """ cells.insert(1, html.th('用例id', class_="sortable", col="id")) cells.insert(2, html.th('方法', class_="sortable", col="method")) cells.insert(3, html.th('输入', class_="sortable", col="case_input")) cells.insert(4, html.th('输出', class_="sortable", col="case_output")) cells.pop(-1) # 删除link cells.pop(-2) # 删除test @user4hook def pytest_html_results_table_row(cells): """更改表中数据信息""" cells.insert(1, html.td(global_data.get("id"))) cells.insert(2, html.td(global_data.get("method"))) cells.insert(3, html.td(global_data.get("case_input"))) cells.insert(4, html.td(global_data.get("case_output"))) cells.pop(-1) # 删除link cells.pop(-2) # 删除test
@user5hook def pytest_html_results_table_html(report, data): if report.failed: del data[:] data.append(html.span(f"失败步骤:{global_data.get('error_step')}\n输出结果:{global_data.get('case_output')}", class_='fail log')) elif report.passed: del data[:] data.append(html.div(f"输出结果:{global_data.get('case_output')}", class_='success log'))
可以看到现在生成的报告内容就可以清晰看到测试数据,和我们的用例数据关联上了。
当前只是简单的对报告展示的数据进行了更改,感兴趣可以查看官方文档学习
https://docs.pytest.org/en/latest/reference/reference.html#hooks