Search
📗

Growing Object Oriented Software, Guided by Tests - Steve Freeman, Nat Pryce

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