6

assertRaisesが失敗したときにassertRaisesが例外をスローするコードがあります。assertRaisesが失敗するとテストが失敗し、最後にテストが失敗したというレポートが表示されると思いました。例外がスローされるとは思っていませんでした。以下は私のコードです。私は何か間違ったことをしていますか?Python2.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)
4

2 に答える 2

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()
于 2009-08-05T00:05:41.880 に答える
6

余談です()が、ステートメント内のクラス名の後の はclass、最新の Python では完全に正しく、まったくエラーではありません。

問題の本質については、タイプがのサブクラスではない呼び出しによって発生した例外を伝播することassertRaises(MyException, foo) 文書化されています。それは、そのサブクラスをキャッチしてサブクラス化するだけです。コードが 1 つのタイプの例外を発生させ、テストが別の無関係なタイプの 1 つを予期すると、発生した例外は、モジュールのドキュメントに従って伝播しますfoo()MyExceptionMyExceptionunittest

例外が発生した場合はテストに合格し、別の例外が発生した場合はエラーになり、例外が発生しない場合は失敗します。

そして「エラーです」は「他の例外を伝播する」ことを意味します。

try/except ブロックで伝播する例外をキャッチすると、エラーが無効になり、unittest診断する必要がなくなります。あなたの目的がこのエラーを失敗に変えることである場合 (議論の余地のある戦略...)、exceptブロックは を呼び出す必要がありますself.fail

于 2009-08-05T01:40:11.017 に答える