【问题标题】:tyring to test for exception using python unittest使用 python unittest 测试异常
【发布时间】:2017-09-11 11:36:10
【问题描述】:

我有以下代码:

class cutomTests(unittest.TestCase, moduleName.className):

    def test_input_too_large(self):
      '''className.functionName should fail with large input'''
      self.assertRaises(moduleName.OutOfRangeError, self.functionName(4000)

我得到了以下结果:

======================================================================
ERROR: test_input_too_large (__main__.customTests)
className.functionName should fail with large input
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/user/workspace//ClassNameTests.py", line 37, in test_input_too_large
  self.assertRaises(toRoman.OutOfRangeError, self.answer(4000))
  File "/home/user/workspace/moduleName.py", line 47, in answer
  raise OutOfRangeError()
OutOfRangeError

所以结果应该是正确的,因为引发了异常???

【问题讨论】:

    标签: python unit-testing exception


    【解决方案1】:

    你需要让assertRaises调用函数而不是自己做:

    self.assertRaises(OutOfRangeError, self.functionName, 4000)
    

    现在,您调用 self.functionName 并将其结果 传递给assertRaises。显然,如果self.functionName 引发和异常,它不会被assertRaises 捕获,因为那时还没有调用assertRaises :-)。

    注意,从 python2.7 开始,assertRaises 可以用作上下文管理器,这更方便:

    with self.assertRaises(OutOfRangeError):
        self.functionName(4000)
    

    【讨论】:

      【解决方案2】:

      没有。您应该使用assertRaises 方法作为上下文管理器。

      with self.assertRaises(moduleName.OutOfRangeError):
          self.functionName(4000)
      

      另一种用法是将函数和参数作为下一个参数传递。然而它并不那么漂亮:

      self.assertRaises(moduleName.OutOfRangeError, self.functionName, 4000)
      

      【讨论】:

      • 两者有什么区别,上下文管理器是做什么的
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-01
      • 2014-01-04
      • 1970-01-01
      相关资源
      最近更新 更多