[테스트 주도 개발] 21장_셈하기

  • 테스트 메서드 호출하기
  • 먼저 setUp 호출하기
  • 나중에 tearDown 호출하기
  • 테스트 메서드가 실패해도 tearDown 호출하기
  • 여러 개의 테스트 실행하기
  • 수집된 결과를 출력하기
  • WasRun 에 로그 문자열 남기기

테스트 메서드에에서 예외가 발생하건 말건 tearDown() 이 호출되도록 구현했다. 하지만,테스트가 작동하기 위해선 예외를 작아야한다.
여러 테스트를 실행하고 그 결과를 다음과 같이 보길 원한다.
“5개 테스트가 실행됨. 2개 실패. TestCaseTest.testFooBar-ZeroDivide Exception, MoneyTest.testNegation-AssertionError”
TestCase.run()이 테스트 하나의 실행 결과를 기록하는 TestResult 객체를 반환하게 만들자.

1
2
3
4
5
// TestCaseTest
def test_result(self):
test = WasRun("testMethod")
result = test.run()
assert("1 run, 0 failed" == result.summary())

가짜 구현하자.

1
2
3
class TestResult:
def summary(self):
return "1 run, 0 failed"

이제 TestCase.run() 이 TestResult 를 결과로 반환한다.

1
2
3
4
5
6
7
// TestCase
def run(self):
self.setUp()
method = getattr(self, self.name)
method()
self.tearDown()
return TestResult()

이제 테스트가 실행된다. 이제 summary()의 구현을 실체화하자. 우선 실행된 테스트의 수를 상수로 만들자.

1
2
3
4
5
// TestResul
def __init__(self):
self.runCount = 1
def summary(self):
return "%d run, 0 failed" % self.runCount

runCount를 0으로 초기화하고 테스트가 실행될 때마다 1씩 증가하도록 만들 수 있다.

1
2
3
4
5
6
7
// TestResult
def __init__(self):
self.runCount = 0
def testStarted(self):
self.runCount = self.runCount + 1
def summary(self):
return "%d run, 0 failed" % self.runCount

이제, 새 메서드를 실제로 호출하게 하자.

1
2
3
4
5
6
7
8
9
// TestCase
def run(self):
result = TestResult()
result.testStarted()
self.setUp()
method = getattr(self, self.name)
method()
self.tearDown()
return result

실패하는 테스트의 수를 나타내는 문자열 상수 ‘0’을 runCount 를 실체화했을 때와 마찬가지의 방법을 통해 변수로 만들 수는 있겠다.
하지만, 이 작업을 하게끔 만들어주는 테스트가 없다. 그러니 또 다른 테스트를 하나 작성하자.

1
2
3
4
5
6
7
8
9
// TestCaseTest class
def testFailedResult(self):
test = WasRun("testBrokenMethod")
result = test.run()
assert ("1 run, 1 failed" == result.summary())

// WasRun class
def testBrokenMethod(self):
raise Exception
  • 테스트 메서드 호출하기
  • 먼저 setUp 호출하기
  • 나중에 tearDown 호출하기
  • 테스트 메서드가 실패해도 tearDown 호출하기
  • 여러 개의 테스트 실행하기
  • 수집된 결과를 출력하기
  • WasRun 에 로그 문자열 남기기
  • 실패한 테스트 보고하기

우리가 관심을 가져야 할 사항은, WasRun.testBrokenMethod에서 던진 예외를 처리하지 않았다는 것이다.


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

Comments