为什么没有pythons unittest.assertRaises()在这里引发错误?

时间:2016-05-30 10:20:03

标签: python unit-testing

使用Python 3.5,为什么运行时会通过以下所有测试?由于调用Exception时未提出divassertRaises()如何抱怨?

根据assertRaises()的文档:"如果没有引发异常,则会失败"。

有人能帮助我吗?

..
----------------------------------------------------------------------
Ran 2 tests in 0.002s




def div(self, x, y):
    if y == 0:
        raise Exception("Division by zero")
    return x / y

class MyTest(unittest.TestCase):

    def test1(self):
        with self.assertRaises(Exception) as cm:
            self.div(2, 1)

    def test2(self):
        self.assertRaises(Exception, div, 2, 1)

3 个答案:

答案 0 :(得分:5)

因为您使用错误的签名调用了div并且在调用div之前引发了异常(div的实际主体未执行,因此在执行之前引发了异常)。

要获得更清晰的图片,了解正在进行的操作,尝试从div引发ZeroDivisionError并在您的测试用例中将assertRaises(Exception, ...替换为assertRaises(ZeroDivisionError, ...

答案 1 :(得分:2)

当您致电self.div()时,会引发异常 ,因为您已在div类之外定义了MyTest方法。

这也是为什么在测试中验证异常消息的好主意:

with self.assertRaises(Exception) as exc:
    self.div(2, 1)
self.assertEqual("Division by zero", str(exc.exception))

答案 2 :(得分:0)

您还可以使用:

self.assertRaises(Exception, lambda: div(2, 0))