You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何pytest-html报告无法显示Fixture错误时的截图?是否不支持ERROR案例?

pytest-fixture执行失败时截图无法在pytest-html报告中显示的问题

我定义了一个带autouse=True的@pytest.fixture,用于执行每个测试用例的前置必要步骤。当该fixture执行失败(例如超时)时,pytest-html生成的HTML报告会将状态标记为ERROR,但不会捕获截图。

我给这个fixture编写了一个装饰器screenshot_on_fixture_failure,用于捕获异常时生成截图并添加到extras中,截图功能本身正常,但截图并未显示在报告中。想问是否是因为pytest-html不支持为ERROR案例添加截图?


Fixture代码

@pytest.fixture(autouse=True)
@screenshot_on_fixture_failure
def open_videochat_page(vi_rewrite_gui, request, extras):
    global ident_id
    vi_rewrite_gui.mobile_number = '+656181985165'
    vi_rewrite_gui.open_userdata_page(shortname).fill_userdata_successfully()
    vi_rewrite_gui.click_consent_btn()
    vi_rewrite_gui.click_continue_btn()
    vi_rewrite_gui.wait_for_channel_chooser()
    vi_rewrite_gui.wait_for_page_to_load()
    ident_id = vi_rewrite_gui.get_ident_id()
    vi_rewrite_gui.select_web_channel().fill_web_channel_successfully().click_ready_continue()
    vi_rewrite_gui.wait_for_cqc_success()

装饰器代码

def screenshot_on_fixture_failure(fixture_func):
    @wraps(fixture_func)
    def wrapper(*args, **kwargs):
        try:
            # 执行原fixture函数
            return fixture_func(*args, **kwargs)
        except Exception as e:
            extras = kwargs.get('extras')
            request = kwargs.get('request')
            driver_instance = kwargs.get('vi_rewrite_gui')
            screenshot_name = f"{request.node.name} - {datetime.now().strftime('%Y-%m-%d_%H-%M-%S')}.png"
            image = driver_instance.take_screenshot_base64()

            extras.append(pytest_html.extras.image(image, name=screenshot_name))

            print(f"Fixture错误已截图: {screenshot_name}")
            print(f"Fixture错误信息: {str(e)}")
            # 重新抛出异常使测试标记为失败
            raise e
    return wrapper

问题原因及解决办法

不是pytest-html不支持为ERROR案例添加截图,问题出在操作extras的方式上:当fixture执行失败时,直接往传入的extras列表追加内容无法被pytest-html正确捕获,此时测试用例的上下文绑定逻辑还未完成。

正确的做法是通过request.node的extra属性添加截图,修改后的装饰器代码如下:

from datetime import datetime
from functools import wraps
import pytest_html

def screenshot_on_fixture_failure(fixture_func):
    @wraps(fixture_func)
    def wrapper(*args, **kwargs):
        try:
            return fixture_func(*args, **kwargs)
        except Exception as e:
            request = kwargs.get('request')
            driver_instance = kwargs.get('vi_rewrite_gui')
            screenshot_name = f"{request.node.name} - {datetime.now().strftime('%Y-%m-%d_%H-%M-%S')}.png"
            image = driver_instance.take_screenshot_base64()

            # 直接操作request.node的extra属性
            request.node.extra.append(pytest_html.extras.image(image, name=screenshot_name))

            print(f"Fixture错误已截图: {screenshot_name}")
            print(f"Fixture错误信息: {str(e)}")
            raise e
    return wrapper

这样修改后,当fixture抛出异常时,截图会被正确添加到测试节点的额外内容中,pytest-html生成报告时就能显示这张截图了。

内容的提问来源于stack exchange,提问作者Vladimir Popescu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 09:57:34