22. 실패 처리하기
def testFailedResultFormatting(self):
result = TestResult()
result.testStarted()
result.testFailed()
assert ("1 run, 1 failed" == result.summary())
- 실패한 테스트를 추적하기 위해 위와 같은 테스트 코드를 작성해보자
class TestResult:
def __init__(self):
self.runCount = 0
self.failureCount = 0
def testStarted(self):
self.runCount = self.runCount + 1
def testFailed(self):
self.failureCount = self.failureCount + 1
def summary(self):
return "%d run, %d failed" % (self.runCount, self.failureCount)
- testFailed 메서드와 실패 카운트 필드인 failureCount를 정의한다.
- summary도 하드코딩 되어 있는 부분인 failed을 failureCount를 보게 수정한다.
class TestCase:
def __init__(self, name):
self.name = name
def setUp(self):
pass
def run(self):
result = TestResult()
result.testStarted()
self.setUp()
try:
method = getattr(self, self.name)
method()
except:
result.testFailed()
self.tearDown()
return result
def tearDown(self):
pass
- 이후 try-except를 통해 메서드가 실행이 되지 않을 때 testFailed 메서드가 실행되게 예외처리를 해준다.
23. 얼마나 달콤한지
- 테스트를 호출하는 부분에서 중복이 발생한다. 이 부분을 한 번에 실행하기 위해 TestSuite를 구현해보자.
def testSuite(self):
suite = TestSuite()
suite.add(WasRun("testMethod"))
suite.add(WasRun("testBrokenMethod"))
result = suite.run()
assert("2 run, 1 failed" == result.summary())
class TestSuite:
def __init__(self):
self.tests = []
def add(self, test):
self.tests.append(test)
def run(self, result):
for test in self.tests:
test.run(result)
- TestSuite 정의.
- run 메서드에서 하나의 TestResult 가 모든 테스트에 대해 쓰이길 바라기 때문에 다음과 같이 작성했다.
TestCase
def run(self, result):
result.testStarted()
self.setUp()
try:
method = getattr(self, self.name)
method()
except:
result.testFailed()
self.tearDown()
return result
- testCase의 run도 result라는 매개변수를 받게 수정한다.