关于单元测试:Python self.assertRaises

Python self.assertRaises

我有一个小代码如下,请帮助我如何正确地写这个。我想检查value中是否存在id,如果不存在,则会引发异常。

1
2
3
4
value = ({'av' : '123', 'user' : 'abc', 'version' : 'xyz'})

with self.assertRaises(IndexError, value[0]["ID"]):
    print"not an error"


代码的问题在于value[0]["ID"]只是一个任意参数,在python中,参数在执行函数调用之前被评估。所以在你的例子中,assertRaises没有机会拦截错误,因为它没有被调用。

如果您希望使用基于上下文管理器的方法,我想您正在寻找这段代码片段,这对于需要同时计算语句或多个表达式非常有用:

1
2
with self.assertRaises(IndexError):
    value[0]["ID"]

或者,如果需要解析单个表达式(语句在lambda中不起作用),也可以这样做:

1
self.assertRaises(IndexError, lambda: value[0]["ID"])

有关这方面的更多信息,请看一下这个问题,因为它似乎解决了您关于如何正确使用assertRaises的问题。

另外,请注意,在您的情况下,value只是dict,而不是tuple,尽管有括号-为了使value成为单元素tuple,使用foo = (bar, )语法-需要尾随昏迷来区分优先覆盖括号,如(2 + 2) * 3中。

此外,在单元测试中,通常不需要输出与断言状态相关的任何内容——如果断言通过或失败,则单元测试框架的工作就是形成适当的报告。但是,如果您愿意打印它,只要在您的断言之后包含print()–因为如果断言失败,测试将停止运行,并且控制将无法到达您的print()


如果你不坚持assertRaises方法,我宁愿选择assertIn方法:

1
2
value = ({'av' : '123', 'user' : 'abc', 'version' : 'xyz'})
self.assertIn('ID', value)