PHPUnitManual:12
- 제12장 테스트 주도 개발 (Test-Driven Development)
Test-First Programming, Extreme Programming[1], 그리고 Test-Driven Development[2] 등의 소프트웨어 개발 방법론에 있어서, 단위 테스트는 매우 중요하다. 또, 구조상 이 수법을 적용할 수 없는 언어는 규약에 의한 설계 (Design-by-Contract[3]) 라는 방법도 인정됩니다.
프로그램을 완성한 뒤에 PHPUnit 테스트를 작성할 수도 있습니다. 하지만, 테스트를 작성하는 것을 빠른 단계에 시작할 수록 테스트의 가치가 높아집니다. 코드가 "완성" 된 몇개월 후에 테스트를 작성하기 시작하는 것보다는, 수일 뒤, 수시간 뒤, 더 노력하면 수분 뒤에 시작할 수도 있을 것입니다. 여기서 한 걸음 더 나아가서, 코드를 작성하기 전에 테스트를 작성해 보는 것은 어떻습니까?
Extreme Programming 과 Test-Driven Development 에서의 Test-First Programming 은 이런 생각에서 시작하여 발전된 것입니다. 현재의 컴퓨터의 능력이라면, 하루에 몇 천 개의 테스트를 몇 천 번 반복할 수 있습니다. 그리고 테스트의 결과를 활용하여 프로그램을 조금씩, 착실하게 작성할 수 있게 됩니다. 테스트의 자동화를 통해, 새롭게 추가된 테스트 뿐 아니라 지금까지의 모든 테스트가 실행되는 것이 보증됩니다. 테스트는 등산용 쇄기와도 같아서, 나중에 어떤 일이 일어나더라도 이 단계까지는 확실히 완성되어 있음을 보증해 줍니다.
테스트를 처음 작성하기 시작했을 때는, 실행할 수 없을 것입니다. 아직 구현하지 않은 오브젝트와 메소드를 사용하고 있기 때문입니다. 익숙해지기 전에는 이 상황이 받아들이기 힘들지도 모릅니다. 하지만 곧 익숙해질 것입니다. Test-First Programming 이란, 오브젝트 지향 개발 (object-oriented programming) 의 원칙인 "구현을 프로그래밍하는 것이 아닌, 인터페이스를 프로그래밍하라" 를 지키기 위한 실천적인 기법으로 생각할 수 있습니다. 테스트를 작성하는 동안, 테스트 대상 오브젝트의 인터페이스 (이 오브젝트는 외부에서 어떻게 보이는가) 를 생각하게 될 것입니다. 테스트가 실제로 동작하게 된 뒤에 구현을 시작합니다. 완성된 테스트에 의해서 인터페이스가 확정됩니다.
- The point of Test-Driven Development[4] is to drive out the functionality the software actually needs, rather than what the programmer thinks it probably ought to have. The way it does this seems at first counterintuitive, if not downright silly, but it not only makes sense, it also quickly becomes a natural and elegant way to develop software.
- Test-Driven Development[5] 의 요점은, 프로그래머가 바람직하다고 생각하는 기능이 아니라, 해당 소프트웨어가 정말로 필요로 하는 기능을 만드는 것이다. 처음에는 직감과 맞지 않는 무가치한 일이라고 생각할 지도 모른다. 하지만 이 방식은 합리적일 뿐 아니라, 가까운 장래에는 자연스럽고 우아한 소프트웨어 개발 방법으로 자리잡을 것이다.
- --Dan North
지금부터 소개할 Test-Driven Development 의 예는, 어쩔 수 없이 간결한 것들입니다. 자세한 내용은 Test-Driven Development (Beck2002) by Kent Beck 이나 Dave Astels' A Practical Guide to Test-Driven Development (Astels2003) 등의 서적을 참조해 주세요.