[1002] : exp_i
by 1002
카테고리
이전블로그
이글루링크
최근 등록된 덧글
최근 등록된 트랙백
tdd에서의 리팩토링은..
by C++ 프로그래머 티오
이글루 파인더
rss

skin by 꾸자네
from 켄트 벡이 대답하기 2탄 : TDD 에서의 테스트
켄트 벡이 대답하길 2탄  에서 질문 중 하나에 대한 답변. 그리고 그에 대한 트랙백

Q: TDD의 테스트는 두가지 목적이 있는 것 같다. 하나는 디자인 시의 가이드, 또 하나는 리팩토링 때의 회귀 테스트. 전자의 경우에 나온 테스트는 리팩토링의 안전성을 보장하기에는 성글어서 문제가 될 수 있다. 그렇다면 어떻게 해야 하나?

"켄트 말하길, 디자인, 테스트의 분리가 이상하다. 단계(phase)를 만들어 넣는 것 같다. 나는 중요한 테스트라면 처음 테스트를 만들 때 다 한다. 나중에 깨질 것 같은, 불안한 부분이 있을 때 뒤로 미루지 않는다. 그러나 리팩토링할 때 뭔가 새는 부분을 찾았다면 나는 새로운 것을 배운 것이다."


각각의 말들에 대해서 고민을 하게 되다.
'디자인, 테스트의 분리가 이상하다. 무언가 단계를 만들어 넣는 것 같다.'

TDD 를 진행하는 중에 최종 코드 상으로는 그 둘이 구분되지 않는다. 다만, 이 코드를 작성하는 과정 중에 사고의 분리가 있거나 없거나 하는 것으로 이 단계가 구분된다.
개인적인 경험으로는, '디자인 과정 중에 나온 테스트' 의 경우 디자인을 우선시 하기 위해서 테스트 코드에의 넣는 입력 대비 아웃풋을 간략히 하고, 구현을 진행한다. 구현 중 Fake it 을 하더라도, 최종적으로 Real Implementation 을 진행한다. 이 경우를 생각하면
 1. 코드 구현 상으로는 Real Implementation 으로, 이미 완성된 결과물이 나온다. (코드를 작성할 때 당시 생각할 수 있는 선 내에서)
 2. 그럼에도 불구하고, 처음에의 테스트 코드 수가 그대로 유지되는 경우가 많다. 테스트 작성은 비용이 들면서도, 이 비용 자체는 실제 구현을 위한 직접비용이라기 보다는 간접비용에 더 가까우므로, 추가 테스트를 잘 작성하지 않으려고 한다.
여기서 2번째 부분, TDD 초심자와 TDD 에 익숙한 사람 둘 다 실수 할 가능성이 높은 상황일 것 같다. 아마 대부분의 개발자의 경우 2번에서 테스트의 수가 멈춰버릴 것이다. 그리고 TDD 에 익숙하다고 생각하는 사람들은 '이 부분은 안전해' 하면서 테스트를 추가 작성하지 않고 Test Step 을 깨고 Real Implementation Step 으로 진행할 경우들이 있을 것이다. 그리고 Real Expert 는 추후 요구사항이 늘어날 때, 2번 파트와 관련하여 관련되는 객체들을 다시 찾고, 아는 만큼의 예외들에 대한 테스트들을 추가적으로 작성할 것이다.
 * 오히려 'Fake it - real implementation' 혹은 'triangulation - real implementation' step 으로 TDD 를 진행하는 사람의 경우 2번에서의 실수를 방지할 것 같다는 생각할 것 같다.

'중요한 테스트라면 처음 테스트를 만들 때 다 한다. 나중에 깨질 것 같은, 불안한 부분이 있을 때 뒤로 미루지 않는다.' - '아는 만큼의 Courage를 가지고 TDD를 진행한다.' 라고 해석할 수 있을까. 이에 대해서 고민되는 점은, '현재 프로그램 중 불안한 부분이 있긴 한데, 이에 대해서 테스트로 작성할 지식이 없다면? 어떻게 서술해야 할지 모르겠다면? 그럼에도 리팩토링은 진행해야 될 것 같은데.. ' Courage 와 Fear 간의 대립이 시작된다.

그리고 그에 대한 대답이 다음에 이어진다.

'리팩토링할 때 뭔가 새는 부분을 찾았다면 나는 새로운 것을 배운 것이다.'

Courage 를 가지고 리팩토링 스텝까지 진행을 했음에도 불구하고, 실제 리팩 전-후가 잘못되는 경우는 사람인 이상 누구나 있을 수 있다. 그 경우가 발생했을 때는 보통 사람들은 '아.. 이런. 리팩토링은 많이 위험하구나' 하며 Discourage 되고, 몇몇 사람들의 경우  좀 더 간단하고 쉽게(거기에 시니컬 함을 덧붙여) 'TDD 나 Refactoring 은 여기까지가 한계구나. 사람인 이상 리팩하다 실수 밥먹듯 할텐데. 이렇게 위험한 것을 어떻게 써?'

그리고 켄트 백은 간단히 '그때마다, 나는 새로운 것을 배운 것이다' 라고 이야기한다.

----

답을 듣는 중에 다음과 같은 목소리가 들려온다. 'Fear를 구체화하여 Test 화 하라고 했는데. 책을 찾아보거나, 다른 사람들과 대화를 하거나. 실험을 하거나, 더 공부를 하거나. 왜 그러한 시도들을 해보지 않는가?'
 
by 1002 | 2006/11/11 15:44 | 트랙백(1) | 덧글(1)
트랙백 주소 : http://free1002.egloos.com/tb/2810697
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Tracked from C++ 프로그래머 티오 at 2006/11/12 21:26

제목 : tdd에서의 리팩토링은 일반 리팩토링과 목적이 다르..
켄트 벡이 대답하길 2탄 from 켄트 벡이 대답하기 2탄 : TDD 에서의 테스트 Q: TDD의 테스트는 두가지 목적이 있는 것 같다. 하나는 디자인 시의 가이드, 또 하나는 리팩토링 때의 회귀 테스트. 전자의 경우에 나온 테스트는 리팩토링의 안전성을 보장하기에는 성글어서 문제가 될 수 있다. 그렇다면 어떻게 해야 하나? >>'디자인 시의 가이드'에서 디자인이 무엇인지 잘 모르겠네요. 테스트가 디자인을 할 때 ......more

Commented by 테이_ble at 2006/11/17 15:36
"그때마다 새로운 것을 배운 것이다" 정말 감동입니다^^
※ 로그인 사용자만 덧글을 남길 수 있습니다.
<< 이전 페이지 다음 페이지 >>