如何在Python中使用unittest检查代码是否进入except块
我一直在尝试编写一个测试用例,该测试用例将检查代码是否位于如何在Python中使用unittest检查代码是否进入except块,python,python-2.7,python-unittest,assertions,Python,Python 2.7,Python Unittest,Assertions,我一直在尝试编写一个测试用例,该测试用例将检查代码是否位于块之外的块中 我的方法foo() 我曾尝试使用,但后来我意识到这对我不起作用,因为我没有提出异常 Python文档中明确指出: 测试在使用任何位置或关键字参数调用callable时是否引发异常,这些参数也传递给assertRaises()。如果引发异常,则测试通过;如果引发另一个异常,则测试出错;如果未引发异常,则测试失败 所以,如果我有以下方法: def foo(): try: # Something that
块之外的块中
我的方法foo()
我曾尝试使用,但后来我意识到这对我不起作用,因为我没有提出异常
Python文档中明确指出:
测试在使用任何位置或关键字参数调用callable时是否引发异常,这些参数也传递给assertRaises()。如果引发异常,则测试通过;如果引发另一个异常,则测试出错;如果未引发异常,则测试失败
所以,如果我有以下方法:
def foo():
try:
# Something that will cause an exception
except AttributeError:
log.msg("Shit happens")
是否可以编写一个测试用例来测试执行是否在except块内部进行?您可以像这样使用assertRaises():
with self.assertRaises(Exception):
foo()
_logs = []
def mocklog(str):
_logs.append(str)
mymodule.log = mocklog
mymodule.foo()
assertEqual(_logs, ['Shit happens'])
如果您想测试日志记录,还有一种方法assertLogs。您不能按照您想要的方式进行测试。Python到处引发和处理异常,例如,for
的每个循环都通过引发和处理StopIteration
退出。因此,断言某个地方存在异常,即使它已被处理,几乎总是会通过的
您可以模拟记录器,如下所示:
with self.assertRaises(Exception):
foo()
_logs = []
def mocklog(str):
_logs.append(str)
mymodule.log = mocklog
mymodule.foo()
assertEqual(_logs, ['Shit happens'])
当然,在现实项目中,您可能希望使用模拟库,而不是像这样手动将其破解,但这应该说明了这一想法。您确实无法测试提出和处理的异常。如果可以的话,在Python中,从hasattr
到简单的for
循环都会引发和处理异常。你可以做的一件事是模拟记录器,并断言您的模拟记录器获得了记录在该处理程序中的消息。OP已经解释了他尝试了此操作,但它不起作用,并且(正确地)解释了它不起作用的原因。在您的更新中,stdlib unittest中没有方法assertLogs
。这是您链接的文档中“Python3.4中新增”的assertLogsNotice?这意味着它不在Python2.7.Wow中,从来没有听说过它,每个for循环都通过引发和处理StopIteration@UserNotFoundException异常在Python中比大多数人意识到的更普遍。从基类调用方法时,将引发并处理在当前类中找不到该方法的异常。当您添加2+3.0
时,int.\uuuu add\uuuu
不知道如何添加浮点,因此它会引发,解释器会调用float.\uuu radd\uuu
。等等其中一些在CPython中有特殊的快速路径优化,但是,更一般地说,异常尽可能简单和快速,因此它们可以在任何地方使用