我有一个尝试/除以下的函数:
def func_A():
try:
# do some stuff
except Exception as e:
log.error("there was an exception %s", str(e))
我想为此func_A()
编写单元测试
更重要的是,我想确保
为了安全,我try/except
。
除非存在错误,否则A中不应该抛出任何异常(尽管它会被try/except
捕获),这就是我想要通过单元测试验证的内容。
单元测试的最佳方法是捕获抛出并捕获异常的情况?
答案 0 :(得分:3)
如果你真的需要这个,一种可能的方法是模拟log.error
对象。调用func_A
函数后,您可以断言您的模拟未被调用。
请注意,如果您不打算实际处理它们,则根本不应捕获异常。为了获得适当的测试覆盖率,您应该在此处提供2个测试 - 一个用于检查try / except的每个分支。
答案 1 :(得分:2)
另一种可能的解决方案是将实现拆分为两个函数:
foo()
,其逻辑没有try语句。这样,您可以确保在您的实现中不会抛出任何异常。safe_foo()
将foo()
包装成try语句。然后你可以模拟foo()
来模拟它抛出一个异常并确保捕获每个异常。缺点是foo()
将成为公共接口的一部分,或者您将为私有函数编写测试。
答案 2 :(得分:0)
您可以使用一个变量来跟踪正确执行的功能或以异常结束。
def func_A():
function_state = True
try:
# do some stuff
except Exception as e:
log.error("there was an exception %s", str(e))
function_state = False
return function_state
使用assertTrue
验证function_state
。
答案 3 :(得分:0)
选项1:不要。这是测试实现细节。尝试编写测试套件,以便功能完成您需要它完成的所有操作。如果它能够满足你想要的输入,你就会很好。
选项2:您可以修改函数以将记录器作为参数。然后在测试用例中,传入mock object并检查是否调用了日志记录方法。