当assertRaises失败时,python unittest assertRaises抛出异常

时间:2009-08-04 23:51:42

标签: python unit-testing python-unittest

我有代码,当assertRaises失败时,assertRaises会抛出异常。我认为如果assertRaises失败,那么测试就会失败,我会在最后得到一个报告说测试失败了。我没想到会抛出异常。以下是我的代码。我做错了什么?我正在使用Python 2.6.2。

import unittest

class myClass:

    def getName(self):

        raise myExcOne, "my exception one"
        #raise myExcTwo, "my exception two"
        #return "a"

class myExcOne(Exception):
    "exception one"

class myExcTwo(Exception):
    "exception two"


class test_myClass(unittest.TestCase):

    def setUp(self):

        self.myClass = myClass()

    def testgetNameEmpty(self):
        #self.assertRaises(myExcOne,self.myClass.getName)
        #self.assertRaises(myExcTwo,self.myClass.getName)

        try:
            self.assertRaises(myExcTwo,self.myClass.getName)
        except Exception as e:
            pass

if __name__ == "__main__":

    #unittest.main()

    suite = unittest.TestLoader().loadTestsFromTestCase(test_myClass)
    unittest.TextTestRunner(verbosity=2).run(suite)

2 个答案:

答案 0 :(得分:6)

发布的代码错误。首先,class myClass():应为class myClass:if name == "main":也应该是:

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

除了这些问题之外,由于getName()引发异常myExcOne并且您的测试需要异常myExcTwo,因此失败了。

以下是一些有效的代码。请编辑问题中的代码,以便我们可以将其剪切并粘贴到Python会话中:

import unittest

class myExcOne(Exception): "exception one"

class myExcTwo(Exception): "exception two"

class myClass:
    def getName(self):
        raise myExcTwo

class test_myClass(unittest.TestCase):
    def setUp(self):
        self.myClass = myClass()
    def testgetNameEmpty(self):
        #self.assertRaises(myExcOne,self.myClass.getName)
        self.assertRaises(myExcTwo,self.myClass.getName)

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

答案 1 :(得分:6)

从一开始,()语句中的类名后面的class在现代Python中是完全正确的 - 根本不是错误。

问题在于assertRaises(MyException, foo) ,以传播通过调用foo()引发的异常,其类型不是{的子类{1}} - 它只捕获MyException及其子类。由于您的代码引发了一种类型的异常,并且您的测试需要一种不同的不相关类型,因此根据MyException模块here的文档,引发的异常将传播,并且我引用:

  

如果引发异常,则测试通过,如果引发另一个异常则是错误,如果没有引发异常则失败。

“是一个错误”意味着“传播另一个异常”。

当您捕获在try / except块中传播的异常时,您将使错误无效,并且unittest无法进行任何诊断。如果您的目的是将此错误转为失败(有争议的策略......),则您的unittest数据块应调用except