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

pytest.raises上下文管理器异常值断言失效 测试误判通过问题

问题原因
  • 核心问题是断言代码的位置写在了pytest.raises上下文管理器内部,且位于触发异常的代码之后:当raise_custom_exception()执行抛出异常后,上下文管理器会立刻捕获该异常,终止上下文内部后续代码的执行,所以后面的assert语句根本没有运行,无论断言的逻辑是否成立都不会触发测试失败,最终用例被判定为通过。
  • 次要问题是断言对象使用错误:execinfo是pytest封装的异常信息容器对象,不是异常本身的消息内容,直接和字符串做等值判断永远返回False,就算断言被执行也会抛出不符合预期的错误。
修复方案

需要把异常内容的断言移到pytest.raises上下文管理器外部,同时通过execinfo.value获取实际抛出的异常对象,再提取异常消息做比较。

修复后的代码示例

import pytest

class CustomException(Exception):
    """Custom Exception"""
    
    
def raise_custom_exception():
    raise CustomException("This is a test exception")

def test_custom_exception():
    with pytest.raises(CustomException) as execinfo:
        raise_custom_exception()
    # 断言移到上下文管理器外部,正确获取异常消息做比较
    assert str(execinfo.value) == "This is not being caught"

修改后执行测试就会正确触发断言失败,符合预期逻辑。如果是正常校验场景,把断言的期望值改成和实际抛出的异常消息一致即可。

如果不需要对异常做复杂校验,也可以直接使用pytest.raises的match参数直接匹配异常消息,写法更简洁:

def test_custom_exception():
    with pytest.raises(CustomException, match="This is a test exception"):
        raise_custom_exception()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 16:36:03