1. 인수테스트의 의미
- 명세나 계약의 요구사항이 충족되는지를 확인하는 테스트
- 작업을 종료시켜도 되는지 검증하는 테스트
2. 인수테스트 주도 개발의 의미와 목적
- 인수테스트 주도 개발은 기획, 개발, 테스트 등 다양한 관점을 가진 팀원들과 협업을 위한 애자일 방법론 중 하나이다
- 다양한 관점(기획, 개발, 테스트 등)을 지닌 팀원이 함께 사전 기획 단계에서 유저스토리와 인수 기준을 도출하면, 개발단계에서 자동화된 인수테스트를 먼저 작성하고 소프트웨어 개발을 이어나간다
- 프로젝트에 참여하는 인원들이 다양한 관점(기획, 개발, 테스트 등)을 지닌 만큼, 커뮤니케이션이 부족하다면 서로 다른 결과물을 상상하면서 작업을 진행할 수 있다
- 이 경우 결과물이 나오는 시점에야 서로의 생각이 다름을 인지하게 된다
- 인수테스트 주도 개발은 이러한 문제를 사전에 방지하고, 프로젝트 참여 인원 간에 이해를 공유하면서 안정적인 소프트웨어를 제공하는 것을 목적으로 한다
3. 테스트 주도 개발 vs 인수테스트 주도 개발
- 테스트 주도 개발은 비교적 작은 요구사항을 검증하는 테스트 코드를 먼저 만들고, 그것을 구현하는 코드를 작성한 뒤 리팩토링을 수행한다
- 실패하는 테스트 작성 (RED)
- 테스트를 통과하는 최소한의 구현 (GREEN)
- 리팩토링 (REFACTOR)
- 인수테스트 주도 개발은 시나리오 레벨을 구현 대상으로 정하고 인수테스트를 먼저 작성한 후, 그것을 구현하는 코드를 작성해간다,
- 실패하는 인수테스트 작성
- 테스트를 통과하기 위해 기능 개발 (TDD)
- 인수테스트 수행 미치 성공
4. 인수테스트 작성
- 서버 개발에서 UI 기반의 인수테스트는 작성 및 수행이 어려우므로, 대개 API 레벨로 인수테스트를 진행한다
- 인수테스트는 일반적으로 Given(setup) - When(trigger) - Then(verification)의 구조로 이뤄짐
- Given(setup): 시스템의 지정된 상태 (테스트를 위한 환경 구성)
- When(trigger): 동작이나 이벤트가 발생 (테스트 동작 수행)
- Then(verification): 변경된 시스템의 상태나 발생한 출력을 확인 (결과 확인)
Given 대출되지 않은 도서가 있고
And 시스템에 등록된 사용자가 있을 때
When 사용자가 책을 대출하면
Then 책은 대출된 것으로 표시된다
- 보다 구체적인 예시는 아래 링크를 참고하자
5. 실무에 적용해본 후기
1) 좋은 점
- 유저 시나리오를 기반으로 테스트하기 떄문에 전체적인 컴포넌트를 연결하는 통합 테스트가 가능하며, 단위테스트만 작성했을 때보다 코드의 안정성이 높아진다
- 한 번 구현해놓으면 유사한 기능은 확장이 용이하다
- 인수테스트를 먼저 작성해두면 단위테스트 작성도 용이해진다
- 일반적인 TDD는 작은 기능 단위로 수행되므로, 진행하다보면 개발 목표를 놓칠 때가 있음
- 인수테스트를 먼저 작성하고 TDD를 수행하면 방향성 잡기가 보다 수월하다
2) 아쉽거나 어려운 점
- 처음에 구현해놓는 게 어려움
- 회사 환경에 따라 프로젝트에 참여하는 다양한 직군의 인원들이 함께 인수조건을 도출하는 게 어려울 수 있음
- MSA 환경에서 블랙박스 테스트를 구성하기 어려움
- 타 도메인에 대한 C, U, D가 불가능한 상황이 많음
- 외부 의존성은 모두 다 Mock 객체로 대체하면? → 구현이 노출되고 테스트 유지보수가 어려워짐
'테스트코드' 카테고리의 다른 글
직접 Stub 객체 만들어서 유연한 테스트 코드 작성하기 (1) | 2024.03.27 |
---|