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

为何Python的assertRaises单元测试抛出异常时仍报错?

问题解决:unittest assertRaises结合parameterized测试异常失败

问题场景

编写了validate_length方法,接收字符串,长度非5位时抛出异常。使用unittest的assertRaises结合parameterized做单元测试时,控制台直接抛出异常,测试结果显示FAILED (errors=2),期望测试能通过显示OK。已确认文件结构、导入正常,其他测试可运行。

方法代码

def validate_length(guess):
    if len(guess) != 5:
        raise Exception("Invalid guess length")

原测试代码

@parameterized.expand([
    ("FOR"),
    ("FERVER"),
])
def test_for_wrong_word_length(self, guess):
    self.assertRaises(Exception, tally("FAVOR", guess))

测试输出

Exception: Invalid guess length
Exception: Invalid guess length

FAILED (errors=2)

错误原因

  1. parameterized参数格式错误:@parameterized.expand的每个测试用例必须是元组,即使只有一个参数,也要写成("FOR",)(末尾加逗号),否则会被解析成字符串的单个字符,导致参数传递错误。
  2. assertRaises用法错误:直接调用tally("FAVOR", guess)(此处应为笔误,实际要测试的是validate_length)会立即执行函数,提前抛出异常,assertRaises根本没机会捕获。正确用法是传递函数对象和参数,或者使用上下文管理器语法。

修正后的测试代码

@parameterized.expand([
    ("FOR",),  # 每个用例是元组,末尾加逗号
    ("FERVER",),
])
def test_for_wrong_word_length(self, guess):
    # 方式1:传递函数对象和参数
    self.assertRaises(Exception, validate_length, guess)
    
    # 方式2:使用上下文管理器(更直观推荐)
    with self.assertRaises(Exception):
        validate_length(guess)

说明

  • 修正后,assertRaises会正确捕获validate_length抛出的异常,测试会判定为通过,控制台不再显示异常信息,最终测试结果会显示OK。
  • 原代码中的tally属于笔误,需替换为实际要测试的validate_length函数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 05:22:07