(필자는 이번 주 시카고에서 열리는 RailsConf에 참석 중입니다. 현장에서 필자를 발견하면 꼭 인사해 주세요! 사이드바 사진 속 나이가 지긋한 분이 바로 필자입니다.)
독자의 질문: TDD, 어디서부터 시작해야 할까?
최근 한 독자가 제 글에 댓글로 테스트에 관한 훌륭한 질문을 남겼습니다:
"TDD 플라이휠"을 굴려야 한다는 것은 알고 있지만, TDD 자체가 너무 낯설습니다. RSpec으로 시작하기 가장 좋은 방법에 대한 조언이 있으신가요? 아니면 그냥 일단 부딪혀 보면서 배워야 하는 것인가요?
그래서 이렇게 답변했습니다:
아직 RSpec과 다른 도구 중 하나를 확실히 정하지 못했다면, 오히려 minitest가 시작하기 더 쉬울 수 있습니다. minitest는 좀 더 '메서드와 클래스' 중심이라, 새로운 문법을 익히느라 애쓰지 않고도 TDD 학습과 연습에 온전히 집중할 수 있습니다.
Rails에는 테스트 용어, assertion(단언), 그리고 Rails에서 테스트를 실행하는 방법 전반을 잘 설명해 주는 공식 가이드도 마련되어 있으니 함께 참고하세요.
TDD를 익히는 가장 좋은 방법은 역시 직접 연습하는 것입니다. 다음 단계를 따라 해 보세요:
- 필요한 코드가 이미 존재한다고 가정하고 테스트를 작성합니다.
- 테스트를 실행해서, 새로 작성한 테스트가 실패하는지 확인합니다.
- 테스트를 통과시킬 수 있는 가장 단순한 코드를 작성합니다. 이 단계에서 과도하게 추상화하거나 리팩터링하려 들지 마세요.
- 테스트를 실행해서, 새로 작성한 테스트가 통과하는지 확인합니다.
- 중복을 제거하거나 코드의 표현력을 높이기 위해 코드를 리팩터링합니다.
- 테스트를 다시 실행해서, 여전히 모두 통과하는지 확인합니다.
- 1번 단계로 돌아갑니다.
TDD를 연습하는 동안 스스로에게 끊임없이 던져야 할 질문들이 있습니다. 지금 나는 몇 번째 단계에 있는가? 어떤 단계를 건너뛰지는 않았는가? 그다음 단계는 무엇인가? (항상 이 단계들 중 하나에 머물러 있어야 합니다.) 이런 습관은 올바른 방향을 유지하는 데 큰 도움이 되며, 무엇인가 새로운 것을 배울 때는 정말로 중요합니다. "연습은 영원히 남는다(Practice makes permanent)"는 말처럼, 잘못된 방식을 반복해서 몸에 익히고 싶지는 않을 테니까요!
동시에 스스로에게 실수할 권한을 허락하세요. 배우는 중이니 당연히 괜찮습니다! 자주 하다 보면 훨씬 쉬워질 겁니다.
놓치기 쉬운 핵심: 테스트 이전의 계획 단계
역시 테스팅 관련 책을 집필 중인 Eric Steele은 제가 놓친 핵심 포인트를 짚어주었습니다:
TDD에서 간과되기 쉬운 부분은 바로 1번 단계 이전에 이루어지는 상당한 양의 계획 작업입니다.
테스트는 애플리케이션의 요구사항이 구현 계획과 만나는 지점입니다. TDD는 앱이 무엇을 해야 하는지 알고 있다는 것에 강하게 의존하며, 그것을 어떻게 구현할지에 대한 아이디어가 어느 정도 있다고 가정합니다.
Rails로 처음 개발을 시작할 때는 우리가 아는 것이 많지 않습니다. 원하는 결과와 비슷한 것이 나올 때까지 실험적인 코드를 작성하며 시간을 보내죠. 경험이 쌓이면 이런 시행착오는 점점 줄어듭니다. TDD가 '무엇을 만들지 파악하기'가 아니라 '테스트 작성'부터 시작하는 이유도 여기에 있는 것 같습니다. 테스트를 작성하는 시점에는 이미 충분한 경험이 쌓여 있으니까요.
그래서 '테스트 작성' 단계 앞에 다음 단계들을 추가하는 것을 추천합니다:
- 브레인스토밍으로 요구사항을 도출하고, 근거를 검증한 뒤 걸러냅니다. 코딩은 최대한 피하세요.
- 그 요구사항을 충족할 코드를 계획하고 설계합니다.
- 미지의 질문에 답하기 위해 코드를 만져보되, 그 코드는 따로 치워둡니다.
제 조언은 다음과 같습니다:
- 문법보다 계획에 집중하세요
- 사용하는 도구를 최소화하세요 (저는 minitest와 fixtures가 큰 도움이 되었습니다)
- 연습, 또 연습, 계속 연습하세요.
마치며
무슨 일이든 그렇듯, TDD를 시작하는 데에는 연습과 스스로 교정하는 능력(혹은 곁에서 바로잡아 줄 사람)이 필요합니다. 몇 가지 반고정적인 단계를 성실하게 따르고, 지금 자신이 프로세스의 어디에 있는지 항상 의식한다면, TDD는 어느새 완전히 자연스러운 습관이 되어 있을 것입니다.