TestCase
클래스는 값을 검사하고 실패를 보고하기 위해 몇 개의 assert 메서드를 제공합니다. 다음 표는 보통 많이 사용되는 메서드들입니다(더 많은 assert 메서드는 표 아래를 보십시오):
메서드 | 검사하는 내용 | 추가된 버전 |
---|---|---|
assertEqual(a, b) | a == b | |
assertNotEqual(a, b) | a != b | |
assertTrue(x) | bool(x) is True | |
assertFalse(x) | bool(x) is False | |
assertIs(a, b) | a is b | 3.1 |
assertIsNot(a, b) | a is not b | 3.1 |
assertIsNone(x) | x is None | 3.1 |
assertIsNotNone(x) | x is not None | 3.1 |
assertIn(a, b) | a in b | 3.1 |
assertNotIn(a, b) | a not in b | 3.1 |
assertIsInstance(a, b) | isinstance(a, b) | 3.2 |
assertNotIsInstance(a, b) | not isinstance(a, b) | 3.2 |
모든 assert 메서드는 msg 인자를 받을 수 있습니다, 만약 그것이 전달된다면 실패 시 에러 메시지로 사용됩니다(longMessage
도 참고하십시오). assertRaises()
, assertRaisesRegex()
, assertWarns()
, assertWarnsRegex()
는 컨텍스트 관리자로서 사용될 때만 그들에게 msg 키워드 인자를 전달할 수 있다는 점을 주의하십시오.
assertEqual
(first, second, msg=None)first와 second가 같은지 테스트합니다. 비교한 값이 같지 않으면 테스트는 실패할 것입니다.추가로, 만약 first와 second가 정확히 같은 형(type)이고 list, tuple, dict, set, frozenset, str 이거나
addTypeEqualityFunc()
에 등록된 서브 클래스 형 중 하나일 경우 더 유용한 기본 에러 메시지를 생성하기 위해 형-특화(type-specific) 동등성 함수가 불릴 것입니다(형-특화 메서드 목록을 참고하십시오).버전 3.1으로 변경: 형-특화 동등성 함수가 자동으로 불리도록 추가버전 3.2으로 변경: 문자열 비교를 위해서assertMultiLineEqual()
를 기본 형-특화 동등성 함수에 추가
assertNotEqual
(first, second, msg=None)==first와 second가 같지 않은지 테스트==합니다, 비교한 값이 같으면 테스트는 실패할 것입니다.
assertTrue
(expr, msg=None)assertFalse
(expr, msg=None)expr이 참(또는 거짓)인지 테스트합니다.이것은
bool(expr) is True
와 동등하고expr is True
와 동등하지 않다는 것에 주의하십시오(후자를 위해선assertIs(expr, True)
를 사용하십시오). 더 구체적인 메서드를 사용할 수 있을 때는 이 메서드를 지양해야 합니다(예,assertTrue(a == b)
대신에assertEqual(a, b)
), 왜냐하면 실패의 경우에 구체적인 메서드가 더 나은 에러 메시지를 제공하기 때문입니다.
assertIs
(first, second, msg=None)assertIsNot
(first, second, msg=None)first와 second가 같은 객체로 평가되는지(아닌지) 테스트합니다.버전 3.1에 추가.
assertIsNone
(expr, msg=None)assertIsNotNone
(expr, msg=None)expr이
None
인지(아닌지) 테스트합니다.버전 3.1에 추가.
assertIn
(first, second, msg=None)assertNotIn
(first, second, msg=None)==first가 second 안에 있는지(아닌지) 테스트==합니다.버전 3.1에 추가.
assertIsInstance
(obj, cls, msg=None)assertNotIsInstance
(obj, cls, msg=None)==obj가 cls(
isinstance()
가 지원하는 것처럼 클래스 또는 클래스의 튜플)의 인스턴스인지(아닌지) 테스트==합니다. 정확한 형 검사를 위해서는assertIs(type(obj), cls)
를 사용하십시오.버전 3.2에 추가.
다음의 메서드를 사용하여 예외, 경고, 로그 메시지의 발생을 검사할 수 있습니다:
메서드 | 검사하는 내용 | 추가된 버전 |
---|---|---|
assertRaises(exc, fun, *args, **kwds) | fun(*args, **kwds) 가 exc를 발생 | |
assertRaisesRegex(exc, r, fun, *args,**kwds) | fun(*args, **kwds) 가 exc를 발생하고 메시지가 정규식 r에 일치 | 3.1 |
assertWarns(warn, fun, *args, **kwds) | fun(*args, **kwds) 가 warn을 발생 | 3.2 |
assertWarnsRegex(warn, r, fun, *args,**kwds) | fun(*args, **kwds) 가 warn을 발생하고 메시지가 정규식 r에 일치 | 3.2 |
assertLogs(logger, level) | with 블록이 최소 level로 logger에 로그를 남김 | 3.4 |
assertRaises
(exception, callable, args*, *kwds*)assertRaises
(exception, ***, msg=None)assertRaises()
에 전달된 어떤 위치 또는 키워드 인자와 함께 callable이 호출되었을 때 예외가 발생하는지 테스트합니다. exception이 발생하면 테스트를 통과하고, 다른 예외가 발생하면 에러이고, 아무 예외도 발생하지 않으면 실패입니다. 여러 예외 모음을 잡기 위해서 예외 클래스를 포함한 튜플을 exception으로 전달해도 좋습니다. 만약 선택적인 msg와 함께 오직 exception 인자만 전달된다면, 테스트할 코드를 함수가 아닌 인라인으로 작성할 수 있도록 컨텍스트 관리자를 반환합니다:with self.assertRaises(SomeException):
do_something()컨텍스트 관리자로 사용되면,
assertRaises()
는 추가적인 키워드 인자인 msg를 받을 수 있습니다.컨텍스트 관리자는 잡은 예외 객체를exception
어트리뷰트에 저장할 것입니다. 이것은 발생한 예외에 대해서 추가적인 검사를 수행하려는 경우에 유용할 수 있습니다:with self.assertRaises(SomeException) as cm:
do_something()
the_exception = cm.exception
self.assertEqual(the_exception.error_code, 3)버전 3.1으로 변경:
assertRaises()
를 컨텍스트 관리자로 사용할 수 있도록 기능 추가.버전 3.2으로 변경:exception
어트리뷰트 추가.버전 3.3으로 변경: 컨텍스트 관리자로 사용될 때 msg 키워드 인자 추가.
assertRaisesRegex
(exception, regex, callable, args*, *kwds*)assertRaisesRegex
(exception, regex, ***, msg=None)assertRaises()
와 비슷하지만 발생한 예외의 문자열 표현이 regex에 일치하는지 테스트합니다. regex는 정규식 객체나re.search()
에 사용되기 적합한 정규식 문자열이 될 수 있습니다. 예:self.assertRaisesRegex(ValueError, "invalid literal for.*XYZ'$",
int, 'XYZ')또는:
with self.assertRaisesRegex(ValueError, 'literal'):
int('XYZ')버전 3.1에 추가:
assertRaisesRegexp
라는 이름으로.버전 3.2으로 변경:assertRaisesRegex()
으로 이름 변경.버전 3.3으로 변경: 컨텍스트 관리자로 사용될 때 msg 키워드 인자 추가.
assertWarns
(warning, callable, args*, *kwds*)assertWarns
(warning, ***, msg=None)assertWarns()
에 전달된 어떤 위치 또는 키워드 인자와 함께 callable이 호출되었을 때 경고(warning)가 발생하는지 테스트합니다. warning이 발생하면 테스트를 통과하고, 그렇지 않으면 실패입니다. 예외가 발생하면 에러입니다. 여러 경고 모음을 잡기 위해서 경고 클래스를 포함한 튜플을 warnings로 전달해도 좋습니다.만약 선택적인 msg와 함께 오직 warning 인자만 전달된다면, 테스트할 코드를 함수가 아닌 인라인으로 작성할 수 있도록 컨텍스트 관리자를 반환합니다:
with self.assertWarns(SomeWarning):
do_something()컨텍스트 관리자로 사용되면,
assertWarns()
는 추가적인 키워드 인자인 msg를 받을 수 있습니다.컨텍스트 관리자는 잡은 경고 객체를
warning
어트리뷰트에 저장하고, 경고를 발생한 소스코드 줄을filename
과lineno
에 저장할 것입니다. 이것은 발생한 경고에 대해서 추가적인 검사를 수행하려는 경우에 유용할 수 있습니다:with self.assertWarns(SomeWarning) as cm:
do_something()
self.assertIn('myfile.py', cm.filename)
self.assertEqual(320, cm.lineno)이 메서드는 호출될 때 적용될 경고 필터와 관계없이 작동합니다.
버전 3.2에 추가.
버전 3.3으로 변경: 컨텍스트 관리자로 사용될 때 msg 키워드 인자 추가.
assertWarnsRegex
(warning, regex, callable, args*, *kwds*)assertWarnsRegex
(warning, regex, ***, msg=None)assertWarns()
와 비슷하지만 발생한 경고의 메시지가 regex에 일치하는지 테스트합니다. regex는 정규식 객체나re.search()
에 사용되기 적합한 정규식 문자열이 될 수 있습니다. 예:self.assertWarnsRegex(DeprecationWarning,
r'legacy_function\(\) is deprecated',
legacy_function, 'XYZ')또는:
with self.assertWarnsRegex(RuntimeWarning, 'unsafe frobnicating'):
frobnicate('/etc/passwd')버전 3.2에 추가.
버전 3.3으로 변경: 컨텍스트 관리자로 사용될 때 msg 키워드 인자 추가.
assertLogs
(logger=None, level=None)최소한 level로 logger나 그 자식들에 최소한 1개의 메시지가 기록되는지 테스트하는 컨텍스트 관리자입니다.
logger가 주어졌다면,
logging.Logger
객체이거나 로거의 이름인str
이어야 합니다. 기본값은 모든 메시지를 잡을 루트 로거입니다.level이 주어졌다면, 로그 수준의 숫자 값이거나 그에 대응하는 문자열이어야 합니다(예를 들어
"ERROR"
이거나logging.ERROR
). 기본값은logging.INFO
입니다.만약
with
블록 안에서 logger와 level 조건을 만족하는 최소한 1개의 메시지가 나왔다면 테스트는 성공하고, 그렇지 않으면 실패합니다.컨텍스트 관리자에 의해 반환되는 객체는 조건에 일치하는 로그 메시지를 추적하기 위한 기록 도우미입니다. 이것은 2개의 어트리뷰트를 가지고 있습니다:
조건에 일치하는 메시지의
logging.LogRecord
객체 목록.
output
조건에 일치하는 메시지의 포맷 출력인
str
객체 목록.
예:
with self.assertLogs('foo', level='INFO') as cm:
logging.getLogger('foo').info('first message')
logging.getLogger('foo.bar').error('second message')
self.assertEqual(cm.output, ['INFO:foo:first message',
'ERROR:foo.bar:second message'])버전 3.4에 추가.
더 구체적인 검사를 수행하기 위한 또 다른 메서드가 있습니다, 아래와 같이:
메서드 | 검사하는 내용 | 추가된 버전 |
---|---|---|
assertAlmostEqual(a, b) | round(a-b, 7) == 0 | |
assertNotAlmostEqual(a, b) | round(a-b, 7) != 0 | |
assertGreater(a, b) | a > b | 3.1 |
assertGreaterEqual(a, b) | a >= b | 3.1 |
assertLess(a, b) | a < b | 3.1 |
assertLessEqual(a, b) | a <= b | 3.1 |
assertRegex(s, r) | r.search(s) | 3.1 |
assertNotRegex(s, r) | not r.search(s) | 3.2 |
assertCountEqual(a, b) | 순서와 상관없이 a와 b가 같은 개수의 같은 요소를 가졌는지 | 3.2 |
assertAlmostEqual
(first, second, places=7, msg=None, delta=None)assertNotAlmostEqual
(first, second, places=7, msg=None, delta=None)first와 second가 근사하게 같은지(또는 근사하게 같지 않은지) 테스트합니다. 이는 값 차이를 계산하고, 주어진 소수 자릿(places)수(기본값 7)로 반올림한 뒤, 0과 비교하는 것으로 이루어집니다. 이 메서드는 값을 유효 숫자 자릿수(significant digits)가 아닌 주어진 소수 자릿수(decimal places)(즉,
round()
함수와 같이)로 반올림합니다.만약 places 대신에 delta가 주어진다면 first와 second의 값 차이는 반드시 delta보다 작거나 같아야(또는 커야) 합니다.delta와 places가 동시에 주어지면TypeError
가 발생합니다.버전 3.2으로 변경:assertAlmostEqual()
은 같다고 비교되는 거의 동등한 객체를 자동으로 고려합니다.assertNotAlmostEqual()
은 객체가 같다고 비교되면 자동으로 실패합니다. delta 키워드 인자를 추가.
assertGreater
(first, second, msg=None)assertGreaterEqual
(first, second, msg=None)assertLess
(first, second, msg=None)assertLessEqual
(first, second, msg=None)first를 second와 비교해서 각각 메서드 이름에 해당하는 >, >=, <, <= 인지 테스트합니다. 그렇지 않으면 테스트는 실패합니다:>>>
>>> self.assertGreaterEqual(3, 4) AssertionError: "3" unexpectedly not greater than or equal to "4"
버전 3.1에 추가.
assertRegex
(text, regex, msg=None)assertNotRegex
(text, regex, msg=None)regex 검색이 text에 일치하는지(아닌지) 테스트합니다. 실패의 경우, 에러 메시지는 패턴과 text(또는 패턴과 예상과 달리 일치한 text의 부분)를 포함할 것입니다. regex는 정규식 객체나
re.search()
에 사용되기 적합한 정규식 문자열이 될 수 있습니다.버전 3.1에 추가:assertRegexpMatches
라는 이름으로.버전 3.2으로 변경:assertRegexpMatches()
메서드가assertRegex()
로 이름 변경되었습니다.버전 3.2에 추가:assertNotRegex()
.버전 3.5에 추가:assertNotRegexpMatches
이름은assertNotRegex()
의 폐지된 에일리어스입니다.
assertCountEqual
(first, second, msg=None)first 시퀀스가 순서에 상관없이 second와 같은 요소를 포함하는지 테스트합니다. 그렇지 않은 경우, 시퀀스들의 차이를 나열한 에러 메시지가 생성됩니다.first와 second를 비교할 때 중복된 요소는 무시하지 않습니다. 두 개의 시퀀스에 각 요소가 같은 수 만큼 있는 것을 확인합니다.
assertEqual(Counter(list(first)), Counter(list(second)))
와 같지만 해시 불가능한(unhashable) 시퀀스에도 작동합니다.버전 3.2에 추가.
assertEqual()
메서드는 같은 형의 객체의 동등성 검사를 다른 형-특화 메서드에게로 보냅니다. 이러한 메서드들은 대부분의 내장 형에 대해서 이미 구현되어 있지만, addTypeEqualityFunc()
을 사용하여 새로운 메서드를 등록하는 것도 가능합니다:
addTypeEqualityFunc
(typeobj, function)정확히 같은 (서브 클래스가 아닌) typeobj 형의 두 객체가 같은지 비교 검사하기 위해
assertEqual()
한테 불리는 형-특화 메서드를 등록합니다. function은 반드시 2개의 위치 인자를 받아야 하고assertEqual()
이 그러한 것처럼 msg=None 키워드 인자를 세 번째로 받아야 합니다. 이것은 처음 2개의 매개변수가 같지 않은 것이 확인될 경우self.failureException(msg)
을 반드시 발생시켜야 합니다 -- 에러 메시지에 유용한 정보를 제공하고 비동등성을 자세히 설명할 수 있을 것입니다.버전 3.1에 추가.
assertEqual()
에서 자동으로 사용하는 형-특화 메서드 목록은 다음 표에 정리되어 있습니다. 보통은 이 메서드를 직접 부를 필요가 없다는 것을 기억하십시오.
메서드 | 을 비교하기 위해 | 추가된 버전 |
---|---|---|
assertMultiLineEqual(a, b) | 문자열 | 3.1 |
assertSequenceEqual(a, b) | 시퀀스 | 3.1 |
assertListEqual(a, b) | 리스트 | 3.1 |
assertTupleEqual(a, b) | 튜플 | 3.1 |
assertSetEqual(a, b) | 집합 또는 불변 집합 | 3.1 |
assertDictEqual(a, b) | 딕셔너리 | 3.1 |
assertMultiLineEqual
(first, second, msg=None)여러 줄 문자열인 first와 second가 같은지 테스트합니다. 같지 않을 경우 에러 메시지에 다른 부분이 강조된 두 문자열의 차이가 포함됩니다. 이 메서드는
assertEqual()
에서 문자열을 비교할 때 기본적으로 사용됩니다.버전 3.1에 추가.
assertSequenceEqual
(first, second, msg=None, seq_type=None)2개의 시퀀스가 같은지 테스트합니다. seq_type이 전달된 경우, first와 second 둘 다 seq_type의 인스턴스이어야 하고 그렇지 않은 경우 실패가 발생합니다. 시퀀스가 다른 경우, 에러 메시지는 2개 사이의 차이점을 보여주게 됩니다.이 메서드는
assertEqual()
에서 직접 호출되진 않지만,assertListEqual()
와assertTupleEqual()
을 구현할 때 사용됩니다.버전 3.1에 추가.
assertListEqual
(first, second, msg=None)assertTupleEqual
(first, second, msg=None)2개의 리스트나 튜플이 같은지 테스트합니다. 만약 같지 않다면 에러 메시지는 2개 사이의 차이점만 보여주게 됩니다. 매개변수 중 하나가 잘못된 형인 경우 에러가 발생합니다. 이 메서드는
assertEqual()
에서 리스트와 튜플을 비교할 때 기본적으로 사용됩니다.버전 3.1에 추가.
assertSetEqual
(first, second, msg=None)2개의 집합이 같은지 테스트합니다. 같지 않은 경우 에러 메시지는 집합 사이의 차이를 나열하게 됩니다. 이 메서드는
assertEqual()
에서 집합이나 불변 집합을 비교할 때 기본적으로 사용됩니다.first와 second 중 하나가set.difference()
메서드를 가지고 있지 않으면 실패합니다.버전 3.1에 추가.
assertDictEqual
(first, second, msg=None)2개의 딕셔너리가 같은지 테스트합니다. 같지 않은 경우 에러 메시지는 딕셔너리 사이의 차이를 보여주게 됩니다. 이 메서드는
assertEqual()
에서 딕셔너리를 비교할 때 기본적으로 사용될 것입니다.
'Basic > Python' 카테고리의 다른 글
[Python] 파이썬 파일과 디렉토리 경로 (5) | 2018.12.29 |
---|---|
[Python collections] collections란? (0) | 2018.08.07 |
[Python] 파이썬 실행 에러 (1) | 2018.07.13 |