[테스트 주도 개발] 18장_xUnit 으로 가는 첫걸음

2부는 테스트 주도 개발을 통해 테스트 프레임워크를 만들어 본다. 다음은 테스트 프레임워크에 대한 할일 목록이다.

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

먼저, 테스트 메서드가 호출되면 true, 그렇지 않으면 false 를 반환할 작은 프로그램이 필요하다. 플래그를 가진 테스트 케이스를 만들것이다. 테스트 메서드가 실행되기 전에는 플래그가 false 이다. 실행된 이후에는 true 이다. 메서드가 실행되었는지 알려주는 테스크 케이스이므로 클래스 이름은 WasRun 으로 하자.

1
2
3
4
test = WasRun("testMethod")
print test.wasRun
test.testMethod()
print test.wasRun

위 코드는, 메서드가 실행되기 전에는 “None” 을 출력, 그 후에 “1” 을 출력할 것으로 예상된다. 하지만, 아니다. 아직 WasRun 클래스를 정의하지 않았다.
WasRun 클래스 정의하자.

1
2
3
class WasRun:
def __init__(self, name):
self.wasRun = None

이제, 실행하면 “None” 을 출력하고, testMethod 를 정의해야한다고 알려준다.

정의하자.

1
2
3
4
5
6
class WasRun:
def __init__(self, name):
self.wasRun = None

def testMethod(self):
self.wasRun = 1

이제 필요한 것은, 테스트 메서드를 직접 호출하는 대신 인터페이스인 run() 메서드를 이용하는 것이다. 테스트는 다음과 같이 변한다.

1
2
3
4
test = WasRun("testMethod")
print test.wasRun
test.run()
print test.wasRun

run 을 추가하자.

1
2
3
4
5
6
7
8
9
class WasRun:
def __init__(self, name):
self.wasRun = None

def testMethod(self):
self.wasRun = 1

def run(self):
self.testMethod()

그리고 실행하면, 다시 올바른 값을 출력한다. 다음 단계는, testMethod() 를 동적으로 호출하는 것이다. 다음과 같다.

1
2
3
4
5
6
7
8
class WasRun:
def __init__(self, name):
self.wasRun = None
self.name = name

def run(self):
method = getattr(self, self.name)
method()

이제 WasRun 클래스는 두 가지 일을 한다.

  1. 메서드가 호출되었는지 아닌지 기억하는 일
  2. 메서드를 동적으로 호출

이제, TestCase 상위 클래스를 만들고 WasRun 이 이것을 상속받게 하자.

1
2
3
class TestCase:
def __init__(self, name):
self.name = name
1
2
3
4
class WasRun(TestCase):
def __init__(self, name):
self.wasRun = None
TestCase.__init__(self, name)

마지막으로, run() 메서드는 상위 클래스에 있는 속성만을 사용하므로 상위 클래스로 올리자.

1
2
3
4
5
6
7
class TestCase:
def __init__(self, name):
self.name = name

def run(self):
method = getattr(self, self.name)
method()

테스트 실행 성공한다. 이제 다음과 같이 바꾸자.

1
2
3
4
5
6
7
8
class TestCaseTest(TestCase):
def testRunning(self):
test = WasRun("testMethod")
assert(not test.wasRun)
test.run()
assert(test.wasRun)

TestCaseTest("testRunning").run()
  • 테스트 메서드 호출하기
  • 먼저 setUp 호출하기
  • 나중에 tearDown 호출하기
  • 테스트 메서드가 실패해도 tearDown 호출하기
  • 여러 개의 테스트 실행하기
  • 수집된 결과를 출력하기

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

Comments