테스트 주도 개발(Test Driven Development)은 소프트웨어 개발 방법론 중의 하나로, 선 개발 후 테스트 방식이 아닌 선 테스트 후 개발 방식의 프로그래밍 방법을 말한다. 다시 말해 먼저 자동화된 테스트 코드를 작성한 후 테스트를 통과하기 위한 코드를 개발하는 개발 방식을 말한다.
TDD의 주요 목표는 코드의 품질 향상과 버그의 조기 발견이다. 테스트 케이스를 작성함으로써 코드 동작에 대한 명확한 기준을 갖게 되며, 코드 변경 시에도 테스트를 통해 기존 기능의 영향을 검증할 수 있다. 이를 통해 개발자는 신뢰성이 높은 코드를 작성하고, 버그를 사전에 발견하여 수정할 수 있다.
테스트 케이스 작성
테스트 케이스를 통과하는 코드 작성
작성한 코드 리팩토링
먼저 테스트 케이스와 테스트 코드를 작성한다. 테스트 코드가 개발을 주도하기 위해서는 반드시 실패를 포함하는 테스트 코드의 작성이 앞서야 한다. 다음으로는 테스트 케이스를 통과하는 코드를 작성한다. 작성된 코드는 개선될 수 있는 많은 여지를 포함한 코드이다. 마지막으로 리팩토링 단계에서 이를 개선한다.
TDD는 기본적으로 위 3단계의 반복으로 진행하며 점진적으로 개발이 진행된다. 필요한 단위 기능에 대한 테스트 코드를 먼저 작성한 후 테스트를 통과하도록 코드를 작성하는 것이다.
먼저 원하는 기능에 대한 테스트 코드를 작성한다. Factorial 기능을 구현한다고 가정하고 그에 대한 테스트 코드이다.
import unittest
class TDDTest(unittest.TestCase) :
def test_factorial(self) :
self.assertEqual(120, factorial(5))
if __name__ == '__main__' :
unittest.main()
실제 코드를 작성한다.
import unittest
def factorial(i):
if i > 1:
return i * factorial(i-1)
else:
return i
class TDDTest(unittest.TestCase):
def test_factorial(self):
self.assertEqual(120, factorial(5))
if __name__ == '__main__':
unittest.main()
팩토리얼 기능을 하는 함수를 구현한 후 실행을 시키면 아래와 같이 테스트 결과를 얻는다.
.
-------------------------------------------------------------------
Ran 1 test in 0.000s
OK
이런 식으로 테스트코드 작성, 실 코드 작성, 테스트를 반복해가며 개발하면 된다.
객체 지향적인 코드 개발: TDD는 코드의 재사용 보장을 명시하므로 TDD를 통한 소프트웨어 개발 시 기능별로 모듈화가 이루어진다. 이는 의존성과 종속성이 낮은 모듈로 조합된 소프트웨어 개발을 가능하게 하며, 필요에 따라 모듈을 추가하거나 제거해도 소프트웨어 전체 구조에 영향을 미치지 않게 된다.
설계 수정시간의 단축: 테스트코드를 먼저 작성하기 때문에 최초 설계안을 만족하게 하여 입출력 구조와 기능의 정의를 명확하게 하게 되므로 설계의 구조적 문제를 바로 찾아낼 수 있다.
유지보수(리팩토릭)의 용이성: 기본적으로 단위 테스트 기반의 테스트 코드를 작성하기 때문에 추후 문제가 발생하였을 때 각각의 모듈별로 테스트를 진행해보면 문제의 지점을 쉽게 찾을 수 있다.
테스트 문서의 대체 가능: 대부분의 개발 프로젝트에서 테스트를 진행하는 경우 단순 통합 테스트에 지나지 않는다. TDD를 하게 될 때 테스팅을 자동화시킴과 동시에 더욱 정확한 테스트 근거를 산출해 정의서를 작성할 수 있다.
사전준비 시간: TDD를 프로젝트에 도입하려면 사전에 필요한 지식을 습득하고 개발 환경을 구축해야 한다. TDD를 효과적으로 사용할 수 있는 수준으로 개발자를 교육하는 데 보통 1~6개월간의 시간이 필요하다.
생산성 저하: 프로젝트를 진행할 때 경험 때문에 어떤 예외상황이 발생할지 눈에 뻔히 보이는 경우가 종종 있다. 이러한 단발성 개발은 개발 기간이 타이트하게 잡히는 경우가 많은데, 이럴 때 TDD를 이용해 테스트 코드를 작성하고 그에 통과하기 위한 코드를 작성한다면 비효율적일 것이다.
TDD에 대해 처음 듣는 개발자라면 새로운 세계를 발견한 것과 같은 느낌을 받을 수 있을 것이다. 이것을 실무에 활용하기 위해 많은 고민을 할 수 있을 것이다. 하지만 TDD가 실제로 많이 쓰이는가? 유용한가? 이 질문에는 "글쎄올시다"라고 답할 수밖에 없다고 한다. TDD는 비용적인 측면에서 고민해야 한다는 것이다. 테스트 코드를 짜는 것 또한 엄연히 개발이기 때문에 그만큼 시간을 투자함에 따라 이익을 얻어야 하는데 테스트에만 너무 과도하게 몰입해버린다면 그야말로 시간 낭비가 될 것이다.
결론적으로 적당한 TDD는 개발에 있어 능률 상승을 가져올 수 있다. 하지만 과도한 테스트는 오히려 해롭다.