일단 저의 논지는 TDD에서는 테스트작성을 먼저하도록 하고 있으나 반드시 그럴필요는 없다는 것입니다.
결과를 쉽게 예측가능하다면 테스트를 먼저 작성할수 있지만 그렇지 않은 상황도 있기 때문에 테스트 작성의 순서보다 테스트를 작성하
고 수행한다는데 더 큰 목적을 둬야한다는거죠. 물론 테스트를 먼저작성하면 보다 테스터블하고 코드커버리지가 높고 누락되는 항목이
줄어들게 됩니다. 만약 순서가 TDD실천의 판단기준이라면 항상 테스트를 먼저 작성해야 한다는 압박과 결과를 쉽게 예측하지 못하
는 상황에서는 먼저 작성하는것 조차 쉽지않을 것입니다.
강의중 수강생이나 프로젝트 팀원들에게서 받는 질문중에 테스트를 항상 먼저 만들어야 하나요? 란 질문을 받곤합니다. 그때 전 이렇
게 얘기하곤합니다.
"절차와 실천방법을 이해하고 실행하는것은 중요합니다. 그러나 그 프레임에 갇혀 근본적인 목적을 잊어버리면 안됩니다. 상황에 따
라 적절한 절차와 방법으로 변경하여 목적을 달성하는게 중요합니다"
어느분이 애자일을 이렇게 비유한적도 있습니다.
"태권도의 품세를 익히는것은 중요하지만 실전에선 품세대로 하지않는다."
TDD의 근본적인 목적은 테스트에 있는것이 아니라 오류가 최소화된 소프트웨어 개발이지 않을까합니다. 그러므로 작성의 순서보다
테스트를 한다는데 더 큰 목표를 둬야 하지 않을까요?
제가 TDD의 전문가가 아니어서 많은분들의 의견을 듣고 저의 생각도 정리했으면하는 맘으로 주제글을 올립니다.
안녕하세요. 처음으로 xper에 글타래에 댓글을 올려 봅니다.^^;
TDD를 업무에 적용해본 경험으로는 개발 진행하는 차원에서는 실제 코드를 작성하고 나중에 테스트를 추가하는 것이 편한 점이 있었습니다.
아무래도 그간 몸에 익어서 그렇게 느껴지는 것 같습니다.
테스트를 먼저 작성할때는 불편하고 번거로운 느낌입니다.
다만 테스트를 작성하고나서 코드를 작성했을때는 코드의 설계자체가 틀려지는 경험을 여러 번 했습니다.
과연 테스트를 만들지 않고 코드 먼저 작성했을 때 이러한 구조의 코드가 나올수 있었을것인가 자문해보면 그렇지않았을 것이다란 결론이 나온적이 많았습니다.
그래서 최근에는 가능하다면 테스트를 먼저 작성하고나서 실제코드를 작성하려고 의식적으로 노력하고 있습니다.
결과를 예측하기 어렵다는 상황이 꼭 무엇을 해야하는지 모르는 상황만 있는게 아니라는 변을 달고 싶습니다.
이건 또 다른 토론주제가 될법한 문제인데 단위테스트의 단위와 크기의 문제입니다.
각각의 테스트 마다 데이터셋을 마련하고 유지하면 좋은데 비즈니스로직이 복잡하면 그 데이터셋을 마련하는것도 상당히 어렵게 됩니
다.
이럴 경우 저는 일단 테스트케이스 작성을 미루고 로컬환경에 배포한후에 비즈니스로직의 오류여부를 판단합니다.
그런 다음 적절한 테스트데이터를 생성하고 테스트케이스를 작성합니다.
이 경우 테스트케이스는 나중에 만들어지지만 이후 로직의 변경이나 리팩토링에서 많은 이익을 줍니다.
On 3월28일, 오전9시51분, 이동인 <leedong...@gmail.com> wrote:
> 결과를 예측할 수 없어서 테스트 코드를 먼저 만들 수 없다면 무엇을 해야 하는지도 모르는 상황에서 코딩을 한다는 이야기가 됩니다.
>
> TDD에 기술적인 부분을 익히기 위해 먼저 코딩을 해보고 테스트를 만드는 것은 이해가 가지만
>
> 익힌 후에도 그런 식으로 TDD를 사용한다면 TDD를 사용하므로 얻을 수 있는 이익이 많지 않을 것이라 생각됩니다.
>
> 2012년 3월 28일 오전 9:37, 임병인(포데브) <brianlim.next...@gmail.com>님의 말:
On 3월28일, 오전10시01분, 정원천 <arisu1...@gmail.com> wrote:
> 안녕하세요. 처음으로 xper에 글타래에 댓글을 올려 봅니다.^^;
>
> TDD를 업무에 적용해본 경험으로는 개발 진행하는 차원에서는 실제 코드를
> 작성하고 나중에 테스트를 추가하는 것이 편한 점이 있었습니다.
>
> 아무래도 그간 몸에 익어서 그렇게 느껴지는 것 같습니다.
>
> 테스트를 먼저 작성할때는 불편하고 번거로운 느낌입니다.
>
> 다만 테스트를 작성하고나서 코드를 작성했을때는 코드의 설계자체가 틀려지는
> 경험을 여러 번 했습니다.
>
> 과연 테스트를 만들지 않고 코드 먼저 작성했을 때 이러한 구조의 코드가 나올수
> 있었을것인가 자문해보면 그렇지않았을 것이다란 결론이 나온적이 많았습니다.
>
> 그래서 최근에는 가능하다면 테스트를 먼저 작성하고나서 실제코드를 작성하려고
> 의식적으로 노력하고 있습니다.
>
> From: xp...@googlegroups.com [mailto:xp...@googlegroups.com] On Behalf Of
> 이동인
> Sent: Wednesday, March 28, 2012 9:51 AM
> To: xp...@googlegroups.com
> Subject: Re: TDD에서 테스트작성 시점에 대하여...
>
> 결과를 예측할 수 없어서 테스트 코드를 먼저 만들 수 없다면 무엇을 해야
> 하는지도 모르는 상황에서 코딩을 한다는 이야기가 됩니다.
>
> TDD에 기술적인 부분을 익히기 위해 먼저 코딩을 해보고 테스트를 만드는 것은
> 이해가 가지만
>
> 익힌 후에도 그런 식으로 TDD를 사용한다면 TDD를 사용하므로 얻을 수 있는
> 이익이 많지 않을 것이라 생각됩니다.
>
> 2012년 3월 28일 오전 9:37, 임병인(포데브) <brianlim.next...@gmail.com>님의
"테스트를 항상 먼저 작성하지는 않지만 먼저 작성하는것이 더 많은 이익을 주며 그렇게 익숙해지려고 한다."는 의견으로 정리해도
비즈니스 로직이라는게 이론처럼 단순하지 않습니다. 인수테스트 요건을 만들듯이 데이터 조건과 결과를 예상하는것은 상당히 어렵습니다. 더구나 처음접하는 비즈니스의 경우 동작하는 결과를 보면서 이해하기도 합니다.
"테스트를 항상 먼저 작성하지는 않지만 먼저 작성하는것이 더 많은 이익을 주며 그렇게 익숙해지려고 한다."는 의견으로 정리해도
또한 "나중에 작성할 수 있다면 먼저 작성할 수도 있지 않겠나"는 의견에도 동의하지만 먼저 만드는 공수와 나중에 만든는 공수를
생각해보면 적당히 타협할 수도 있지않겠나? 싶은 것입니다. "반드시 먼저 만들어야 한다"는 프레임에 갇히기 보단 더 효율적이라
면 나중에 만들어도 되지 않을까요?
테스트를 먼저 만듬으로써 좋은 설계를 할 수 있다는 것이지 테스트를 먼저해야만 좋은 설계를 할수 있다는 것이 아니라는 논지입니
다.
획일적인 하나의 방법을 고수하기 보단 상황과 목적에 따라 적절하게 변형하여 적용하는 게 더 좋다는 거죠.
물론 이런 판단과 적용을 하기 위해선 원래의 절차와 방법을 알 필요가 있습니다.
마치 태권도의 품세를 평소에 연습하여 실전에 적용하는 것처럼 말이죠. 자유로운 몸짓처럼 보이지만 그 몸짓을 어느센가 몸에 밴 품
세의 응용일테니까요.
개발생산성과 품질향상을 위한 글로벌 기업의 애자일 도입 및 적용 사례
http://www.slideshare.net/wgshim/experience-report-agile-adoption-stories-in-lg-electronics
위의 자료를 보면 "성룡의 취권"과 "취객의 취권"이란 슬라이드가 있습니다.
제가 이해한 저자의 의도는 "성룡이 취권을 사용하기 위해서 부단한 노력과 수련을 하는 것처럼 애자일도 부단한 연습과 노력을 통
해 응용해야 한다"입니다.
우리 또한 연습하고 노력해야 하지만 그것을 실전에 도입할 때는 수많은 장벽과 반발에 부딪힙니다.
불완전하지만 적절한 타협점을 찾아서 이상적 방향으로 개선시켜 나가는 게 중요하지 않을까 합니다.
On 3월28일, 오전11시08분, Freddie Park <sorel...@gmail.com> wrote:
> 안녕하세요.
> 저도 아이폰에서 보내는거라 오타에 양해 부탁드립니다.
>
> 저는 테스트케이스를 만드는것과 TDD는 동의어가 아니라고 생각합니다. 테스트케이스는 그 자체로 의미있고 많은 이점을 가져다 주지만, 제가 생각하는 TDD는 설계과정으로서의 테스트케이스의 작성입니다.
>
> 비지니스 로직에 따라 테스트 픽스쳐를 마련하기가 어려울 수 있다는 부분에는 동의합니다. 저같은 경우는 전에 멀티미디어 프레임워크쪽을 개발할 때, 오디오나 비디오 데이타에 대해 도저히 픽스쳐를 생각할 수가 없었습니다.
>
> 그렇다 하더라도, TDD의 핵심은 테스트를 "먼저" 작성하는 것에 있다고 생각합니다.
> 단순히 유닛테스트만을 생각한다면, 버그를 줄여주고 리팩토링을 쉽게 해주는 안전망 정도로 생각할 수 있습니다. 그러나 TDD는 안전망의 개념을 넘어서, 테스트의 작성이 설계의 과정이라는 것에 초점을 두고있다고 봅니다. 테스트를 "먼저" 작성함으로서 설계의 이점을 취하는 것이, TDD의 핵심이라고 생각합니다.
>
> 먼저 말씀드렸던 오디오/비디오 데이타의 경우에는, 순서에 상관없이, 테스트를 나중에 작성하더라도 테스트 데이타는 만들기가 어려웠습니다. 그러나 나중에라도 테스트 데이타를 만들 수 있다면, 먼저 작성하는 것도 가능하지 않을까 하는 것이 제 생각입니다.
>
> Best regards,
> Freddie
>
> 2012. 3. 28. 오전 10:23 임병인(포데브) <brianlim.next...@gmail.com> 작성:
On 3월28일, 오전11시22분, gyehong park <gyehongp...@gmail.com> wrote:
> 병인님 안녕하세요.
>
> 사실 어제 별도로 스레드 만들어서 같이 이야기를 해 보고 싶었습니다.
> 이렇게 먼저 얘기를 해 주셔서 기뻤습니다. ^^*
>
> TDD에서 테스트를 먼저하면 얻어지는 이익들이 많이 있다는 것은 다들 잘 알고 있을 것 같습니다.
> 하지만, 병인님의 글에는 또 다른 뭔가가 있는 듯한 느낌이 듭니다. 저는 그것을 알고 싶습니다.
>
> 그래서 궁금한 것들이 있습니다.
>
> 1. TDD 활용을 완벽하게 할 수 있는 사람이 있을 때도, Test를 나중에 만들어야 하는 경우가 있을까요? 있다면, 이해하기 쉽게
> 설명해 주시면 좋겠습니다.
예측하신 대로 "그렇습니다."
Youngrok Pak 님이나 최영목 님께서 유형에 대한 적절한 예를 제시한 듯합니다. 저도 그런 상황들을 말씀드리고 싶습니
다.
>
> 2. TDD, 단위 테스트, 인수 테스트에 대해서 어떠한 정의를 갖고 계신가요?
Freddie Park 님의 글에 답글을 달았는데 유사의견이시라면 그 글을 통해 저의 의견을 말씀드린것 같습니다.
제가 말씀드리고 싶은 건 정의의 문제가 (물론 개념 정의는 중요합니다만) 아니라 프로젝트 수행과정 중에 테스트 작성의 순서에 대
한 문제입니다.
저의 논지는
1. 테스트를 먼저 작성할 수 있다면 먼저 작성하라.
2. 테스트를 먼저 작성할 수 없다면 구현후 작성해도 된다.
입니다.
[TDD의 근본적인 목적은 테스트에 있는것이 아니라 오류가 최소화된 소프트웨어 개발]에 있다는 저의 의견과
[TDD의 핵심 이득은 좋은 설계를 빠른 속도로 만들어낼 수 있다는 것]이라는 Youngrok Pak 님의 의견
[테스트를 "먼저" 작성함으로서 설계의 이점을 취하는 것이, TDD의 핵심]이라는 Freddie Park 님의 의견 등 많은 분
들의 의견중에
공통되는 것은 테스트가 목적이 아니라 테스트로 인해 얻게될 "무엇"(오류가 최소화된 소프트웨어 개발, 좋은 설계를 빠르게 만들
어 내는 것 등)이며
테스트는 "무엇"을 이루기 위한 충분조건인가, 필요조건인가에 대해서 저는 충분조건이라는 의견입니다.
테스트는 "무엇"을 이루기 위한 하나의 수단이지 전체가 될 수 없다는 의견에서 토론의 주제로 띄운것입니다.
갑자기 이번 토론에 참여하신분들과 Off 모임을 갖고 싶다는 생각이 불현듯 듭니다.
아! 오늘인가요? ㅠㅠ 정모가 ... 갑작스런 컨설팅일정으로 강남으로 오긴했는데 신청을 하지 못했네요. 불청객으로 참여해도 될려
나...
>
> 저는 병인님이 1번 질문에 대해서 "그렇습니다"라고 말한다고 생각하고 있습니다.
> 2번 질문은* Freddie Park *님과 비슷한 의견에서 드렸습니다.
>
> 좋은 하루되세요~
>
> 2012년 3월 28일 오전 10:51, 임병인(포데브) <brianlim.next...@gmail.com>님의 말:
안녕하세요. 주제글을 올려보긴 처음인데 최근 어떤 글에 댓글을 달다가 관련주제와 다른 길로 빠져들어 새로운 주제에서 토론하는게
맞겠다싶어 글을 씁니다. 아이폰에서작성하는거라서 오타가 있을수도 있는데 양해해주세요.
일단 저의 논지는 TDD에서는 테스트작성을 먼저하도록 하고 있으나 반드시 그럴필요는 없다는 것입니다.
결과를 쉽게 예측가능하다면 테스트를 먼저 작성할수 있지만 그렇지 않은 상황도 있기 때문에 테스트 작성의 순서보다 테스트를 작성하
고 수행한다는데 더 큰 목적을 둬야한다는거죠. 물론 테스트를 먼저작성하면 보다 테스터블하고 코드커버리지가 높고 누락되는 항목이
줄어들게 됩니다. 만약 순서가 TDD실천의 판단기준이라면 항상 테스트를 먼저 작성해야 한다는 압박과 결과를 쉽게 예측하지 못하
는 상황에서는 먼저 작성하는것 조차 쉽지않을 것입니다.
강의중 수강생이나 프로젝트 팀원들에게서 받는 질문중에 테스트를 항상 먼저 만들어야 하나요? 란 질문을 받곤합니다. 그때 전 이렇
게 얘기하곤합니다.
"절차와 실천방법을 이해하고 실행하는것은 중요합니다. 그러나 그 프레임에 갇혀 근본적인 목적을 잊어버리면 안됩니다. 상황에 따
라 적절한 절차와 방법으로 변경하여 목적을 달성하는게 중요합니다"
어느분이 애자일을 이렇게 비유한적도 있습니다.
"태권도의 품세를 익히는것은 중요하지만 실전에선 품세대로 하지않는다."
TDD의 근본적인 목적은 테스트에 있는것이 아니라 오류가 최소화된 소프트웨어 개발이지 않을까합니다. 그러므로 작성의 순서보다
테스트를 한다는데 더 큰 목표를 둬야 하지 않을까요?
제가 TDD의 전문가가 아니어서 많은분들의 의견을 듣고 저의 생각도 정리했으면하는 맘으로 주제글을 올립니다.
각각의 테스트 마다 데이터셋을 마련하고 유지하면 좋은데 비즈니스로직이 복잡하면 그 데이터셋을 마련하는것도 상당히 어렵게 됩니다.
이럴 경우 저는 일단 테스트케이스 작성을 미루고 로컬환경에 배포한후에 비즈니스로직의 오류여부를 판단합니다.
그런 다음 적절한 테스트데이터를 생성하고 테스트케이스를 작성합니다.
이 경우 테스트케이스는 나중에 만들어지지만 이후 로직의 변경이나 리팩토링에서 많은 이익을 줍니다.
Mobile: +82-10-9707-8548
e-mail: matthe...@gmail.com
하나는 10년전에 작성한 코드인데 TDD로 하지 않은 코드고...
다른 하나는 TDD로 만든 코드입니다.
TDD로 개발하지 않았던 코드... 뭘 고치거나 사용하려고 해도 욕이 나옵니다. (제가 개발했던 겁니다. ㅜㅜ)
설계차이 많이 납니다. -.-;
TDD 어렵습니다. 애자일 성숙도 맨 끝자락에 있습니다.
많은 고수분들도 계시겠지만 저는 TDD의 원칙은 지켜야한다고 봅니다.
아직 우리팀은 TDD의 변형을 이야기하고 싶지 않습니다.
그래서 저는 테스트 주도 개발이 아니라 테스트 먼저 개발이라고 말하곤 합니다. 자신도 쓰기 애매한 API는 만들 시도도 하지 말
자...
물론 기획 때 아이디어 검증을 위한 프로토타입은 TDD 하지 않습니다.
개발언어도 굳이 정해진 것으로 하지 않습니다. 개념 증명하고 프로토타입은 버립니다.
네. 저도 뭐 그렇습니다.
> > 2012년 3월 28일 오후 12:05, Youngrok Pak <pak.young...@gmail.com>님의 말:
> ...
>
> 추가 정보 >>
Youngrok Pak 님의 의견 대부분에 동의하며 구체화 시켜주신점에 대해 감사드립니다.
[동작하는 코드에 나중에 붙이는 테스트의 가치는 그리 크지 않다]는 의견에 대해서... 고객에게 말할 때
==> "반드시 먼저 작성해야만 합니다." 와 "먼저 작성해야 하지만 나중에라도 작성해야 합니다." 에 대한 의견은 어떤가요?
[모순되는 것 같은 이 두 이야기를 조합하는 방법은, 모드를 분리하는 것입니다. 개념을 탑재하기 전까지는 TDD 없이 일단 돌아
가게
만들어보고, 돌려보면서 직관을 얻은 후, 제대로 개발하기 시작할 때 TDD를 하는 것입니다.]
==> "실용주의 프로그래머"에 '예광탄 프로젝트'라는 주제가 있습니다.
프로토타이핑이나 아키텍처 RI(Reference Implementation)를 할 때는 그 프로젝트 자체가 테스트나 검증하는 것
이기 때문에 버리는 코드이며 본 프로젝트를 위한 것입니다. 하지만 예광탄 프로젝트의 경우 그 자체가 프로젝트의 초석이 되고 빠
른 피드백을 위한 것입니다. 이 예광탄 프로젝트를 하는 목적은 고객도 분석설계자도 개발자도 무엇을 만들지 명확하지 않기 때문에
말그대로 한번 개발해 보는 것이죠. 그리고 동작하는 것을 보면서 구체화시켜나갑니다. 그러나 이 프로젝트의 특징은 버리는 코드가
아니라는 거죠. 즉, 제대로 개발하기 시작할 때 라는 경계가 없다는 것입니다. 물론 특정 시점부터 TDD로 전환 할 수 있습니
다. 저는 이런 상황에서는 이전에 만들어진 코드에도 테스트를 작성해둬야 한다는 의견입니다.
[아마도 프로젝트 초기에는 quick & dirty 모드를 더 자주 해야 할 것이고, 점점 진행될수록 quick & dirty
는 부분적으로만 사용하고 TDD가 주요 모드가 되겠지요. 어쨋든 충분한 직관을 얻었다면 TDD를 하되, TDD를 하는 동안은
Test First로 해야 의미가 있겠지요.]
==> 테스트없이 만들어진 코드에 대해서 TDD적 접근방법은 어떤게 있을까요?
많은 분들과 이런 토론을 하는 것 자체가 즐겁습니다. 참여하신 모든 분들께 다시한번 감사드립니다.
> 2012년 3월 28일 오전 10:51, 임병인(포데브) <brianlim.next...@gmail.com>님의 말:
>
>
>
>
>
>
>
> > "테스트를 항상 먼저 작성하지는 않지만 먼저 작성하는것이 더 많은 이익을 주며 그렇게 익숙해지려고 한다."는 의견으로 정리해도
> > 될까요?
> > 그러므로 TDD에서 테스트 작성의 순서는 중요하다는 의견. 감사합니다.
>
> > On 3월28일, 오전10시01분, 정원천 <arisu1...@gmail.com> wrote:
> > > 안녕하세요. 처음으로 xper에 글타래에 댓글을 올려 봅니다.^^;
>
> > > TDD를 업무에 적용해본 경험으로는 개발 진행하는 차원에서는 실제 코드를
> > > 작성하고 나중에 테스트를 추가하는 것이 편한 점이 있었습니다.
>
> > > 아무래도 그간 몸에 익어서 그렇게 느껴지는 것 같습니다.
>
> > > 테스트를 먼저 작성할때는 불편하고 번거로운 느낌입니다.
>
> > > 다만 테스트를 작성하고나서 코드를 작성했을때는 코드의 설계자체가 틀려지는
> > > 경험을 여러 번 했습니다.
>
> > > 과연 테스트를 만들지 않고 코드 먼저 작성했을 때 이러한 구조의 코드가 나올수
> > > 있었을것인가 자문해보면 그렇지않았을 것이다란 결론이 나온적이 많았습니다.
>
> > > 그래서 최근에는 가능하다면 테스트를 먼저 작성하고나서 실제코드를 작성하려고
> > > 의식적으로 노력하고 있습니다.
>
> > > From: xp...@googlegroups.com [mailto:xp...@googlegroups.com] On Behalf Of
> > > 이동인
> > > Sent: Wednesday, March 28, 2012 9:51 AM
> > > To: xp...@googlegroups.com
> > > Subject: Re: TDD에서 테스트작성 시점에 대하여...
>
> > > 결과를 예측할 수 없어서 테스트 코드를 먼저 만들 수 없다면 무엇을 해야
>
> ...
>
> 추가 정보 >>
의미있는 요약입니다. 그리고...
> 참고로 켄트 벡은 XP 2.0(Extreme Programming Explained 2판)에서 TDD 대신 TFP(Test First
> Programming, 역서에서는 "테스트 우선 프로그래밍")라는 말을 써서 의도적으로 테스트가 앞에 와야 함을 강조하고 있습니다.
> 저는 TFP와 짝을 이뤄, 반복적으로 코딩 후 자동화된 테스트를 만드는 것을 TLP(Test Last Programming)이라고 하고
> 있고, 이미 TLP의 효용에 대해 여러번 이야기한 적이 있습니다(http://agile.egloos.com/5299932 참고).
TFP와 TLP에 대한 설명이 인상깊습니다.
On 3월28일, 오후2시58분, June Kim (김창준) <junea...@gmail.com> wrote:
> 2012/3/28 임병인(포데브) <brianlim.next...@gmail.com>
> - 테스트를 나중에 하냐, 먼저 하냐만으로 TDD다 아니다를 이야기할 수 없다.
> - TDD에서 Test라는 말이 있긴 하지만, 이것은 엄밀하게 말해 엉성한 테스트다. 자칫하면 과신할 수 있다.
> - TDD를 좀 더 넓게 볼 수 있다.
> - 테스트 자체도 DDD를 적용해서, 테스트 작성이 고통스럽지 않아야 한다.
> - 테스트 결과를 예측하기 힘들 때에도 테스트 작성은 가능하다.
> - TDD에 너무 얽매이지 않는 것이 필요하다. 그러면서 나의 상황파악능력, 의도적 수련이 어떻게 되고 있는지 확인해야 한다.
첨언하자면, "주먹이 운다" 같은 프로그램에 나온 길거리 싸움 경험 많은, 자칭 도시별 짱인 사람들이 이종격투기 프로 선수와의 1분 경기에서 왜 초등학생처럼 무력해 보이는지 생각해 봐야 합니다
"태권도의 품세를 익히는것은 중요하지만 실전에선 품세대로 하지않는다."