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

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 다운로드

  1. BlogIcon 우야꼬 

    | 2009.11.30 16:06 신고 | PERMALINK | EDIT | REPLY |

    저도 요즘 켄트백횽님 책 사서 읽고 있는데
    그동안 손에 익은게 있어서 그런지
    영 현업에 적용하기가 낯서네요... ㅠ.ㅠ

  2. BlogIcon 꽃녀

    | 2009.11.30 17:01 신고 | PERMALINK | EDIT |

    저도 너무 너무 힘들더라구요 ㅜㅜ
    야꼬님 오랜만입니당^^ 반갑네용~

  3. BlogIcon 혀니

    | 2009.11.30 17:04 | PERMALINK | EDIT | REPLY |

    음~ 테스트 주도 개발도 보시고, 소프트웨어 개발의지혜도 보시면 좋을듯...
    갠적으로는 후자를 권해드립니다.

    왜냐하면 TDD, Refactoring, 설계, DP 등 전반적인 내용을
    Case 별로 좀 더 나은방법을 제시하며 설명하고 있어서
    이해하기에 더 쉽습니다.
    (책은 두껍지만 보고나니 실제 양은 그렇게 많지 않습니다.^^;;)

  4. BlogIcon 꽃녀

    | 2009.11.30 18:57 신고 | PERMALINK | EDIT |

    혀니님 방문 감샤용~
    아.. 저는 테스트 주도 개발을 읽은게 아니라 그냥 훓었는데;;
    요것도 어렵더라구요.
    소프트웨어 개발의 지혜란 책도 있군여.
    추천 감사해용~ ㅎㅎ ^^;;

  5. BlogIcon 찬익

    | 2009.12.23 14:49 신고 | PERMALINK | EDIT | REPLY |

    오랜만이에요, 꽃녀님. ㅎㅎ 좋은 글이네요.
    ASUnit은 FlexUnit이 탄생하기 전에는 가끔 쓰였는데, 요즘 Flex 프로젝트에서는 잘 안쓰이는 것 같아요. Flex 프로젝트가 아닌 AS 기반 프로젝트에서는 여전히 쓰고 있지 않을까 싶어요.
    상태를 가지고 있는 소프트웨어의 경우, 현재 해외에서 Behavior Driven Development라는 테스팅 기법이 연구/개발되고 있어요. Flex에서도 SDK 개발팀 내부적으로 Mustella라는 BDD를 지원하는 프레임워크를 사용하고 있는데, 관련글을 트랙백으로 달았어요. ㅎㅎ

  6. BlogIcon 꽃녀

    | 2010.01.25 23:23 신고 | PERMALINK | EDIT |

    찬익님 반가워용^^ BBD라..처음 들어봅니당 흐흐 트랙백 까지 걸어주시다니... 잘 볼께용~~제가 요즘 너무 블로그가 뜸해서 아..아쉽습니당 ㅜㅜ

  7. BlogIcon 동강

    | 2009.12.23 23:35 | PERMALINK | EDIT | REPLY |

    ㅋㅋ오랜만에 좋은글 보고 갑니다. TDD 아직 낯설게 느껴지네요.
    저도 켄트백횽님 책을 사서 읽어 봐야 겠어요.

  8. BlogIcon 꽃녀

    | 2010.01.25 23:25 신고 | PERMALINK | EDIT |

    제가 빌려드릴수도 있어용^^메세지 주세용 ㅋㅋㅋ 동강님이랑 진하게 술먹을 기회가 없네영^^ 그냥 인사만 하고;;ㅋㅋ ㅜㅜ

  9. BlogIcon hika

    | 2010.03.31 09:28 | PERMALINK | EDIT | REPLY |

    켄트백의 책이 매우 뛰어난 점은 오래된 책임에도 불구하고 그렇게 실감나게 TDD를 진행하는 과정을 설명한(묘사한) 책이 없다는 점이겠죠. 좀 두껍지만 xUnit 테스트 패턴이란 책도 좋고, 프로그램은 왜 실패하는가 라는 책도 상당히 좋답니다.

    테스트 주도 개발은 역시 IDE가 완전히 지원해서 클릭 두어번으로 테스트 클래스의 뼈대를 거의 만들어주지 않는다면 귀찮아서 실무에 쓸 수 없죠.
    한두개에 만들겠지만 메서드별로 대여섯개씩 단정테스트를 하는 클래스를 작성한다는건 시간상 넌센스에 가깝죠.

    그런면에서 플래시빌더의 테스트클래스 위자드가 생긴 것으로부터 본격적인 as3계의 테스트프레임웍 도입이 현실적으로 가능하다고 보고 있습니다. ^^

  10. BlogIcon 꽃녀

    | 2010.04.01 13:30 신고 | PERMALINK | EDIT |

    헉 이런 장문의 댓글을 ^^ 켄트백님의 책은 정말 좋은 것 같았어요..방문 감사드립니당!!

  11. BlogIcon secondMemory

    | 2011.03.06 17:31 | PERMALINK | EDIT | REPLY |

    제작년쯤 TDD를 해보려고 하다가 실패했는데ㅠ 이 포스트를 보니 다시 한 번 더 시도를 해야할 것 같은 느낌이 드는군요.ㅠ 포스팅 감사합니다~

Write your message and submit
« PREV : 1 : 2 : 3 : 4 : 5 : 6 : ··· : 13 : NEXT »