[테스트 주도 개발] 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씩 증가하도록 만들 수 있다.

Read more

[테스트 주도 개발] 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() 이 무언가를 명시적으로 반환하지 않아도 된다는 장점이 있다.

Read more

[테스트 주도 개발] 24장_xUnit 회고

xUnit을 사용하다 보면 assertion 의 실패와 나머지 종류의 에러 사이에 큰 차이점을 알게된다. 일반적으로 assertion failure가 디버깅 시간을 더 많이 잡아먹는다.
JUnit은 간단한 Test Interface 를 선언하는데 TestCase와 TestSuite 모두 이를 상속받는다. 만약 JUnit 도구가 테스트를 실행하게 만들고 싶으면, Test 인터페이스만 구현하면 된다.

1
2
3
4
public interface Test {
public abstract int countTestCases();
public abstract void run(TestResult result);
}

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

Read more

[테스트 주도 개발] 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() 메서드를 이용하는 것이다. 테스트는 다음과 같이 변한다.

Read more

[테스트 주도 개발] 19장_테이블 차리기

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

테스트 작성에는 다음 패턴이 있다.

  1. 준비 : 객체 생성
  2. 행동 : 어떤 자극 주기
  3. 확인 : 결과 검사

두, 세 번째는 항상 다르지만, 처음 단계는 여러 테스트에 걸쳐 동일한 경우가 있다.
테스트 커플링을 만들지 말자.
테스트 실행전에 우리는 어떤 플래그를 거짓으로 두기 원했다. 발전시키자.

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

wasSetUp 속성이 없으니 세팅하자.

1
2
3
class WasRun(TestCase):
def setUp(self):
self.wasSetUp = 1

setUp 호출하는 것은 TestCase 이니 이곳을 손보자.

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

def setUp(self):
pass

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

wasRun 플래그를 setUp 에서 설정하면 WasRun 을 단순화 할 수 있다.

Read more