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

6 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)
Run Code Online (Sandbox Code Playgroud)

mha*_*wke 6

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

if __name__ == "__main__":
    unittest.main()
Run Code Online (Sandbox Code Playgroud)

除了这些问题之外,这会失败,因为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()
Run Code Online (Sandbox Code Playgroud)


Ale*_*lli 6

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

在这个问题上的肉,assertRaises(MyException, foo) 记录在案,以传播通过调用引发的异常foo(),其类型不是的子类MyException-只捕捞MyException和亚类的化合物.由于您的代码引发了一种类型的异常,并且您的测试需要一种不同的不相关类型,因此根据unittest模块的文档,此处引发的异常将传播,我引用:

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

而"是一个错误"意味着"传播另一个例外".

当您捕获在try/except块中传播的异常时,您将使错误无效,并且没有任何内容可供unittest诊断.如果您的目的是将此错误变为失败(一个有争议的策略......),您的except块应该调用self.fail.