2012-01-05 8 views
1

unittestモジュールを使用して、いくつかの関数が例外をスローしないかどうかをテストしようとしています。 これは可能ですか?私はassertRaisesメソッドについて知っているだけですが、この例外はスローされた例外をテストし、None引数はException型の引数では機能しません。Python unittest assertRaisesを使用して、その関数が例外をスローしないことをテストする方法は?

アイデア?

答えて

5

だから関数を呼び出すと、それは例外を発生させる場合にはエラーとして報告されますあなたがそれを失敗として報告したい場合は、次のようにすることができます:

try: 
    somefunction() 
except: 
    self.fail("....") 
+0

これを達成するためのクリーンな方法はありませんが、trys/exceptsを追加するか、ERRORsを報告させるように...ありがとう! –

+0

@ JavierNovoaC。うれしいです:) – mouad

2

例外が発生した場合、テストは失敗とマークされるため、実際に何かをアサートする必要はありません。あなたが本当にしたい場合は、常にそれを自分で行うことができますあなたのunittestのランナーを意味するものではありませ障害が(停止します

try: 
    foo() 
except: 
    raise AssertionError('should not raise exception') 
+0

私は通常、 'try' /' except'を気にしません。 '#このテストは例外が発生しない限りテストメソッドの最後にコメントを追加してください。 ' – dcrosta

+0

実際、例外が発生した場合、ERRORとしてマークされますが、あなたが正しい場合は、とにかくマークされます。追加のコード(trys/excepts)とエラーなしでこれをテストするよりクリーンな方法があるかどうか疑問に思っていました。推測しないでください... –

0

私のユニットテストで同じ問題が発生しました。ムーア&マイケルは正しいですが、一貫性のある方法で例外のアサーションを処理するためのよりクリーンな方法です。

class TestCase(unittest.TestCase): 
    def assertNoRaise(self, callableObj): 
     try: 
      callableObj() 
     except: 
      raise AssertionError('shouldn\'t raise an exception') 

    def assertAnyRaise(self, callableObj): 
     try: 
      callableObj() 
     except: 
      return 
     raise AssertionError('should raise an exception') 

や相続から別々上記のクラス、およびたunittest.TestCaseでのmixinありません。いずれかの方法は

とユースケース

class my_test(TestCase): 
    def setUp(self): 
     pass 
    def tearDown(self): 
     pass 

    def test_assertion(self): 
     self.assertAnyRaise(lambda: 1+'a') 
     self.assertNoRaise(lambda: 1+1) 

私の悪い英語を言い訳してください、働くだろう。