对具有try / except的函数的Python单元测试

时间:2016-10-28 21:07:52

标签: python unit-testing

我有一个尝试/除以下的函数:

def func_A():
  try:
       # do some stuff
  except Exception as e:
     log.error("there was an exception %s", str(e))

我想为此func_A()编写单元测试 更重要的是,我想确保

  • A
  • 内没有发现异常

为了安全,我try/except。 除非存在错误,否则A中不应该抛出任何异常(尽管它会被try/except捕获),这就是我想要通过单元测试验证的内容。

单元测试的最佳方法是捕获抛出并捕获异常的情况?

4 个答案:

答案 0 :(得分:3)

如果你真的需要这个,一种可能的方法是模拟log.error对象。调用func_A函数后,您可以断言您的模拟未被调用。

请注意,如果您不打算实际处理它们,则根本不应捕获异常。为了获得适当的测试覆盖率,您应该在此处提供2个测试 - 一个用于检查try / except的每个分支。

答案 1 :(得分:2)

另一种可能的解决方案是将实现拆分为两个函数:

  1. 函数foo(),其逻辑没有try语句。这样,您可以确保在您的实现中不会抛出任何异常。
  2. safe_foo()foo()包装成try语句。然后你可以模拟foo()来模拟它抛出一个异常并确保捕获每个异常。
  3. 缺点是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并检查是否调用了日志记录方法。

相关问题