따뜻한 대한민국 겨울만들기

TDD (Test-Driven Development)


- TDD는 테스트 기술이 아니다. TDD는 분석 기술이며, 설계 기술이기도 하다. 사실은 개발의 모든 활동을 구조화하는 기술이다.

- 자동화된 테스트로 개발을 이끌어 가는 개발 방식을 테스트 주도 개발(TDD)

- 작성해야 하는 프로그램에 대한 테스트를 먼저 작성하고 이 테스트를 통과할 수 있도록 실제 프로그램 코드를 작성.


  1. 무엇을 테스트할 것인가 생각한다.
  2. 테스트를 작성한다.
  3. 테스트가 실패하게 만든다.
  4. 테스트를 통과하는 코드를 작성한다.
  5. 코드를 리펙토링한다. (리펙토링 과정에서 물론 테스트를 계속 통과해야만 한다.)
  6. 테스트코드 또한 리펙토링한다.
  7. 구현해야 할 것이 있을 때까지 위의 작업을 반복한다.

Why TDD ?


- 즐거운 프로그래밍?

테스트를 먼저 만들고 그 테스트를 통과하는 실제 코드를 만들고, 불필요한 코드를 테스트를 기반으로 수정해 나가는 작업은 썩괜찮은 프로그램을 만들고 느끼는 감정보다 더욱 깊이가 크다. 검증받은 코드, 자신있는 코드가 되기 때문입니다.

테스트를 통과하고 안정적인 코드를 만들때 즐겁지 않은가?


- Simplicity

간단한 코드, 누가봐도 이해하기 쉽고 당연해 보이는 코드, 말이 쉽지 가장 어려운 것중 하나입니다. 그리고 또한 프로그래머들의 궁극적인 목표이기도 합니다. TDD는 Simple한 코드를 만들기 위한 가장 효과적인 방법입니다.

"요즘 프로그래머들은 주석을 많이 다는 것이 좋다고 배웁니다. 주석문이 많을 수록 더 좋은 코드라고 생각하는 것이죠. 하지만그들은 도대체 왜 코드가 주석문을 "필요로 하는지" 배우지 못합니다. 나쁜 코드는 많은 주석문을 요구합니다."
                                                 - Pragmatic Programmers 의 앤드류 헌트(Andrew Hunt) -


- 현재상태에대한 명확한 판단

코드를 작성하며 앞으로 해야할일이 무엇인지, 얼마나 남았는지, 어느정도 시간이 걸리는지를 명확히 알고있는 프로그래머는 많지않습니다. 누군가 시간이 얼마나 걸리냐고 물어보면 선뜻 대답하지 못하는 이유이기도 합니다. 자신이 만들고 있는 프로그램의 현상태가어떠한지를 명확히 알 수 있어야 합니다.

TDD(Test Driven Development)는 자연스럽게 현재 자신의 상태를 알 수 있습니다. 그 이유는 TDD가 현재의 상태를 체크해가며 프로그램을 만들어 나가는 방식이기때문입니다.


- 안정성있는 코드

초보 프로그래머들뿐만 아니라 어느정도 경험이 있는 프로그래머라도 자신이 만든 프로그램이 정확하게 동작하는지 명확하게 알지못할때가 있습니다. 이러한 불안은 프로그래머에게 스트레스를 줍니다. TDD는 이러한 불명확함, 즉 불안감을 지루함으로 바꾸어놓을때까지 테스트를 하며 코드를 만들수 있습니다. 불안함이 지루함으로 바뀌는 시점이 바로 안정성있는 코드가 만들어지는 순간입니다.


- 프로그래밍 실력 향상

테스트를 기반으로 코드를 작성하면 기존에 가져오던 사고의 틀을 깨어버릴 수 있습니다. 가장 Simple한 디자인 설계가가능해지고, 테스트를 하기 위해서 당연한 디자인들이 나오기 때문입니다.  따라서 프로그래밍 실력이 향상 될 수 밖에 없습니다.


GUI 프로그래밍의 TDD

- 초보자들이 TDD하기 어렵다고 말하는 영역이 바로 이 GUI 프로그래밍이다.
Flash/Flex/웹 프로그래밍도 여기에 속한다. 하지만 어려운거지 안되는 건 아니다.

- 테스트 가능성을 높히기 위해 모델과 뷰를 분리하자.

- 네트위크/데이터베이스 관련 테스트는 목 데이터를 사용하자.

프로젝트 중반에 TDD를 도입하려면 어떻게 해야 할까?

- 어느 정도 작동하는 코드가 상당량 있다. 새 코드는 TDD로 작업하길 원한다. 어떻게 해야 될까?

가장 큰 문제는 이렇다.
테스트를 염두해 두지 않고 만든 코드는 테스트하기가 그리 쉽지 않다는 점이다.
따라서 우선 해야 할 일은 변경의 범위를 제한하는 것이다. 시스템에서 극적으로 단순화될 수 있지만 지금 당장 변할 필요가 없는 부분을 봤다면, 그냥 그대로 놔 둘 것이다.
과거의 잘못에 대해 눈물을 흘릴지 모르지만 일단 그대로 놔둔다.


 TDD 에 관한 말들

- 일단 구현해야 할 대상이 생긴다면 프로그래머는 자신의 노하우를 이용하여 최상의 프로그램을 만들어 낸다. 그리고 자신이 만든 코드가 제대로 동작하는지 테스트를 한다. 이것이 우리가 늘 사용해 왔던 일반적인 방법이다.

- 상태를 갖고 있는 프로그램은 그렇지 않은 프로그램(사이드이펙트가 없는 프로그램)에 비해 유닛 테스팅 하기가 상대적으로어렵습니다. 될 수 있으면 상태가 적거나 혹은 겉에 티가 나지 않도록 하면 그 프로그램에 대해 생각하기가 쉬울 뿐만 아니라테스트하기도 쉽습니다.

- 자신이 그 프로그램에 대해 원하는 특징들을 친구에게 전화상으로 말해준다고 상상해 보세요. 그리고 그요건들을 하나씩 테스트로 바꿔보세요.


유닛 테스트 프레임웍 소개

AsUnit

- Actionscript 2.0/3.0 지원하는 xUnit 계열의 단위 테스트 프레임웍 ( Flash IDE 지원 )



* 기본 클래스

- AsUnitTestRunner.as - 테스트를 실행해 주는 클래스
- AllTests.as - TestSuite로 테스트 케이스들이 열거 되어 있는 클래스
- TestCase.as - 테스트 메소드들이 들어 있는 Test 클래스가 상속
- TestSuite.as - 메소드 단위가 아닌 특정 Test 클래스들을 한데 묶어 실행할 때 사용


- 폴더구조 : 테스트 코드와 실제 코드가 완전히 분리 되어 있다. ( src 와 test-src )
각각의 소스폴더 패키지 구조를 같게 하여 쉽게 테스트 코드와 매칭 될 수 있다.

- FlexUnit 보다는 UI면이나 기능면으로 조금 떨어지나 xUnit 계열과 테스팅 방법이 거의 동일하여 가볍게 사용할 수 있다.

- 유명한(?) 초록바와 빨간바도 볼 수 있다.

- Assertion(단언)
AssertEquals : 두 개의 동일성을 비교
AssertTrue : 판단 결과가 True 라고 선언
AssertFalse : 판단 결과가 False 라고 선언
AssertNull : 객체가 Null 이라고 선언
AssertNotNull : 객체가 Null 이 아니라는 것을 선언
AssertSame : 두 객체가 같은 인스턴스임을 선언
AssertNotSame : 두 객체가 같은 인스턴스가 아님을 선언

- setUp / tearDown 메소드
테스트 클래스에서 재정의 하여 사용
테스트 클래스의 메소드가 실행되기 전에 setUp 메소드가 호출되고,
메소드 실행이 끝나고 난 뒤 tearDown 메소드가 호출된다.

이 두 메소드를 적절히 사용하면 ( setUp은 초기화시 사용, tearDown은 인스턴스 해제시 사용)
각 테스트들의 독립성을 보장 받을 수 있다.


FlexUnit


- Flex 프로젝트에서 사용하는 이쁜 UI의 단위 테스트 프레임웍
- Flex Builder 에서 플러그 인 제공
- 추후 Flash Builder 에서는 Unit Test 프레임웍 기본 제공

- Version
FlexUnit 0.9 - swc 로 제공되어 지며, Runner 클래스를 따로 만들어서 테스팅
FlexUnit 4 (beta 2.0) - 한층 업그레이드 된 UI와 기능으로 현재 베타 버전이지만, 곧 정식 버전으로 나온다고 한다


참고

참고 문헌

테스트 주도 개발 (Test-Driven Development By Example) - Kent Beck 저

TDD 개발 관련 참고

Test Driven Development
Extreme Programming 사용자 모임
TDD 개발 동영상

AsUnit

AsUnit Framework 다운로드

AsUnit Documentation

AsUnit Testing Sample :
Inside RIA
The Essential Guide to Open Source Flash Development
asunit testing with flash cs3 and actionscript 3
Getting started with AsUnit 3.0 and FlashDevelop3 in AS3

FlexUnit

FlexUnit Framework 다운로드

FlexUnit Eclipse Plugin

Flash Builder 4 의 TDD 기본 지원에 대해

FlexUnit Testing Sample :
Inside RIA
Unit testing and Test Driven Development(TDD) for Flex and ActionScript 3.0
How to use FlexUnit with FlexBuilder 2
Flex unit testing and continuous integration : Part 1 of 2
Testing visual components with FlexUnit
How to handle events in a TestCase?

Astre

Astre Framework 다운로드