테스트 얼마나 만들어야 할까?

에자일한 소프트웨어를 만드는 방법의 하나로 TDD 에서는 test를 먼저 작성하는 것을 권장? 혹은 강요한다. 스펙에 맞춰 테스트를 하나하나 만들어가고, 그 테스트 케이스들을 초록색으로 만드는 것을 반복해 나가다 보면 에러 없는 코드가 완성된다는 것이다. 이 방법론에 대해 비난할 생각은 없다. 매우 좋은 방법이다. 근데 정말로 언제나 해야 하는 걸까? 부작용은 없을까? 내가 이것들에 대해 고민하게 된 것은 TDD를 처음 배우고 Rails를 사용하고 있던 3년 전 일이다. 그전에 했던 프로젝트가 C++로 서버를 만드는 일이었고 사소한 예외처리 몇 개를 실수해서 몇 일 밤을 새웠던 직후라서 더욱더 테스트에 매달리게 되었다. 다행히도 rails는 유닛테스트에 특화된 framework이었고 (당시에 DB까지 unit test가 가능하도록 지원해주는 framework이 얼마 없었다.), TDD의 원칙에 따라서 많은 테스트와 함께 코드를 작성해 나갔다. 그렇게 가끔 테스트가 없었으면 크게 삽질했을 버그를 잡아가면서, 그 프로젝는 내가 질릴 때까지 별문제 없이 진행되었다. 여기까지만 보면 TDD의 긍정적인 사례에 추가될 수 있을 것 같지만, 실상은 전혀 아니었다. 문제는 두 가지가 있었다. 첫 번째는 테스트 작성에 심취해서 개발에 너무 많은 시간이 들었다는 것이고, 두 번째는 너무 빨리 질렸다는 것이다. 당시에는 아직 TDD에 적응이 안 돼서라고 생각했는데, 정도의 차이가 있었지만 2번째 프로젝트에서도 비슷한 현상이 나타났다. 왜 그렇게 된 것일까? 이것에 대해 고민하다가 RubyOnRails의 제작자인 David Heinemeier Hansson의 글 을 보게 되었다. 논쟁이 많이 되었던 글이지만 David가 말하고자 하는 바는 단순하다. 테스트를 작성하는데 들어가는 비용도 기능 구현이나 디버깅에 들어가는 것과 같은 비용이니 overtest하지 않도록 노력해야 한다는 것이다. Unittest라는 도구를 처음 접해 아무 생각 없이 심취해버렸던 나는, test를

GateOne - HTML5 ssh client.

Surface RT를 8.1로 올린 뒤로 jailbreak가 안되는 바람에 Web기반 ssh client를 이것저것 찾아봤다. 위키 를 찾아보니 다양한 프로젝트들이 있어 이것저것 살펴봤는데 GateOne 이 가장 마음에 들었다. 일단 생각나는 장점은 아래와 같다. 오픈소스이다. github으로 소스 관리를 한다. 서버사이드가 파이썬으로 짜여있다. 클라이언트 UI가 섹시(?)하다. 플러그인 없이 HTML5로만 구현되었다. SSL을 쓸 수 있다. 서버를 실행시킬때 루트권한이 필요 없다. 정도가 될것 같다. 특히 과거 오픈소스 프로젝트로 서버 프로그램을 테스트하다가 해킹당했던 기억때문에 서버를 실행시킬때 루트권한이 필요 없다. 가 매력적이었다. virtualenv를 이용하여 설치하고, 실행옵션으로 넣을 수 있는 몇가 옵션만 변경시켜주면 쉽게 실행시켜줄 수 있다. 아쉬운점이 있다면 한글 입력이 불편하다는 건데, 다른 대부분의 클라이언트들은 한글 폰트가 깨져나오는 것을 보면 큰 단점은 아니라고 생각한다. 예전부터 만들고 싶었던 부류의 물건이기도 하고, 깔끔하게 구성되어 있어서 한동안 내 장난감은 이게 될것 같다.

레인지로버 무선 마우스

개발용 블로그와 그 외의 일상생활들에 대해 적는 블로그를 나누기 시작했다. 본래 있던 글은 https://www.seulgik.im/2013/09/blog-post.html 로 이동되었다.

Surface RT 구매

개발용 블로그와 그 외의 일상생활들에 대해 적는 블로그를 나누기 시작했다. 본래 있던 글은 https://www.seulgi.kim/2013/08/surface-rt.html 로 이동되었다.

Structure and Interpretation of Vim - mparm_T

Before analyzing how to initialize vim, I'll give you a brief description of mparm_T . The mparm_T is used for sharing several parameters with the main function and other functions for initializing. This struct reduces complexity of passing parameters. But it is just wrapper, not organized well, so comprehending it without prior knowledge is little hard. I'll explain the parameters in mparm_T one by one. 1. argc, argv These are copy of argc and argv of main function. The other parameters are initialized according to argv . 2. evim_mode Run with " -y " option or run by evim command, start as the easy vim. The easy vim always runs as gui mode and there is no normal mode. I don't know what it is exactly, becuase I've never used it. If you wonder, read the man page and " :help evim ". 3. use_vimrc This parameter is set by " -u " option. It can be NULL, "NONE", "NORC" and file name. The Vim skips both sys

Majestouch 스위치 교체

개발용 블로그와 그 외의 일상생활들에 대해 적는 블로그를 나누기 시작했다. 본래 있던 글은 https://www.seulgi.kim/2013/04/majestouch.html 로 이동되었다.

Poker X 스위치 교체

개발용 블로그와 그 외의 일상생활들에 대해 적는 블로그를 나누기 시작했다. 본래 있던 글은 https://www.seulgi.kim/2013/04/poker-x.html 로 이동되었다.

이 블로그의 인기 게시물

Escape Codes의 역사

[C++] enum class - 안전하고 쓰기 쉬운 enum

RAII는 무엇인가

Log Aggregator 비교 - Scribe, Flume, Fluentd, logstash

[Python] cache 데코레이터로 최적화하기