2009-08-04 21 views
5

assertRaisesが失敗したときにassertRaisesが例外をスローするコードがあります。私はassertRaisesが失敗するとテストが失敗し、テストが失敗したというレポートが最後に表示されると思いました。私は例外がスローされることを期待していませんでした。以下は私のコードです。私は何か間違っているのですか?私はPython 2.6.2を使用しています。Python unittest assertRaisesがassertRaisesが失敗したときに例外をスローする

+0

「アサート失敗」とは具体的にはどういう意味ですか?スタックトレースまたはエラーメッセージを投稿できますか? –

+0

私は、ドキュメントを再読み込みし、assertRaisesが失敗した場合に例外をスローすることが予想される動作です。私はツールがどのように機能するか誤解しました。 前の投稿でこれを忘れてしまった。私が例外を捕まえれば、テストは合格していないにもかかわらずテストが合格したことが報告されます。 –

答えて

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() 
+0

上でコードを更新しました。Hi mhawke、 __main__がコピーアンドペースト処理に混乱しました。 myClass()については、元のクラスが継承されているので、私は小さなテストケースを作成したときに()を削除するのを忘れていました。 テストは失敗したと見なされます。私はアサートが失敗したときにツールがどのように動作するかを理解しようとしています。 私の元の投稿では、アサーションが失敗した場合にツールが例外をスローすると誤解されました。例外をキャッチして何もしないようにコードを更新しました。断言が失敗したとしても、報告書は合格としている。 ブライアン –

5

脇から始まり、class文のクラス名の後に()は、現代では完全に正確ですPython - エラーではありません。それだけでそのMyExceptionとサブクラスをキャッチ - 問題の肉に

assertRaises(MyException, foo)は、その種類MyExceptionのサブクラスではありませんfoo()を呼び出すことによって発生した例外を伝播するために文書化されています。あなたのコードでは1つの型の例外が発生し、テストでは別の無関係な型の1つが返されるため、unittestモジュールのドキュメントであるhereのドキュメントに従って、発生した例外が伝播します。 "例外が発生した場合はテストに合格し、別の例外が発生した場合はエラー、例外が発生しなかった場合は失敗する」、「エラーです」は「他の例外を伝播する」ことを意味します。

try/exceptブロックに伝播された例外をキャッチすると、エラーは無効になり、unittestが診断することは何も残っていません。このエラーを失敗に変えることが目的なら(議論の余地のある戦略...)、exceptブロックはself.failに電話する必要があります。

+0

ありがとうございました!私は私が投稿した後までunittestの私の誤解をキャッチしませんでした。上のコードを実行すると、というメッセージが表示されます。私はそれが失敗すると思うが、なぜそれがメッセージを与えるのか理解する。 exceptブロックにself.failを追加すると、別の例外がスローされます。すべてのテストを実行し、最後にエラーを報告できるようにするための提案はありますか?私はを見つけました。addFailure>しかし、私はどのように(または私ができるか)結果に到達するか分からない。 –

+0

通常の単体テストランナー(unittest.main)で、すべてのテストメソッドが実行され、エラー(E)と失敗(F)[実際には特殊例外で診断されます]を報告します - 私はTextTestRunnerが動作するunittest.mainが(unittest.TestProgramクラスを介して)使用しているのとまったく同じですが、ソースをチェックしてください... unittest.mainで期待される結果を得ていますか? –

+0

try/exceptブロックを取り出し、のコメントを外すと、デバッガが実行を停止します。私はすべてのテストを実行し、私が期待した結果を与えたコマンドラインからプログラムを実行しました。これは私が探していたものです。しかし、上に挙げたコードを実行すると、失敗してもそれが成功することがわかります。コマンドラインから単体テストを実行すると、私が望むものが得られるので、これは心配しない。ご協力いただきありがとうございます。 –

関連する問題