在Python中,如何为 `assertRaises()` 使用自定义的失败消息?

10 浏览
0 Comments

在Python中,如何为 `assertRaises()` 使用自定义的失败消息?

Python 2.7的unittest文档指出:\n除了assertRaises()和assertRaisesRegexp()之外,所有的assert方法都接受一个msg参数,如果指定了该参数,就会在失败时使用它作为错误消息。\n但是如果我想为assertRaises()或assertRaisesRegexp()指定错误消息怎么办?\n用例:在循环中测试各种值时,如果有一个失败了,我想知道是哪一个:\nNON_INTEGERS = [0.21, 1.5, 23.462, math.pi]\nclass FactorizerTestCase(unittest.TestCase):\n def test_exception_raised_for_non_integers(self):\n for value in NON_INTEGERS:\n with self.assertRaises(ValueError):\n factorize(value)\n如果其中任何一个失败了,我会得到:\nAssertionError: ValueError not raised\n对于我来说,这并没有太大帮助,无法确定是哪一个失败了...如果我能像assertEqual()等方法一样提供msg参数就好了!\n(当然,我可以将它们拆分为单独的测试函数 - 但也许我想要测试很多值,或者需要一些缓慢/昂贵的设置,或者它是更长的功能测试的一部分)\n如果我能轻松地让它报告类似于以下内容就好了:\nAssertionError: ValueError not raised for input 23.462\n但这也不是一个足够重要的事情,不值得重新实现/扩展assertRaises()并在我的测试中添加更多代码。

0
0 Comments

在Python中,我们经常使用`assertRaises()`来测试代码中是否抛出了预期的异常。然而,`assertRaises()`的默认错误消息可能不够清晰,不方便我们定位问题。那么有没有办法自定义`assertRaises()`的错误消息呢?

上述代码段展示了一个自定义`assertRaises()`错误消息的解决方案。在这段代码中,我们使用了一个`try-except`语句来捕获我们期望的异常。如果代码成功捕获到了异常,那么说明代码运行正常,我们可以通过`return`语句来结束测试。如果没有捕获到异常,那么我们可以使用`self.fail()`来手动触发一个测试失败,并自定义错误消息。

通过这种方式,我们可以更灵活地控制`assertRaises()`的错误消息,使其更加符合我们的需求。这样可以提高测试代码的可读性和可维护性,并更方便地定位问题。

0
0 Comments

在Python中,当使用`assertRaises()`断言时,出现了需要自定义失败消息的情况。下面是两种解决方法:

1. 最简单(但有点糟糕)的方法是使用`with ...`语法,并在失败时自定义失败消息。代码如下:

for value in NON_INTEGERS:
    with self.assertRaises(ValueError) as cm:
        cm.expected.__name__ = 'ValueError for {}'.format(value)  # custom failure msg
        factorize(value)

这将在失败时报告如下错误:

AssertionError: ValueError for 23.462 not raised

需要注意的是,这种方法只在使用`with ...`语法时有效。它之所以有效,是因为`assertRaises()`上下文管理器在内部做了以下操作:

exc_name = self.expected.__name__
…
raise self.failureException(
    "{0} not raised".format(exc_name))

因此,如果实现发生了更改,这种方法可能会失效,尽管Python 3的源代码与此相似,应该也可以使用(但我没有尝试过)。

2. 最简单(不依赖实现)的方法是捕获错误并重新引发它,同时改进错误消息。代码如下:

for value in NON_INTEGERS:
    try:
        with self.assertRaises(ValueError) as cm:
            factorize(value)
    except AssertionError as e:
        raise self.failureException('{} for {}'.format(e.message, value)), sys.exc_info()[2]

其中`sys.exc_info()[2]`用于重用原始的堆栈跟踪,但这种语法只适用于Python 2。这个答案解释了如何在Python 3中实现类似的功能,并且也启发了这个解决方法。

然而,这种解决方法已经让测试变得难以阅读,所以我更喜欢第一种选项。如果需要更好的解决方案,则需要编写包装版本的`assertRaises()`和`_AssertRaisesContext`类,但在出现失败时添加一些日志可能更简单。

0
0 Comments

在Python中,assertRaises()是一个用于测试异常的断言方法。它用于确保在代码块中引发了指定的异常类型。但是,assertRaises()在默认情况下只能提供一个固定的失败消息,无法提供自定义的失败消息。

以上内容中提到了一种解决方法,即使用self.fail()方法来代替assertRaises()方法。这种方法可能会有一些繁琐,但在视觉上看起来不那么hacky。

为了提供一个自定义的失败消息,可以使用with语句块结合assertRaises()方法。在这个代码块中,可以执行被测试的代码,并使用self.fail()方法来提供一个自定义的失败消息。具体的代码示例如下:

for value in NON_INTEGERS:
    with self.assertRaises(ValueError) as cm:
        factorize(value)
        self.fail('ValueError not raised for {}'.format(value))

这段代码非常干净,而且能正常工作。希望这个解决方法能够得到广泛的应用。

0