[테스트 주도 개발] 23장_얼마나 달콤한지

  • 테스트 메서드 호출하기
  • 먼저 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()

테스트 주도 개발 <켄트 벡>

Comments