【问题标题】:Pass a Python unittest if an exception isn't raised如果未引发异常,则通过 Python 单元测试
【发布时间】:2011-09-05 02:38:58
【问题描述】:

在 Python unittest 框架中,有没有办法在没有引发异常的情况下通过单元测试,否则通过 AssertRaise 失败?

【问题讨论】:

标签: python unit-testing


【解决方案1】:

如果我正确理解您的问题,您可以执行以下操作:

def test_does_not_raise_on_valid_input(self):
    raised = False
    try:
        do_something(42)
    except:
        raised = True
    self.assertFalse(raised, 'Exception raised')

...假设你有一个相应的测试,正确的Exception 在无效输入上得到提升,当然:

def test_does_raise_on_invalid_input(self):
    self.assertRaises(OutOfCheese, do_something, 43)

但是,正如 cmets 中所指出的,您需要考虑实际上测试的是什么。很可能是这样的测试......

def test_what_is_42(self):
    self.assertEquals(do_something(42), 'Meaning of life')

...更好,因为它测试系统的期望行为,如果引发异常 将失败。

【讨论】:

  • 恕我直言,像这样的东西应该是 unittest.TestCase 类的一部分,想要它是一件尴尬的事情,但我不能成为唯一想要它的人。
  • @Levi Campbell:我同意,assertDoesNotRaise() 方法会更整洁。注意:自从你接受后,我已经编辑了我的答案。
  • 为什么要先捕获一个异常然后引发另一个异常?只需调用do_something(),如果引发异常,测试将自动失败。这也是assertDoesNotRaise()不存在的原因。
  • @Sven Marnach:你是对的,我已经相应地更新了我的答案。我最初回答了所提出的问题,没有适当考虑潜在问题的性质。
  • 否 @SvenMarnach 不正确:引发错误和未通过测试是有区别的。如果 do_something() 在您的上一个版本中引发错误,则测试将退出并出现错误,而不是记录您真正想要的测试失败。
【解决方案2】:

此页面上的许多 cmets 将错误和失败视为等效,但事实并非如此。我认为正确的解决方案是在引发异常时明确地使测试失败。例如:

def test_does_not_error(self):
    try:
        code_under_test()
    except ThatException:
        self.fail("code_under_test raised ThatException")

【讨论】:

  • 同意——虽然错误和失败的控制台输出通过人工读取的解析相当,但大多数自动化单元测试工具对这两者的处理方式截然不同,对吧?
  • 默认假设代码不会出错。测试应该测试期望的行为。我看不到 try/except 块增加了什么价值。事实上,它降低了测试的有用性,因为输出不包括回溯,如果你只是让代码失败的话。
  • try/except 块添加的一个价值是它为 OP 提供了他们所要求的内容。我知道这是一个偏好问题;这种风格是我对未处理异常的偏好。通过捕获指示已知问题的特定异常,可以比必须扫描一屏回溯输出更快地理解故障。如果这是一个真实的测试而不是示例,并且异常的回溯或其他细节很重要,那么它们也可以在self.fail 中报告。
【解决方案3】:

只需调用您的功能,例如do_something()。如果引发未处理的异常,测试将自动失败!真的没有理由做任何其他事情。这也是assertDoesNotRaise()不存在的原因。


来源:Sven 的评论

【讨论】:

  • 这不是真的,好像方法引发了错误,那么测试用例将被标记为error 而不是failure
  • @IslamTaha 它有什么不同?无论哪种方式,它都必须修复。
  • @Acumenus 的重点不仅仅是修复测试,原则上您可以通过作弊来修复测试。关键是测试的目的是让您准确了解代码中发生的情况,区分异常、纯粹的代码错误和故障是基本的。
  • 如果你在考试中作弊,你会遇到更大的问题。例如,如果我在检查体重时将一只脚放在地板上,那么这不是体重秤的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-27
  • 2023-02-06
  • 2010-10-13
  • 1970-01-01
  • 2020-01-13
  • 1970-01-01
  • 2013-07-29
相关资源
最近更新 更多