如何使用Python中的unittest检查代码是否在except块内部

时间:2018-03-12 16:46:44

标签: python python-2.7 python-unittest assertions

我试图编写一个测试用例来检查代码是否在except块内。

如果发生异常,我的方法foo()不会抛出/提升它,它只会记录信息。

我曾尝试使用assertRaises但稍后我意识到这对我不起作用,因为我没有提出异常。

在Python文档中明确指出:

  

测试在使用任何也传递给assertRaises()的位置或关键字参数调用callable时引发异常。如果引发异常则测试通过,如果引发另一个异常则为错误,如果没有引发异常则失败。

所以,如果我有以下方法:

def foo():
    try:
        # Something that will cause an exception
    except AttributeError:
        log.msg("Shit happens")

是否可以编写一个测试用例来测试执行是否在except块内?

2 个答案:

答案 0 :(得分:1)

你不能按照你想要的方式做到这一点。 Python会在整个地方引发和处理异常 - 例如,每个for循环都会通过引发StopIteration来退出。因此,断言某个地方存在异常,即使它已被处理,也几乎总是会过去。

可以做的是模仿记录器,如下所示:

_logs = []
def mocklog(str):
    _logs.append(str)

mymodule.log = mocklog
mymodule.foo()
assertEqual(_logs, ['Shit happens'])

当然,在一个真实的项目中,你可能想要使用一个模拟库而不是像这样手工攻击它,但这应该证明这个想法。

答案 1 :(得分:-1)

你可以像这样使用assertRaises(https://docs.python.org/3/library/unittest.html#unittest.TestCase.assertRaises):

with self.assertRaises(Exception):
     foo()

如果要测试日志记录,还有一个方法assertLogs。