7

Python 2.7 unittest 文档说:

所有的 assert 方法(除了assertRaises(), assertRaisesRegexp())都接受一个msg参数,如果指定,则用作失败时的错误消息

…但是如果我想为assertRaises()or指定错误消息assertRaisesRegexp()怎么办?

用例:在循环中测试各种值时,如果一个失败,我想知道哪一个:

NON_INTEGERS = [0.21, 1.5, 23.462, math.pi]

class FactorizerTestCase(unittest.TestCase):
    def test_exception_raised_for_non_integers(self):
        for value in NON_INTEGERS:
            with self.assertRaises(ValueError):
                factorize(value)

如果其中任何一个失败,我会得到:

AssertionError: ValueError not raised

这对我找出哪个失败了没有太大帮助……如果我能提供一个像我一样的msg=论点就好了assertEqual()

(我当然可以将它们分解为单独的测试函数——但也许有很多我想测试的值,或者它需要一些缓慢/昂贵的设置,或者它是更长的功能测试的一部分)

如果我可以很容易地让它报告类似的内容,我会喜欢它:

AssertionError: ValueError not raised for input 23.462

——但这也不是一个足够重要的事情来保证重新实现/扩展assertRaises()并在我的测试中添加更多的代码。

4

4 回答 4

4

您也可以回退到使用self.fail令人讨厌的方法,但我认为看起来不那么老套

for value in NON_INTEGERS:
    with self.assertRaises(ValueError) as cm:
        factorize(value)
        self.fail('ValueError not raised for {}'.format(value))
于 2017-12-22T11:01:19.677 回答
2
于 2017-02-06T10:56:45.860 回答
1

在 Python 3 中,现在将错误消息公开为您从中获取unittest的实例的适当的、可公开访问的属性。所以在 Python 3 中,你可以这样做:_AssertRaisesContextwith self.assertRaises()

with self.assertRaises(ValueError) as assertion:
    assertion.msg = f"ValueError not raised for input {value}"
    factorize(value)
于 2021-08-23T16:18:03.690 回答
1

我用这个代替assertRaises

    def test_empty_username(self):
    # noinspection PyBroadException
    try:
        my_func(username="")
    except Exception:
        # If it does, we are OK.
        return
    # If not, we are here.
    self.fail("my_func() must reject empty username.")
于 2018-04-09T17:15:00.660 回答