테스트 코드 필요성, 역할에 대한 글
1. 기존 동작에 대한 검증
위 그림은 애플리케이션이 발전됨에 따라 소스코드의 모습을 도식화한 모습이다.
v0.0.1에 새로운 기능이 추가되고 나면 v0.0.2가 되고, 또 그 v0.0.2기반의 소스코드에 신규 기능이 추가되면 v0.0.3이 된다.
신규 기능을 추가하면서 반드시 확인해야하는 것은 신규 기능 추가를 위해 수정한 코드의 영향 범위를 파악하는 것이다.
신규 기능은 잘 동작하지만, 기존의 동작에 새로운 문제가 생겼다면 새로운 소스코드의 배포는 불가능하기 때문이다.
필자는 테스트 코드는 기존 소스코드의 기능들이 잘 동작하는지에 대한 검증의 도구로써 엄청나게 큰 역할을 한다고 생각한다.
기존 동작에 대한 검증에 대한 중요성을 한번 더 설명해보면,
위 그림에서 v0.0.2에서 기존 동작을 제대로 검증하지 않고 v0.0.3에서 또 새로운 신규 기능을 추가하고 배포를 했다고 가정해보자.
배포 후에 갑자기 고객으로 부터 버그 리포트를 받고 디버깅등을 통해서 어떻게 어떻게 문제가 되는 부분을 찾았고, 그 부분이 위 그림에서 v0.0.1, v0.0.2, v0.0.3이 교집합으로 이뤄진 소스코드 부분이였다고 하자.
이 때 테스트코드로 검증을 제대로 해오지 않았더라면 발견된 버그가 v0.0.2 개발된 시점에 만들어진 버그인지, v0.0.3가 개발된 시점에 만들어진 버그인지에 대한 파악이 불가한 상황이 온다.
최악의 경우에 v0.0.1로 돌아가서 v0.0.2부터 다시 개발을 해야하는 상황이 올 수도 있다.
현실에서는 최악의 경우라 하더라도 비용(인력, 시간)때문에 v0.0.1로 돌아가서 다시 개발하기보다는 어떻게든 v0.0.3 상황에서 급한 불 끄기 식으로 분기를 추가한다던가, 좋지못한 방법으로 해결하는 경우가 많은 것 같다.
테스트 코드는 이러한 최악의 상황을 막아줄 수 있는 역할을 할 수 있다고 생각한다.
2. 수정을 자유롭게 한다
1. 기존 동작에 대한 검증
과 같은 맥락의 내용이다. 신규 기능 추가 뿐만아니라, 리팩토링과 같은 소스코드 변경 작업시에 테스트 코드로 기존 동작에 대한 검증을 효과적으로 빠르게 할 수 있기 때문에 코드 수정에 대한 자유성을 확보할 수 있다.
테스트 코드가 없으면 코드 수정하는 일 자체가 엄청나게 부담이 되는 일이 될 수 가 있다. 신규 기능 추가할때도 확신이 없고, 또 리팩토링해서 구조를 좋게 바꿔야하는데 변경 후 기존 동작이 잘 동작하는지에 대한 확인이 힘들면 정말 스트레스가 된다.
개발자가 하는 일이 기존 소스코드를 수정하고 추가하는 일이다. 내가 하는 일에 매번 부담감을 느끼면서 일하는 것은 매우 고통이므로 테스트 코드를 잘 작성하는 방법에 대해 치열하게 고민하자.
3. 소스코드 그 자체가 문서
남의 소스코드를 이해하고 거기에 새로운 기능을 추가한다거나, 수정하는 일은 그리 간단하지 않다. 새로 회사에 입사하거나, 오픈 소스 컨트리뷰션을 한다거나 할 때, 우리는 이러한 상황에 놓인다. 누군가가 작성해 놓은 README, UML과 같은 정적인 문서가 있다면 이해에 도움이 될 수 있으나, 결국에는 직접 소스코드를 살펴봐야 한다.
이 때 잘 작성된 테스트코드가 있다면, 코드를 이해하는데 매우 큰 도움이된다. README나 UML같은 문서의 경우 소스코드가 변경이 되면 업데이트가 되어야한다. 개인적인 경험에 의하면 관리가 쉽지 않고 그렇기에 동기화가 잘 안된다는 느낌을 받았다. 하지만 테스트코드는 코드가 수정됨에 따라 같이 수정 및 추가가 되기때문에 그럴 걱정이 없다.
하지만 테스트코드 역시 잘 작성되어있어야 문서로서의 역할을 잘 할 수 있다.
4. 좋은 소스코드로의 여정
위에서 테스트 코드의 중요성, 역할에 대한 내 생각을 정리해서 나열했다. 하지만 결국에는 테스트 코드를 잘 작성해야 유효한 이야기라고 생각한다. 아직 내공이 많이 부족하지만, 최근 테스트 코드에 대한 것들을 찾아보고 공부해보며 느낀 것은 결국 좋은 소스코드로 귀결된다고 생각한다. 테스트를 하기 쉬운 구조로 설계하기, 객체지향 설계, 이해하기 쉬운 코드 작성하기 등 전부 연관되어 있다고 생각한다.
좋은 코드를 추구하고, 노력하다보면 확신을 가지고 즐겁게 개발할 수 있다고 생각한다.