-
테스트가 실패하는 것을 보는 것이 과연 테스트 주도 개발의 주요한 진전 과정인가?카테고리 없음 2022. 9. 18. 23:14
테스트 주도 개발 스터디에 참여하면서 인상깊게 느꼈던 부분을 정리했다.
테스트가 실패하는 것을 보는 것이 과연 테스트 주도 개발의 주요한 진전 과정인가?
켄트 백의 저서 '테스트 주도 개발' 에 나오는 다중 통화(currency) 지원 객체 구현 예제의 시작은 이렇다. 예제에서는 어떠한 보고서에 명시되어 있는 금액을 단일한 통화에서 다중 통화를 명기할 수 있도록 프로그램을 개선하는 것을 목표로 삼고, 목표를 달성하기 위해 구체적으로 이행되어야 하는 케이스를 작성한다.
- 다른 두 통화를 더했을 때 환율에 맞게 주어진 금액을 결과로 얻는다.
- 어떤 금액을 특정 수(ex. 주식 수)에 곱한 금액을 결과로 얻는다.
두 케이스 중 좀 더 단순해 보이는 두 번째 케이스를 선택하고, 해당 케이스가 구현되기 위해 취해야 할 동작을 테스트 케이스에 우선 작성한다. 작성을 마치면 테스트를 실행시킨다. 처음에는 소스 코드조차 컴파일조차 되지 않았기 때문에, 테스트를 실행시키는 것조차 불가능하다.
일단은 컴파일 에러를 해결하기 위해 최소한의 형체만 있는 스텁 형태의 객체와 객체의 데이터, 동작을 정의한다. 그리고 테스트를 실행하면, 테스트가 실행되며 테스트가 실패하는 것을 확인할 수 있다. 테스트가 실패하는 것을 확인하면 가장 빠르게 테스트를 통과시킬 수 있는 조치를 취한 뒤, (상수를 반환시키는 등) 테스트를 다시 실행시킨다. 테스트가 성공하는 것을 확인하면, 테스트 코드와 소스코드 간의 중복을 제거한다.
책을 보기만 했을 때는 테스트 주도 개발의 과정을 그저 한번 더 재확인한 것이구나 싶었지만, 트레이너님의 설명을 들었을 때의 느낌은 그때와 많이 달랐다.
과정을 다시 돌아보면, 테스트가 실패하기 전까지는 문제를 일단 파악하고, 문제를 해결하기 위한 과정을 (아무것도 없는 상태에서) 테스트 케이스로 작성하기 시작해야 했다. 이때까지의 일은 없는 것을 만들어내기 위해 생각을 해내야 하는 부분이 있었다. 그러나 테스트가 일단 작동되기 시작하면, 설령 처음에 실행하는 테스트는 반드시 실패하겠지만 그 다음의 목표는 명확해진다. 테스트가 성공하도록 소스코드를 작성하고, 소스코드의 중복을 제거하는 일이다. (중복 제거의 난도는 문제의 수준에 따라 천차만별일 수는 있겠지만 일단 중복 제거를 해야 한다는 것을 알았다는 사실이 중요한 것 같다.)
즉, 테스트가 실패했느냐에 초점을 맞춘다기보다는 복잡하고 진행하기 어려워 보이는 작업을 직관적이고 구체적이게 변화시켜서 다음을 진행하기 위해 무엇을 해야 하는지 명확하게 만들었다는 것이 테스트 코드의 실패를 보는 중요한 포인트라고 생각해볼 수 있을 것 같다.