소프트웨어 개발 과정에서는 많은 변화가 있습니다. 특히 프로젝트 초반에는 기획과 설계, 데이터 구조가 변경되는 일이 잦기 때문에 유연한 코드를 작성하는 것이 중요합니다. 또한 좋은 코드를 작성하는 것에 관해서 이야기할 때, 테스트 코드는 개발자들 사이에서 빠지지 않고 거론되며 거의 필수적이라고 여겨지는 것 같습니다. 하지만 아쉽게도 현시점의 제가 일하는 팀에서는 프로젝트 수준에서의 테스트 코드를 작성하지는 않고 있습니다.
최근에 새로운 테스트 코드 없는 프로젝트를 시작하게 되었는데, 그 과정에서 초기 개발 이후 기능과 데이터 구조를 수정하는 일을 진행하면서 테스트 코드가 왜 필요한지 직접 느낀 것들을 이야기해보겠습니다.
처음 기능을 개발할 때에는 코드가 동작하는지 직접 확인하는 것이 크게 피로하지 않습니다. 그런데 수정사항이 생겨서 코드를 수정하고 나면 같은 기능을 테스트하는 것이 매우 귀찮은 일이 됩니다. 특히 이것이 단순히 버튼 하나, 인풋 하나가 아니라 연계된 기능이 많다면 더 복잡할 것입니다. 또한, 코드를 작성하고 몇 주, 몇 달이 지나면 코드에 대한 기억이 거의 사라지고 없기 때문에 어떤 부분을 테스트해야 할지도 어려워집니다.
특정 기능을 구현한 코드에 대한 명세 문서가 있고, 그 문서가 잘 최신화되어 관리된다면 조금 수월하겠지만 그것 또한 매우 피로한 일입니다. 테스트 코드는 기능 코드의 가장 가까운 곳에서 가장 비슷한 언어로 쓰인 코드의 명세입니다. 테스트 코드만 잘 작성했다면 작성한 함수, 클래스, 인터페이스 등의 코드가 어떤 역할과 기능을 하는지 파악하기는 아주 쉬워집니다.
앞에서 말한 것처럼 테스트 코드의 역할 중 하나는 기능 코드 맥락을 표현해주는 것입니다. 테스트 코드를 보면 변경될 기획에 대해서 어떤 코드를 고쳐야 할 지 쉽게 알 수 있습니다. 특히 이 부분은 테스트 케이스에 대한 리포트 시각화 도구가 있다면 더욱더 쉬울 것입니다. 테스트 케이스를 통해 코드가 어떤 동작을 하는지, 기능을 고치고 싶으면 어떤 부분을 고치면 될 지를 한눈에 볼 수 있기 때문입니다.
기능 코드는 여러 코드와 복합적으로 동작할 때가 많습니다. 그래서 의존성을 잘 다루는 것도 개발자가 해야 할 일 중 하나일 것입니다. 테스트 코드를 작성하면 기능 코드의 의존성을 쉽게 파악하고 분리할 수 있습니다. 테스트 케이스 환경에서는 같은 입력에 대해서는 같은 결과가 나와야 의미 있는 테스트입니다. 그렇게 하려면 기능 코드의 의존성을 제거하고 외부에서 주입하는 형태로 코드를 작성할 수 밖에 없습니다. 테스트 케이스 환경에서 그러한 의존성을 주입하여서 기능 코드의 의존성을 제어하는 것입니다.
신뢰할만한 테스트 코드를 작성하려면 기능 코드의 의존성을 파악하고, 테스트 환경에서 의존성을 주입하거나 적어도 제어할 수 있는 방식으로 기능 코드를 작성하게 될 것입니다.
개발자들이 가장 싫어하는 것 중 하나가 바로 중복이겠죠? 위에서 언급한 것들을 코드가 변경될 때마다, 또는 시간이 지나서 코드를 다시 살펴볼 때마다 생각하려면 너무 피곤한 일이 되어버립니다. 그래서 테스트 코드를 작성하고 테스트 케이스를 관리하여 이미 작성된 코드가 여전히 잘 동작하는지를 언제든지 확인할 수 있습니다. 테스트 케이스는 마치 문서의 목차나 제품의 설명서처럼 코드가 여전히 살아있는지 알 수 있는 도구입니다.
개발자의 일 중 하나가 바로 자동화와 추상화 - 전등을 켜기 위해 전기선을 연결하는 일을 스위치로 대신하는 것, 시간마다 울려야 할 종을 자동으로 제시간에 울리게 하는 것 등 - 입니다. 저는 개발이 즐거운 이유가 이것들 때문이라고 생각하는데요, 제가 작성한 코드를 더욱더 즐겁게 하려면 테스트 코드가 필수이지 않을까요?
여러 개발 문화 중에서 테스트 코드, TDD에 대한 필요성이 뜨겁게 대두되고 있는 요즘이지만 아직 시도하지 못하고 있었는데요. 이번 프로젝트를 진행하면서 느낀 것은 불필요한 반복적인 일을 하지 않고 즐겁게 코드를 작성하고 싶다는 것입니다. 테스트 코드를 작성하는 트렌디하고 능력 있는 개발자가 되기 위해서라는 멋진 생각은 아니지만 단순히 남들 다 하기 때문에 하는게 아니라 정말 개발자와 팀을 위한 코드를 작성하기 위해 테스트 코드가 필요하다는 것을 절실히 느껴버렸습니다.