使用pyunit在Python中测试异常

时间:2012-08-10 13:52:43

标签: python unit-testing python-unittest

我需要测试我的python代码以获得异常,但我似乎无法获得正确的语句来运行 当我测试我的生产代码时,我可以看到抛出了异常但是当我在单元测试文件中测试这个异常时,我得到了这个:

testincorrectparam (unittestearnings.TestEarningsArgs)
should raise error when param not an integer ... "3v" is not a valid argument.  i should be an integer
ERROR

我在SO上阅读了类似的问题,但我无法找到一个满意的答案来解决我的问题。

生产代码如下所示:

class Earnings():

    def printd(i=0):

        try:
            i = int(i)

        except Exception:
            print('"' + i + '"' + " is not a valid argument.  i should be an integer")
            sys.exit(0)

单元测试代码是这样的:

from earnings import Earnings
import unittest

class TestEarningsArgs(unittest.TestCase):

   def testincorrectparam(self):
      '''should raise error when param not an integer'''
      e = Earnings()
      value = "3v"
      self.assertRaises(Exception, e.printd(i=value))

if __name__ == "__main__":
      unittest.main()

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

问题在于异常被捕获,它不会传播到unittest。您需要删除try-except语句并离开i = int(i)。在这种情况下,将引发异常并且assertRaises将自己捕获它。

另一个问题是代码中的sys.exit(0)行。您需要使用raise Exception(...)替换它,这是不好的,因为Exception类不是特定的异常(您应该针对您希望发生错误的情况引发更具体的异常)。

答案 1 :(得分:0)

sys.exit(0)替换为raise

答案 2 :(得分:0)

我正在尝试学习python中的单元测试我认为assertTrue的一般形式是

TestCase.assertRaises(Exception, callable, parameter1,parameter2,...)

所以请尝试

self.assertRaises(Exception, e.printd,i=value)

希望它适合你