테스트 메서드 호출하기
먼저 setUp 호출하기
- 나중에 tearDown 호출하기
- 테스트 메서드가 실패해도 tearDown 호출하기
- 여러 개의 테스트 실행하기
수집된 결과를 출력하기
WasRun 에 로그 문자열 남기기
실패한 테스트 보고하기
- setUp 에러 잡아서 보고하기
테스트들을 모두 모아서 한 번에 실행하고 싶다. TestSuite 가 필요하다.
1 2 3 4 5 6 7
| // TestCaseTest def testSuite(self): suite = TestSuite() suite.add(WasRun("testMethod")) suite.add(WasRun("testBrokenMethod")) result = suite.run() assert ("2 run, 1 failed" == result.summary())
|
add() 메서드를 구현은, 테스트들을 리스트에 추가하는 것으로 된다.
1 2 3 4 5 6
| class TestSuite: def __init__(self): self.tests = [] def add(self, test): self.tests.append(test)
|
run() 메서드는, 하나의 TestResult가 모든 테스트에 대해 쓰이길 바라기 때문에 다음과 같이 작성해야 한다.
1 2 3 4 5 6
| // TestSuite def run(self): result = TestResult() for test in self.tests: test.run(result) return result
|
만약 TestCase.run() 에 매개변수를 추가하면, TestSuite.run() 에도 똑같은 매개 변수를 추가해야 한다.
1 2 3 4 5 6 7 8 9
| // TestCaseTest def testSuite(self): suite = TestSuite() suite.add(WasRun("testMethod")) suite.add(WasRun("testBrokenMethod"))
result = TestResult() suite.run(result) assert ("2 run, 1 failed" == result.summary())
|
이 방법은, run() 이 무언가를 명시적으로 반환하지 않아도 된다는 장점이 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| // TestSuite class def run(self, result): for test in self.tests: test.run(result)
// TestCase class def run(self, result): result.testStarted() self.setUp()
try: method = getattr(self, self.name) method() except: result.testFailed() self.tear_down()
|
1 2 3 4 5 6 7 8 9
| suite = TestSuite() suite.add(TestCaseTest("testTemplateMethod")) suite.add(TestCaseTest("testResult")) suite.add(TestCaseTest("testFailedResultFormatting")) suite.add(TestCaseTest("testFailedResult"))
result = TestResult() suite.run(result) print(result.summary())
|
우선, 실패하는 테스트 3 개를 고치자.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| // TestCaseTest class def testTemplateMethod(self): test = WasRun("testMethod") result = TestResult() test.run(result) assert "setUp testMethod tearDown " == test.log
def testResult(self): test = WasRun("testMethod") result = TestResult() test.run(result) assert "1 run, 0 failed" == result.summary()
def test_failed_result(self): test = WasRun("TestBrokenMethod") result = TestResult() test.run(result) assert "1 run, 1 failed" == result.summary()
|
각 테스트들이 TestResult 를 할당하고 있다는 것을 주목하자.
이제, TestResult 를 setUp 에서 생성하면 만들면 테스트를 단순화된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| // TestCaseTest def setUp(self): self.result = TestResult()
def testTemplateMethod(self): test = WasRun("testMethod") test.run(self.result) assert "setUp testMethod tearDown " == test.log
def testResult(self): test = WasRun("testMethod") test.run(self.result) assert "1 run, 0 failed" == self.result.summary()
def testFailedResult(self): test = WasRun("testBrokenMethod") test.run(self.result) assert "1 run, 1 failed" == self.result.summary()
def testFailedResultFormatting(self): self.result.testStarted() self.result.testFailed() assert "1 run, 1 failed" == self.result.summary()
def testSuite(self): suite = TestSuite() suite.add(WasRun("testMethod")) suite.add(WasRun("testBrokenMethod")) suite.run(self.result) assert "2 run, 1 failed" == self.result.summary()
|
테스트 주도 개발 <켄트 벡>