-- Pytest 基础使用教程[2]
从测试报告说起
承接上一篇中最后的测试结果图, 使用过的 pytest-html 插件原生态的报告的话. 可能会发现 内容样式都有些不同. 其实是做了些扩展相关设置所呈现的效果, 当然可以定制的更深度一些, 更加中文, 本地化, 又或者根据公司需要进行定向研发. 例如就上文中的测试报告进行一些中文定制改造后效果如下图所示. 这篇就如何优化, 定制 pytest-HTML 测试报告进行些讲解
Pytest-HTML 扩展
目前最新的 pytest-HTML 版本为 2.1.1 . 这个版本共提供 5 个 Hook, 分别是:
def pytest_html_report_title(report)
设置测试报告的标题
def pytest_html_results_summary(prefix, summary, postfix)
在 Summary 部分, 添加自定义内容
def pytest_html_results_table_header(cells)
定制 Result 部分, 表单的头部
def pytest_html_results_table_row(report, cells)
定制 Result 部分, 每行测试 Case 的内容
def pytest_html_results_table_html(report, data)
在完成 Result 渲染后, 详情新增写 HTML 标记语言内容
测试报告 Title
所谓 Title 指代的是报告图中[豆瓣网自动化测试示例(基于 Pytest)] 行文字内容. Report 其实是 插件的 HTMLReport 对象, 简单看下源码, 相信使用上就能很好的把握理解. 关键部分见红框
所以, 这个扩展而言只需要 conftest.py 对于扩展 hook 中设置下 report title 字段就能够, 按需修改标题.
- @pytest.hookimpl(optionalhook=True)
- def pytest_html_report_title(report):
- report.title = "豆瓣网自动化测试示例(基于 Pytest)"
扩展 Summary 部分
Summary 扩展设计, 允许对于 整个模块进行定制. 分为前 (prefix), 中(summary), 后(postfix) 三个部分进行设置. 同样的 看下源码, 更好的把握如何来使用. 关键部分见红框
其实, 就是把 前中后三个部分的 HTML 拼接起来, 中部(summary) 会有些插件默认的 HTML 内容.
所以, 扩展使用上就很明晰了, 只需要把 HTML 设置进去即可.
- @pytest.hookimpl(optionalhook=True)
- def pytest_html_results_summary(prefix, summary, postfix):
- prefix.extend([HTML.p("测试人: 姜子轩")])
Result 表格的扩展
可以分成两部分, 一部分是表头的设置. 同样的通过 cells 来生成 Result 表格的头部.
看完上述源码相信, pytest_html_results_table_header 使用上就非常明确了. 主要就是对 cells 进行操作.
- @pytest.hookimpl(optionalhook=True)
- def pytest_html_results_table_header(cells):
- cells.insert(2, HTML.th('模块'))
- cells.insert(3, HTML.th('描述'))
- cells.insert(4, HTML.th('时间', class_='sortable time', col='time'))
- cells.pop()
对于每一行数据进行扩展上, 也就是 pytest_html_results_table_row,pytest_html_results_table_html. 这两个的使用, 同样先看下源码.
其中两个函数的关键点在于 report 参数, cells 与 data 用来制定扩展的 HTML 标签, 而内容上通过 report 来进行透传. 所以 这里一般会结合 pytest 内置的 hook 来使用, pytest_runtest_makereport. 具体来说如下:
{{uploading-image-119142.PNG(uploading...)}}
具体代码演示.
- @pytest.hookimpl(optionalhook=True)
- def pytest_html_results_table_row(report, cells):
- cells.insert(2, HTML.td(report.module))
- cells.insert(3, HTML.td(report.description))
- cells.insert(4, HTML.td(datetime.utcnow(), class_='col-time'))
- cells.pop()
- @pytest.hookimpl(hookwrapper=True)
- def pytest_runtest_makereport(item, call):
- outcome = yield
- report = outcome.get_result()
- report.description = str(item.function.__doc__)
- report.module = str(item.module.__doc__)
深度定制
以上内容, 可以看到 Pytest-HTML v2.1.2 版本 提供的全部扩展功能, 能够对 title,summary,table 进行内容扩展研发. 不过, 无法实现本文最前面全中文报告. 所以 想要完美 的根据公司, 业务需求改造, 这里提供一个思路方法可以将 Pytest-HTML 源码下载下来进行改造. 其 整体的实现并不复杂, 主要逻辑 在 plugin.py 里面.
{{uploading-image-431444.PNG(uploading...)}}
其中, 整个报告的生成 在 _generate_report 函数 中. 在本篇中就不深入来说实现, 计划在后续 pytest 插件研发, Pytest-HTML 实现中进一步分享
如果对本文 深度定制中文版报告 改造或者 是上文中扩展源码有兴趣的可以关注 公众号私信交流.
来源: https://www.cnblogs.com/jzhlin/p/12989263.html