2012-01-05 2 views
1

일부 함수가 unittest 모듈을 사용하여 예외를 throw하지 않는지 테스트하려고합니다. 이것이 가능합니까? 나는 assertRaises 메서드에 대해서만 알고 있지만이 예외는 던져진 예외를 테스트하고 None 인수는 Exception 형식 인수에 대해 작동하지 않습니다 ...Python unittest assertRaises를 사용하여 해당 함수가 아무 예외도 throw하지 않는지 테스트하는 방법?

아이디어가 있습니까?

답변

5

그러니 그냥 함수를 호출하고 예외를 발생시킬 경우이 오류가 아닙니다로 유닛 테스트 러너가 중지됩니다 의미 실패 (보고됩니다 계속 진행할 수는 없습니다). 실패로보고하려면 다음과 같이하십시오.

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

그래서 이것을 달성하기위한 더 깨끗한 방법은 없지만 trys/excepts를 추가하거나 오류를보고하게하는 ... 감사합니다! –

+0

@JavierNovoaC. 그것이 도움이 되었다니 다행 :) – mouad

2

예외가 발생하면 테스트에 실패로 표시되므로 아무 것도 왜 실제로 어설 션해야하는지 알 수 없습니다. 당신이 정말로 원하는 경우, 당신은 스스로를 항상 작업을 수행 할 수 있습니다

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

보통 나는'try' /'except'를 신경 쓰지 않고'예외가 발생하지 않는 한이 테스트가 통과한다 '와 같은 테스트 메소드의 맨 아래에 코멘트를 추가한다. – dcrosta

+0

사실, 예외가 발생하면 오류로 표시되지만 사용자가 옳은 것으로 표시됩니다. 추가 코드 (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과 믹스 인 않습니다. 어느 쪽이든

일을하고

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) 

내 나쁜 영어 실례 사용 사례 것입니다.