如何用Python unittest标准库检查函数是否抛出多个异常之一?
在unittest中测试函数是否抛出多个异常中的任意一个
方法1:传入异常类型元组(最简洁)
unittest.TestCase.assertRaises() 支持传入异常类型的元组,只要函数抛出元组中的任意一种异常,测试就会通过。你之前的写法错误是因为把第二个异常类型当成了调用参数(assertRaises的第二个位置参数是待调用的对象,而非第二个异常类型)。
修改你的测试用例如下:
from statistics import mean, StatisticsError import unittest def my_list_mean(lof): # return sum(lof) / len(lof) # ZeroDivisionError return mean(lof) # StatisticsError class TestMultipleWaysToComputeMean(unittest.TestCase): def test_zero_division_or_statistics_error(self): # 传入异常类型的元组 with self.assertRaises((ZeroDivisionError, StatisticsError)): my_list_mean([]) if __name__ == "__main__": unittest.main()
不管my_list_mean是哪种实现,只要抛出ZeroDivisionError或StatisticsError,这个测试都会通过。
方法2:手动捕获并验证异常类型(更灵活)
如果需要对异常做额外验证(比如检查异常消息),可以用try-except块手动捕获,然后判断异常类型是否在允许范围内:
class TestMultipleWaysToComputeMean(unittest.TestCase): def test_zero_division_or_statistics_error(self): allowed_exceptions = (ZeroDivisionError, StatisticsError) try: my_list_mean([]) except allowed_exceptions: # 抛出了预期的异常,直接通过 pass except Exception as e: # 抛出了非预期的异常,标记测试失败 self.fail(f"意外抛出异常:{type(e).__name__}") else: # 没有抛出任何异常,标记测试失败 self.fail("未抛出预期的异常")
这种方式适合需要自定义断言逻辑的场景,比如你想同时验证异常的具体信息。
内容的提问来源于stack exchange,提问作者Alexander L. Hayes
相关产品推荐
相关产品推荐

