모듈 에서 assertNotRaises
원래 구현의 약 90 %를 재사용하여 정의 할 수 있습니다 . 이 방법을 사용하면 반전 된 실패 조건을 제외 하고와 동일하게 동작 하는 방법이 생깁니다 .assertRaises
unittest
assertNotRaises
assertRaises
TLDR 및 라이브 데모
assertNotRaises
메소드 를 추가하는 것은 놀랍게도 쉬운 것으로 판명되었습니다 unittest.TestCase
(코드와 마찬가지로이 답변을 작성하는 데 약 4 배가 걸렸습니다). 다음 은 실제 assertNotRaises
작동 하는 방법의 데모입니다 . 그냥 같은assertRaises
, 당신도에 호출 및 인수를 전달할 수 있습니다 assertNotRaises
, 또는 당신은 그것을 사용할 수 있습니다 with
문. 라이브 데모에는 assertNotRaises
의도 한대로 작동 하는 테스트 사례가 포함되어 있습니다.
세부
assertRaises
in 구현 unittest
은 상당히 복잡하지만 약간의 영리한 서브 클래 싱을 사용하면 실패 조건을 무시하고 되돌릴 수 있습니다.
assertRaises
기본적으로 unittest.case._AssertRaisesContext
클래스 의 인스턴스를 작성 하고 리턴 하는 짧은 메소드입니다 ( unittest.case
모듈 의 정의 참조 ). 메소드를 _AssertNotRaisesContext
서브 클래 싱 _AssertRaisesContext
하고 재정 의하여 고유 한 클래스를 정의 할 수 있습니다 __exit__
.
import traceback
from unittest.case import _AssertRaisesContext
class _AssertNotRaisesContext(_AssertRaisesContext):
def __exit__(self, exc_type, exc_value, tb):
if exc_type is not None:
self.exception = exc_value.with_traceback(None)
try:
exc_name = self.expected.__name__
except AttributeError:
exc_name = str(self.expected)
if self.obj_name:
self._raiseFailure("{} raised by {}".format(exc_name,
self.obj_name))
else:
self._raiseFailure("{} raised".format(exc_name))
else:
traceback.clear_frames(tb)
return True
일반적으로 테스트 케이스 클래스를에서 상속하여 테스트 케이스 클래스를 정의합니다 TestCase
. 대신 서브 클래스에서 상속하는 경우 MyTestCase
:
class MyTestCase(unittest.TestCase):
def assertNotRaises(self, expected_exception, *args, **kwargs):
context = _AssertNotRaisesContext(expected_exception, self)
try:
return context.handle('assertNotRaises', args, kwargs)
finally:
context = None
모든 테스트 사례에 이제 assertNotRaises
사용할 수 있는 방법이 있습니다.