TDD란 Test-Driven-Development의 약자로, 테스트 주도 개발 방법론을 의미한다.
일반적인 개발 방식은 설계 - 개발 - 테스트
의 단계를 반복하는것에 비해 TDD는 위 그림처럼 테스트를 먼저 작성하고 테스트를 성공시키는 코드를 작성해 나간다.
예를 들어 두 정수를 입력받아 두 수의 곱을 반환하는 함수를 작성한다고 하자. 우선 테스트를 작성하기 전에 구현 목표를 하나 정한다. (1) 여기서는 2와 3을 입력했을 때 6을 반환하는 것을 목표로 잡는다고하면, (2) 함수를 실행시켰을 때 값이 6이 나오는지 검사하는 테스트를 만든다. 그 후 (3) 테스트를 실행할 수 있을 정도의 틀만 만들어 놓고 테스트를 실패시킨다. (4) 앞서 작성한 테스트를 통과하는 실제 코드를 작성한다. 이때 테스트가 통과되었다면 다른 테스트를 작성한 후 이를 통과시키는 실제 코드를 작성해 나간다.
이렇게 테스트를 통과하도록 코드를 작성하면서 테스트 -> 테스트 실패 시 버그 수정 -> 테스트 -> 성공 -> 리팩토링
과정을 반복하는 것이다.
테스트 작성 후 이를 통과시키기 위한 최소한의 코드를 작성하기 때문에 불필요한 코드를 배제시킬 수 있다. 또한 반복적인 테스트로 버그 발견 및 수정이 쉬워지면서 코드가 깔끔해진다.
단위 테스트 관련 글에서도 언급하였듯이, 테스트는 코드를 이해하는데도 도움을 준다. 테스트를 만들기 전에 구현하고자 하는 기능의 의도에 대해서 먼저 생각하게 되므로, 테스트를 보면 구현된 기능의 목표가 무엇인지 파악할 수 있다. 따라서 다른 사람이 작성한 코드를 이해하고 유지보수 해야할 때 유용하며 이는 곧 원활한 협업의 도구가 된다.
위와 같은 이점에도 불구하고 TDD를 꺼리게 되는 점이 있는데, 이는 바로 개발속도가 저하된다는 것이다. 실패하는 코드를 작성하기 전까지는 실제 코드를 작성하지 않기 때문에 일반적인 방식보다 개발 속도가 지연된다는 느낌을 받을 수 있다. 하지만 전체 개발 과정 중 버그 수정에 가장 많은 시간이 소요된다는 점을 생각해봤을 때, 잘 작성된 테스트와 이것이 이끄는 간결한 코드 및 버그 색출은 오히려 개발 효율성을 높여줄 수 있다.
이렇게 TDD의 개념에 대해서 정리를 해보았다. 아무것도 없는 무의 상태에서 테스트를 먼저 작성한다는 것이 막연하게 느껴질 수 있지만 개발 과정에서 테스트의 중요성을 배제할 수 없으므로, 어느 정도 틀이 잡힌 작업 환경에서는 TDD 방식을 적용하는 것도 좋을 것 같다.
참고
[TDD] 단위 테스트와 TDD(테스트 주도 개발) 프로그래밍 방법 소개
[Agile] TDD(테스트 주도 개발)란
TDD 테스트 주도 개발 : 천천히 시작하기
Dev: TDD, 테스트 주도 개발의 기초와 예시