【问题标题】:Customize AssertionError in Python在 Python 中自定义 AssertionError
【发布时间】:2015-11-03 01:02:35
【问题描述】:

我正在尝试为我的代码中的所有断言错误添加一些文本。

这是我的代码:

class AssertionError(Exception):
    def __init__(self, msg):
        Exception.__init__(self, msg)
        self.message = msg + "+ SOME TEXT"

assert 1 == 2, "FAIL"

结果是

__main__.AssertionError: FAIL

我希望看到结果:“FAIL + SOME TEXT”


单元测试也有问题。 我想为所有失败的测试添加一些文本(不更新所有短信)。

import unittest

class TestCase(unittest.TestCase):
    def test1(self):
        self.assertTrue(False, "FAIL!")

    def test2(self):
        self.assertLessEqual(10, 2, "FAIL!")

if __name__ == "__main__":
    unittest.main()

【问题讨论】:

  • 如果以下答案之一解决了您的问题,您应该接受它(单击相应答案旁边的复选标记)。这有两件事。它让每个人都知道您的问题已得到您满意的解决,并为帮助您的人提供帮助。 See here 以获得完整的解释。
  • 看起来它不适用于 unittest。如果我在测试中失败,我看不到其他信息。

标签: python assert


【解决方案1】:

这类似于Morgan's answer,但使用稍微不同的方式来实现相同的结果:

>>> class AssertionError(AssertionError):
    def __init__(self, msg):
        super().__init__(msg + ' SOME TEXT')

>>> assert 1 == 2, 'FAIL'
Traceback (most recent call last):
  File "<pyshell#4>", line 1, in <module>
    assert 1 == 2, 'FAIL'
AssertionError: FAIL SOME TEXT

【讨论】:

  • 子类化ExceptionAssertionError 之间有什么真正的区别吗?我其实不确定。我认为不会,因为您正在隐藏内置 AssertionError,但我可能是错的。
  • 新的AssertionError 将仅在当前命名空间中隐藏builtins 模块中的版本。如果另一个模块正在使用buitins'AssertionError,并且由于AssertionError 继承自原始类,那么如果发生错误,另一个模块仍可能捕获错误。
  • 嗯,有趣。我会假设它仍然会抛出另一个模块识别为 AssertionError 的东西,但很高兴知道。
  • 它在失败时不起作用 unittest.assertTrue(False, "FAIL")
  • @Helga 您可能需要import unittest.case 然后unittest.case.TestCase.failureException = AssertionError 才能使其按预期工作。或者,您可以改写 from unittest.case import TestCase as TCTC.failureException = AssertionError
【解决方案2】:

问题是您没有对self.message = msg + "+ SOME TEXT" 做任何事情。您必须将您想要的自定义消息传递给Exception.__init__

这对你有用:

class AssertionError(Exception):
    def __init__(self, msg):
        self.message = msg + " SOME TEXT"
        super().__init__(self, self.message)
assert 1 == 2, "FAIL"

如果你想在以后查看消息,你可以使用 try/except 并像这样捕获自定义消息:

try:
    assert 1 == 2, "FAIL"
except AssertionError as e:
    print(e.message)

【讨论】:

    【解决方案3】:

    此变体完全按照引发的异常保留异常,并仅修改其字符串表示:

    class AssertionError(AssertionError):
        def __str__(self):
            return super().__str__() + "SOME TEXT"
    

    (信用:从 Noctis 的答案中提取的子类)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-27
      • 1970-01-01
      相关资源
      最近更新 更多