unittest 中的 assertRaises 没有正确捕获异常
assertRaises in unittest not catching Exception properly
我有一个文件 testtest.py,其中包含代码
import unittest
def add(self, a, b):
return a + b
class Test(unittest.TestCase):
def test_additon(self):
self.assertRaises(TypeError, add, 1 + '1', msg="Additon failed")
#self.assertRaises(TypeError, lambda: add(1 + '1'), msg="Addition failed")
if __name__ == '__main__':
unittest.main()
问题是 assertRaises
没有正确捕获异常,我的所有测试都失败,因为错误不是基于条件的,这是我得到的输出:
E
======================================================================
ERROR: test_additon (__main__.Test)
----------------------------------------------------------------------
Traceback (most recent call last):
File "testtest.py", line 9, in test_additon
self.assertRaises(TypeError, add, 1 + '1', msg="Additon failed")
TypeError: unsupported operand type(s) for +: 'int' and 'str'
----------------------------------------------------------------------
Ran 1 test in 0.000s
FAILED (errors=1)
我知道我可以通过使用 lambda(我在代码中将其注释掉)使我的测试正确捕获异常来绕过它,但是根据文档,将可调用对象和参数传递给 assertRaises
应该可以工作,因为它会在内部自行调用该函数,并能够捕获引发的任何异常。
assertRaises(*callable*, *args*, *kwargs*)
但事实并非如此
如果我 运行 它与 lambda 是一个可调用的,稍后将由 assertRaises
评估,它按预期工作,我得到这个
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
I'm running python 3.5
Python 3.5.2 (default, Jun 28 2016, 08:46:01)
[GCC 6.1.1 20160602] on linux
但我也得到与 python2.7
相同的行为
您应该将参数单独作为单独的参数传递给可调用对象:
self.assertRaises(TypeError, add, 1, '1', msg="Additon failed")
尝试
def test_additon(self):
with self.assertRaises(TypeError):
add(1 + '1')
问题是在 self.assertRaises 可以启动之前参数评估期间引发了异常。
在我的例子中,我犯了一个愚蠢的错误,我调用了两次被测试的函数,而 assertRaises()
在第二次调用该函数时。
因此 Exception
在第一次调用中被引发,甚至在第二次调用执行之前!
希望这对调试时点击此页面的任何人有所帮助。
我有一个文件 testtest.py,其中包含代码
import unittest
def add(self, a, b):
return a + b
class Test(unittest.TestCase):
def test_additon(self):
self.assertRaises(TypeError, add, 1 + '1', msg="Additon failed")
#self.assertRaises(TypeError, lambda: add(1 + '1'), msg="Addition failed")
if __name__ == '__main__':
unittest.main()
问题是 assertRaises
没有正确捕获异常,我的所有测试都失败,因为错误不是基于条件的,这是我得到的输出:
E
======================================================================
ERROR: test_additon (__main__.Test)
----------------------------------------------------------------------
Traceback (most recent call last):
File "testtest.py", line 9, in test_additon
self.assertRaises(TypeError, add, 1 + '1', msg="Additon failed")
TypeError: unsupported operand type(s) for +: 'int' and 'str'
----------------------------------------------------------------------
Ran 1 test in 0.000s
FAILED (errors=1)
我知道我可以通过使用 lambda(我在代码中将其注释掉)使我的测试正确捕获异常来绕过它,但是根据文档,将可调用对象和参数传递给 assertRaises
应该可以工作,因为它会在内部自行调用该函数,并能够捕获引发的任何异常。
assertRaises(*callable*, *args*, *kwargs*)
但事实并非如此
如果我 运行 它与 lambda 是一个可调用的,稍后将由 assertRaises
评估,它按预期工作,我得到这个
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
I'm running python 3.5
Python 3.5.2 (default, Jun 28 2016, 08:46:01)
[GCC 6.1.1 20160602] on linux
但我也得到与 python2.7
您应该将参数单独作为单独的参数传递给可调用对象:
self.assertRaises(TypeError, add, 1, '1', msg="Additon failed")
尝试
def test_additon(self):
with self.assertRaises(TypeError):
add(1 + '1')
问题是在 self.assertRaises 可以启动之前参数评估期间引发了异常。
在我的例子中,我犯了一个愚蠢的错误,我调用了两次被测试的函数,而 assertRaises()
在第二次调用该函数时。
因此 Exception
在第一次调用中被引发,甚至在第二次调用执行之前!
希望这对调试时点击此页面的任何人有所帮助。