편집 : 더 나은 예제로 전환하고 이것이 실제 문제인 이유를 명확히했습니다.
단일 테스트에서 여러 실패를 볼 수 있도록 어설 션이 실패 할 때 계속 실행되는 단위 테스트를 Python으로 작성하고 싶습니다. 예를 들면 :
class Car(object):
def __init__(self, make, model):
self.make = make
self.model = make # Copy and paste error: should be model.
self.has_seats = True
self.wheel_count = 3 # Typo: should be 4.
class CarTest(unittest.TestCase):
def test_init(self):
make = "Ford"
model = "Model T"
car = Car(make=make, model=model)
self.assertEqual(car.make, make)
self.assertEqual(car.model, model) # Failure!
self.assertTrue(car.has_seats)
self.assertEqual(car.wheel_count, 4) # Failure!
여기서 테스트의 목적은 Car가 __init__
필드를 올바르게 설정 하는지 확인하는 것입니다. 나는 그것을 네 가지 방법으로 나눌 수있다 (그리고 그것은 종종 좋은 생각이다). 그러나이 경우 나는 그것을 하나의 개념을 테스트하는 하나의 방법으로 유지하는 것이 더 읽기 쉽다고 생각한다 ( "객체가 올바르게 초기화된다").
방법을 나누지 않는 것이 가장 좋다고 가정하면 새로운 문제가 있습니다. 모든 오류를 한 번에 볼 수 없습니다. model
오류를 수정하고 테스트를 다시 실행하면 wheel_count
오류가 나타납니다. 처음 테스트를 실행할 때 두 오류를 모두 보는 시간을 절약 할 수 있습니다.
비교를 위해 Google의 C ++ 단위 테스트 프레임 워크 는 치명적이지 않은 EXPECT_*
어설 션과 치명적 ASSERT_*
어설 션을 구분합니다.
단언은 동일한 것을 테스트하지만 현재 기능에 다른 영향을 미치는 쌍으로 제공됩니다. ASSERT_ * 버전은 실패하면 치명적인 실패를 생성하고 현재 기능을 중단합니다. EXPECT_ * 버전은 현재 기능을 중단하지 않는 치명적이지 않은 오류를 생성합니다. 일반적으로 EXPECT_ *는 테스트에서 둘 이상의 실패를보고 할 수 있으므로 선호됩니다. 그러나 문제의 주장이 실패 할 때 계속하는 것이 타당하지 않으면 ASSERT_ *를 사용해야합니다.
EXPECT_*
파이썬에서 같은 동작 을 얻는 방법 이 unittest
있습니까? 에없는 unittest
경우이 동작을 지원하는 다른 Python 단위 테스트 프레임 워크가 있습니까?
덧붙여서, 치명적이지 않은 주장으로 얼마나 많은 실제 테스트가 도움이 될지 궁금해서 몇 가지 코드 예제를 살펴 보았습니다 (Google 코드 검색, RIP 대신 검색 코드를 사용하도록 2014-08-19 편집 됨). 첫 페이지에서 무작위로 선택된 10 개의 결과 중 모두 동일한 테스트 방법에서 여러 개의 독립적 인 주장을하는 테스트를 포함했습니다. 모든 사람은 치명적이지 않은 주장으로 이익을 얻을 수 있습니다.