当前位置:首页 > 技术 > 正文内容

pytest-html测试报告定制优化

访客 技术 2026年5月29日 1

测试报告优化要点

实际项目中需调整环境信息展示,优化用例描述显示,移除冗余列并控制日志输出。以下配置均在conftest.py中实现:

环境信息配置

from py.xml import html
import pytest

def pytest_configure(config):
    config._metadata["项目名称"] = "汽车钣喷应用测试"
    if "JAVA_HOME" in config._metadata:
        del config._metadata["JAVA_HOME"]
    if "Plugins" in config._metadata:
        del config._metadata["Plugins"]

@pytest.mark.optionalhook
def pytest_html_results_summary(prefix):
    prefix.append(html.p("测试团队: QA部门"))
    prefix.append(html.p("执行人员: 李明"))

用例描述与列调整

@pytest.mark.optionalhook
def pytest_html_results_table_header(cells):
    cells.insert(1, html.th('用例说明'))
    del cells[-1]

@pytest.mark.optionalhook
def pytest_html_results_table_row(report, cells):
    cells.insert(1, html.td(report.test_desc))
    del cells[-1]

@pytest.mark.hookwrapper
def pytest_runtest_makereport(item, call):
    outcome = yield
    result = outcome.get_result()
    result.test_desc = str(item.function.__doc__)

日志输出控制

@pytest.mark.optionalhook
def pytest_html_results_table_html(report, data):
    if report.passed:
        data.clear()
        data.append(html.div('用例执行成功', class_='log-info'))

失败截图功能

shared_values = {}

@pytest.fixture
def store_value():
    def _store(key, val):
        shared_values[key] = val
    return _store

@pytest.mark.hookwrapper
def pytest_runtest_makereport(item):
    pytest_html = item.config.pluginmanager.getplugin('html')
    outcome = yield
    test_report = outcome.get_result()
    extras = getattr(test_report, 'extra', [])
    
    if test_report.when in ('call', 'setup'):
        if test_report.failed:
            case_id = test_report.nodeid.replace("::", "_")
            img_data = capture_screenshot()
            if img_data:
                img_html = f'<div><img src="data:image/png;base64,{img_data}" style="width:600px;" /></div>'
                extras.append(pytest_html.extras.html(img_html))
        test_report.extra = extras

def capture_screenshot():
    return shared_values.get('driver').get_screenshot_as_base64()

测试统计收集

def pytest_terminal_summary(reporter, exitstatus, config):
    total_cases = reporter._numcollected
    passed = len([r for r in reporter.stats.get('passed', []) if r.when != 'teardown'])
    failed = len([r for r in reporter.stats.get('failed', []) if r.when != 'teardown'])
    pass_rate = f"{passed/total_cases*100:.2f}"
    
    duration = time.time() - reporter._sessionstarttime
    time_used = f"{duration:.2f}秒"
    
    stats_text = f"总用例: {total_cases} | 通过: {passed} | 失败: {failed} | 成功率: {pass_rate}% | 耗时: {time_used}"
    shared_values['test_stats'] = stats_text

应用示例

class TestUI:
    @pytest.fixture(autouse=True)
    def init_driver(self, store_value):
        driver = webdriver.Remote(
            command_executor='http://localhost:4723/wd/hub',
            options=webdriver.ChromeOptions()
        )
        store_value('driver', driver)

统计结果通过shared_values['test_stats']获取,可直接用于邮件通知:

邮件统计展示

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。