
오늘은 테스트 코드에 대해서 적어보려고 한다.
사실 나는 처음에 테스트 코드를 왜 작성해야하는지 잘 이해가 되지 않았었다.
하지만 여러 기업들에서 테스트 코드를 작성해본 사람들을 찾는 것을 목격하게 되었고, 기업들에서 원하는 이유가 있을 것이라고 생각이 들어 왜 중요한지에 대해서 찾아보기 시작하였다.
그러면서 내가 가지고 있던 생각들과 사용하던 방식이 잘못 되었다는 것을 깨닫게 되었다.
이제는 내가 테스트 코드를 사용하면서 느꼈던 점과 찾아본 내용들을 공유 해보려고 한다 !!

테스트 코드란 개발자가 작성한 실제 코드의 기능과 동작을 체계적으로 검증하기 위해 별도로 작성하는 코드를 말한다.
개발자는 특정 기능을 구현한 후 해당 기능이 의도한 대로 정상적으로 동작하는지 확인해야 한다. 이때 수동으로 일일이 테스트하는 것은 비효율적이며, 사람의 실수로 인해 누락되는 경우가 많다. 이러한 문제를 해결하기 위해 테스트 코드를 작성하는 것이다.

개발자는 요구사항을 분석하여 설계한 후 구현하는 일을 하게 된다.
하지만 요구사항을 확실하게 구현했는지를 아는 것은 쉬운 일이 아니다.
그렇기에 테스트 코드를 작성하며 요구사항들을 다시 한 번 확인하고 정리하며 완성도를 높일 수 있다.

테스트 코드를 사용하지 않는 경우에는 버그와 이슈들을 디버깅할 때 많은 시간을 투자하였다.
실제로 문제를 해결하는 것은 얼마 걸리지 않은 경우가 더욱 많았었다.
하지만 테스트 코드를 적용하면서 버그들을 줄이게 되었고, 여러 케이스들에 대해서 빠르게 접근이 가능해지며 디버깅에 투자되는 시간들이 눈에 띄게 줄어들게 되었다.

테스트 코드가 없는 프로젝트에서는 기능 추가/수정 작업에 큰 어려움이 있다.
기존 기능을 수정하게 될 시에는 초기 요구사항과 예외 케이스를 명확히 파악하는게 어렵다.
또한 기능은 여러 요소의 상호작용으로 이루어져 있어, 하나의 기능 수정 시 의도치 않게 다른 기능에 영향을 미치고 회귀 버그가 발생할 수 있다.
여러가지 이슈들을 해결하기 위해서는 테스트 코드가 중요한 역할을 한다.
회귀 버그를 완전히 없애는 건 불가능하지만 회귀 테스트를 통해 대처하고 관리할 수 있다.
그리고 기존에 구현된 기능들이 새로운 변경사항에 의해 영향을 받지 않았는지를 검증 할 수 있기에 코드 변경에 대한 두려움을 없앨 수가 있다.
테스트 코드는 문서로서도 중요한 역할을 한다.
다른 개발자가 작업을 하게 되었을 때, 막연하게 코드만 보는 것보다 테스트 코드를 보면서 어떤 프로세스로 구성되어 있는지를 이해하게 된다면 더욱 수월하게 업무를 진행할 수 있다.
또한, 기존 문서의 가장 큰 문제점은 코드는 수정되었지만 문서는 수정되지 않아 방치되는 경우가 많았습니다. 이렇게 되면 문서 자료의 신뢰성이 떨어지게 된다.
하지만 테스트 코드를 작성할 때는 먼저 명세를 작성하고, 코드의 실제 동작을 기술한다. 이를 통해 해당 코드가 어떤 역할을 가지고 있는지 이해할 수 있게한다.

결과적으로 테스트 코드는 다른 개발자의 코드 이해를 돕는 문서의 역할을 할 수 있다.
테스트 코드를 작성하는 과정에서 개발자는 자연스럽게 더 좋은 코드를 작성하게 된다.
우선 테스트 코드를 작성하기 위해서는 코드의 결합도와 의존성이 낮아야한다.
높은 결합도와 의존성을 가진 코드는 테스트하기 어렵기 때문이다.
따라서 개발자는 테스트 가능한 코드를 작성하기 위해 노력하게 되고, 이는 자연스럽게 낮은 결합도와 의존성을 지향하는 좋은 코드로 이어지게 된다.

또한 테스트 코드가 있다면 리팩토링을 진행할 때 부담이 줄어든다.
기존 기능이 정상적으로 동작하는지 테스트 케이스로 검증을 할 수 있기 때문에 안심하고 코드를 리팩토링 할 수 있따. 이를 통해 코드의 질을 지속적으로 개선하며 좋은 코드를 작성하게 될 수 있다.