보통 회사에서 테스트를 3가지 정도의 레벨로 구분하여 다루곤 합니다. 첫 번째로 개발자 테스트, 산출물도 작성하게 되는 단위 테스트 그리고 시스템의 최상위 수준(UI)부터 최하위 수준(데이터)까지를 다루는 통합테스트가 있습니다. 그런데 막상 테스트를 하자면 다 그게 그겁니다. 구현된 시스템 자체도 정확히 레벨을 구별할 수 없는데 테스트라고 구분할 수 있을리가 없기 때문입니다.
예전에 학교 홈페이지 개발실에서 일할 때는 주로 PHP나 ASP로 프로그래밍을 했습니다. 작은 단위의 시스템에 적용할 수 있는 가장 가벼운 개발 방법인 model-1으로 말이죠. 하나의 php 함수에서 파라미터 처리와 데이터 조작, 출력화면 구성까지 모든 걸 다 합니다. php 프로그램의 가장 작은 단위를 함수로 생각해 본다면 기능 단위와 구현 단위가 함수 하나로 동일한 경우이죠. 단위 테스트와 시스템 테스트를 거의 동일하게 화면에서 버튼을 눌러보고 반응을 살펴보는 방식으로 하게 됩니다. 구현의 최상위 수준(UI)부터 최하위 수준(데이터)까지 버무려져 있다고 볼 수 있겠습니다.
출근길에 지금 만들고 있는 애플리케이션에 어떻게 자동화 테스트를 할까 고민하다가 저런 생각이 들었습니다. CI 책에서의 가르침에 따르자면 단위 테스트는 (자바를 기준으로) 최소한의 의존성을 가진 클래스 단위로, 단위 테스트의 상위 레벨인 컴포넌트 테스트는 아직 어떤건지 감이 오지 않습니다. 시스템 테스트는 최상위~최하위, 외부 의존성까지 포함하여 테스트하는 것이라고 합니다.
결국 구현하려는 시스템을 어떻게 나누고 구성하는지에 따라서 테스트할 수 있는 방법도 결정된다고 생각해 볼 수 있겠습니다. 구현 단위를 명확히 구분할 수 있고 시스템의 계층화가 잘 되어 있다면 테스트를 구성할 수 있는 방법도 역시 다양하고 보다 쉽게 자동화시킬 수 있을 것입니다.
어떻게 시스템을 구성해야 할까? 는 별도의 문제인 것 같습니다. 그것에 대한 용어도 많고 조언도 많고 방법도 많습니다. 나중에 직접 체험해 보며 따로 다뤄보겠습니다.