TDD가 중요하다는 말을 너무 많이들어서 이번 포스팅에서는 단위 테스트와 중요성 그리고 단위 테스트를 바탕으로 하는 TDD는 어떻게 프로그래밍하는 것인지 배워보도록하겠습니다.
[단위 테스트(Unit Test)를 작성해야 하는 이유]
테스트 코드를 작성하면 우리가 개발한 코드들에 대해 수시로 빠르게 검증을 받을 수있으며, 기능을 수정하거나 리팩토링을 할 때에도 검증을 받으므로 안정성을 확보 할 수 있다는 장점이 있습니다.
하지만 그것보다 큰 장점으로 개발 및 테스팅에 대한 시간과 비용을 절감할 수 있습니다.
우리는 개발이 끝난 뒤에 문제가 없는지 확인하기 위해 애플리케이션을 실행하고, 직접 수동 테스트를 진행해야합니다.
단위 테스트를 작성하지 않은 코드들은 테스트를 작성하지 않은 코드들 보다 버그가 잠재되어 있을 확률이 높은데, 문제는 직접 테스트 하는 비용이 너무 크다는 것입니다.
그 이유는 통합 테스트를 위해서는 캐시, 데이터베이스 등 외부 컴포넌트들과 연결 등 부가적인 시간이 필요하기 때문입니다.
테스트 코드를 작성하지 않았다면 여러 개의 버그가 잠재되어 있을 확률이 있고, 모든 버그들을 수정하고 테스트를 반복하는 비용은 기하급수적으로 늘어나게 됩니다.
그러므로 우리는 개발 및 테스팅에 대한 비용을 줄이기 위해 단위 테스트를 작성해야 합니다.
Fast : 테스트는 빠르게 동작하여 자주 돌릴 수 있어야 합니다.
Independent : 각각의 테스트는 독립적이며 서로 의존해서는 안됩니다.
Repeatable : 어느 환경에서도 반복 가능해야 합니다.
Self-Validating : 테스트는 성공 또는 실패로 boolean 값으로 결과를 내어 자체적으로 검증되어야 합니다.
Timely : 테스트는 적시에 즉 , 테스트하려는 실제 코드를 구현하기 직전에 구현해야 합니다.
정리하자면, 위의 내용을 압축하여 정리하면 좋은 테스트는 빠르게 독립적으로 어느 환경에서든 실행이 가능하고 검증할 수 있어야 한다는 것입니다.
그리고 위의 5가지 규칙 중에서 Timely에 주목해야할 필요가 있습니다.
테스트 코드를 작성하는 시점에 대한 이야기인데, CleanCode에서는 테스트 코드를 실제 코드를 구현하기 직전에 구현하라고 설명되어 있습니다.
[테스트 코드를 먼저 작성해야 하는 이유]
테스트 코드를 먼저 작성하는 개발 방법론은 테스트 주도 개발(Test-Driven Development,TDD)로 많이 불립니다.
우리는 프로덕션 코드 보다 테스트를 먼저 작성해야 하는데, 그 이유는 다음과 같다.
테스트 주도 개발(TDD, Test-Driven Development)의 궁극적인 목표는 작동하는 깔끔한 코드를 작성하는 것입니다.
이 리팩토링 과정을 거치면서 중복된 코드들은 제거되고,복잡한 코드들은 깔끔하게 정리하게 됩니다.
또한 테스트를 처음 작성할 때에는 귀찮고 개발을 느리게 한다는 느낌을 받을 수 있지만, 장기적으로 보면 반드시 개발 비용을 아껴줄 것입니다.
마지막으로는 현실적인 이야기인데, 프로덕션 코드를 먼저 작성하였다면 이후에 테스트 코드를 작성하는 과정은 너무 귀찮습니다.
왜냐하면 테스트 코드는 성공 케이스 뿐만 아니라 실패 케이스까지 작성해야 해야 하기 때문에 작성해야 할 테스트의 개수는 해당 함수에서 발생가능한 모든 경우들인 N이며, 이미 개발이 완료되었기에 심리적 요인 때문에 테스트를 작성하는 것이 꺼려지기 때문입니다.
그리고 그 중에서도 실패 테스트부터 작성해야합니다. 즉, 순차적으로 실패하는 테스트를 먼저 작성하고, 오직 테스트가 실패할 경우에만 새로운 코드를 작성해야 합니다. 그리고 중복된 코드가 있으면 제거 하는 것입니다.
TDD 개발 방법론의 프로그래밍 순서를 매우 단순하다.
위의 과정을 따라 개발을 진행하면 자연스럽게 프로덕션 코드보다 테스트 코드를 먼저 작성하게 될 것이다.
왜냐하면, Repository 계층은 다른 계층에 대한 의존성이 거의 없기 때문에 먼저 작성하기 편리하기 때문입니다. Service 계층은 Repository에 의존하기 때문에 Repository가 있으면 편리하며 흐름이 끊기지 않고, Controller 계층은 마찬가지로 Service계층에 의존하기 때문입니다.