본문 바로가기
Tools for Dev

Test Driven Development (TDD) & Unit Test

by leanu 2008. 6. 11.

Introduction
----------------------------------------------------------------------------
Test Driven Development : TDD란 개발하고자 하는 프로그램(혹은 프로그램을 구성하고 있는 컴포넌트)의 동작을 점검할 수 있는 테스트를 먼저 작성하고 테스트를 통과할 수 있게 코딩을 하는 방법을 말한다.

Unit Test : 하나의 프로그램을 일을하는 작은 단위로 잘게 나누어작은 단위들이 올바로 동작하는지를 확인하는 과정이다. Test Driven Development 를 하기위해 이용하는 하나의 매커니즘이다.




Why should we use?
----------------------------------------------------------------------------
 - TDD를 사용하는 이유('익스트림 프로그래밍' 책을 인용하였습니다.)

      1) 프로그램의 동작 명확화 : 프로그래밍 할때 간혹 '혹시 모르니까 넣어두자'는 식의 코드들을 추가하기 쉽다. 이 프로그램이 무엇을 해야하는지 객관적으로 명확히 명시를 하게 된다면, 코딩의 초점을 일어버리지 않는다. 다른 코드를 넣고 싶다면, 현제 작성한 테스트를 통과하게 만든 다음에 또 다른 테스트를 작성하라.

      2) 설계의 문제점 검토 : 테스트를 작성하기가 쉽지 않다는 말은, 테스트 작성 자체의 문제라기보다는 프로그램의 설계상에 문제가 있다는 것이다. 응집성이 높은 객체들의 코드는 테스트하기 쉽다.

      3) 신뢰도 증가 : 여러사람이 작성하는 프로그램의 경우 문제를 일으키게 되면 서로의 코드를 의심할 수 있다. 잘 동작하는 최적화된 코드를 작성하고 자동화된 테스트로 코드의 의도를 분명히 드러낸다면 팀원들은 쉽게 신뢰할 수 있을 것이다. 가령 프로젝트를 버전업하기 위해 다른사람이 투입되거나, 원래 개발자가 개발한지 오래 되었다면 버전업을 위해 추가한 코드가 기존의 프로그램에서 어떤 문제를 야기하는지 알기 위해서는 릴리즈 하고나서 수많은 고객 테스트를 거쳐야 알 수 있다. 그래서 TDD를 도입하여 추가기능에 대한 안정성에 대한 신뢰도를 보하려는 것이다. 또한 개발자 입장에서 테스트 코드를 보다보면 메뉴얼에 기술한 내용보다 몇배는 명확하게 다가오기 마련이다.

      4) 프로그래밍의 리듬 유지 : 본인이 가장 공감가는 이야기. 코딩을 하다보면 몇 시간씩 무엇을 해야 할 지 길을 잃고 헤매는 일이 잘 일어난다. TDD를 이용한다면 다음에 무엇을 할 지가 분명해진다. 다음 할 일이란 다른 테스트를 작성하거나 통과되지 않는 테스트를 통과하도록 만드는 일중에 한가지 이기 때문이다.




Efficient Usage
----------------------------------------------------------------------------



Any Problems?
----------------------------------------------------------------------------
 - 간과할 수 있는 사항 : 미시적 관점에서 행하는 테스트이기 때문에 '두 객체가 함께 잘 동작하는가?' 등의 사항은 고려할 수 없다는데에 한계가 있다.


사용자 삽입 이미지
솔직히 말해서 실망했다. 더 크고, 확실한 성과를 기대했던 것이다.

코드의 품질이 나아질 거라고 말했지만, 사실 내 코드의 품질은 더 나빠졌다. (사실은 제대로 읽어보면, 실질적으로 나뻐진 게 아니라, 잘못 사용하고 있던 것들을 들춰내서 표면적으로 나뻐졌다는 이야기가 나옵니다.)

끝내주는 비방(silver bullet) 같은 게 아니었다.

[그러나] 내가 말하고 싶은 것은, 나는 결코 [테스트 주도 개발(이하 TDD)을 하기] 이전으로 돌아가지 않으리라는 것이다.

코드의 품질을 낮아졌지만, 코드에 대한 나의 이해는 높아졌다.

누군가는 이렇게 말할지 모르겠다. "어떤 규칙 같은 걸 만들어서, 네가 변경하는 코드를 제대로 이해하고 있는지 확인하는 건 어때? 그걸 위해서 굳이 TDD [같은 번거로운 것]을 할 필요까지는 없잖아?" 글쎄, 나는 거의 항상 변경하려는 코드를 이해하고 있다고 생각한다. 그런데 그러고 보니까 내가 정말 내가 그러고 있기는 하나? 이게 바로 TDD가 정말 도움이 되는 부분이다.

이것이야 말로, 내가 듣지 못한 TDD의 커다란 장점이다.

출처: http://betterways.tistory.com


My Opinion

----------------------------------------------------------------------------
TDD 나 Unit test 또한 짧은 시간내에 유용성을 느끼기는 쉽지 않겠지만 좋은 프로그래밍 기법의 한가지 답이 될 수 있을 것이다. 당부하고자 하는 것은, 짧은 지식으로 이것들을 맛보기만 한 후 그것이 효율적이지 않다고 결론을 내리는 우를 범하지 않길 바란다. Copy & Paste 를 남발하고, 대충 대충 코딩하는 사람은 프로그래머가 아니다. 단지 문서를 작성하는 사람일 뿐이다.

by Leanu




References
----------------------------------------------------------------------------

CppUnit Wiki : http://cppunit.sourceforge.net/cppunit-wiki

CppUnit CookBook : http://cppunit.sourceforge.net/doc/lastest/cppunit_cookbook.html
CppUnit CookBook (한글) : http://kukuta.tistory.com/90

Boost Unit Test Library :
http://www.boost.org/doc/libs/1_35_0/libs/test/doc/components/test_tools/index.html

댓글