1. 핵심 접근법
가. 인수테스트가 필요한 이유는?
•
외부환경 요인까지 테스트 범위에 포함하여 시스템 전체의 완성도를 높이기 위함
◦
외부환경 요인에는 개발 대상 시스템과 외부 시스템과의 상호작용 또는 배포 자동화 시스템 적용 등이 포함됨
◦
시스템 내부 개발을 완료한 상태에서 외부환경 요인 이슈로 인해 시스템 자체가 폐기된 사례가 있음
나. 인수테스트, 통합테스트, 단위테스트에 대한 구분은?
•
인수 테스트(End to End): 시스템 전 구간에 걸쳐 시스템의 정상동작 여부 테스트
◦
시스템의 정상동작 여부에는 빌드, 배포를 포함한 모든 개발 환경의 정상동작 여부도 포함함
◦
내부의 구현이 드러나지 않아야 함
•
통합 테스트(Integration): 제어할 수 없는 부분의 정상동작 여부 테스트
◦
외부 API, DB 접근 기술, Web Browser 등에 대한 테스트가 해당됨
•
단위 테스트: 객체의 정상동작 여부 테스트
◦
객체지향 패러다임의 단위테스트의 단위는 객체임
다. 단위테스트 작성에 어려움이 생길 경우 권장되는 접근법은?
•
단위 테스트 대상 객체의 역할에 대해 다시 한 번 생각해볼 것
•
분해, 포장의 방법으로 리팩토링의 가능여부를 판단해볼 것
◦
분해: 하나의 객체 내 응집력이 있는 기능을 찾아서 별개의 역할로 갖는 객체로 나누는 것
◦
포장: 함께 행동하는 복수의 객체가 있다면 이를 하나의 객체로 추상화해보는 것
라. 객체를 활용하여 설계를 확장하는 경우 권장되는 접근법은?
•
값과 객체를 구분할 것
◦
값: 논리적 동치성에 따라 동일여부를 판단할 수 있는 객체의 인스턴스
→ 불변성과 객체에 대한 식별자가 없는 것이 특징임
◦
객체: 시간의 흐름에 따라 변경가능한 상태 및 행위를 가지고 있는 개체
•
객체 간 협력 또는 객체 간 주고 받는 메시지에 집중할 것
◦
클래스의 구조 보다는 위에서 언급한 관계에 더 집중해야 선언적인 설계로 이어질 수 있음
→ 관계는 how가 아닌 what을 일반적으로 나타내기 때문
◦
추상 객체 또는 인터페이스를 토대로 객체 간의 협력에 대해 먼저 설계해 볼 것
◦
객체의 책임이란 행위, 객체의 역할은 책임의 집합
2. 테스트 주도 개발 과정
가. 현실적인 TDD 개발 흐름은 어떻게 되는가?
•
TDD의 기본적인 사이클을 돌기 전에 아래와 같은 추가적인 작업을 선행할 것을 권장함
image from chapter 4, Growing object oriented software, guided by tests
•
문제 이해: 요구사항에 존재하는 주요 도메인 로직에 대한 파악 필요
◦
주요 도메인 객체의 상태 변화 등
•
대략적인 설계: 문제 이해를 토대로 대략적인 설계 필요
◦
도메인 로직구현에 필요한 알고리즘 등은 제외
◦
주요 도메인 객체 간의 협력에 대한 간략한 설계 필요
•
자동화: 개발 대상 시스템이 동작할 자동화 인프라 시스템 구축
◦
내부 시스템 구현 후 인프라 시스템과 연계하는데 실패하여 프로젝트가 폐기되는 사례가 발생함
◦
외부 시스템과 상호작용에 필요한 부분을 선 반영
◦
동작하는 골격(최소한의 내부 시스템, 외부 시스템, 인프라 시스템)을 완성하여 정상동작여부 확인
•
테스트-구현 순환: 단위 테스트에 대한 순환에 인수 테스트를 추가하여 개별 기능의 개발 진행상황의 척도로 삼을 수 있음
나. 기능 개발의 순서는 어떻게 되는가?
•
입력에서 출력 순으로 개발해야 한다. 외부로부터 전달 받은 입력 값을 처리하는 기능부터 개발을 시작해야 불필요한 개발요소를 최소화할 수 있다. Spring Web MVC Framework에 적용하면 Controller부터 개발하고 Model은 가장 마지막에 개발하는 것을 의미한다.
다. 객체지향적 설계를 충족하는 방향으로 단위 테스트를 작성하는 방법은?
•
테스트의 대상은 how가 아닌 what에 집중되어야 한다. 다시 말해, 선언적 방식으로 단위 테스트를 작성함으로써 객체의 추상화를 높은 수준으로 끌어내야 한다.
•
단위 테스트의 범위를 짧고 명확하게 나눠야 한다. 테스트의 명시성을 높힘으로써 객체의 역할을 이해 가능한 상태로 유지해야 한다
•
필요한 의존성을 나열한다. 특정 객체에 대한 단위테스트를 작성하기 위한 의존성을 명시하고 관리해야 한다
Reference
•
스티브 프리먼, 냇 프라이스, 테스트 주도 개발로 배우는 객체 지향 설계와 실천
•
Steve Freeman, Nat Pryce, Growing object oriented software, guided by tests