currenjin
wiki

ATDD(Acceptance Test Driven Development, 인수 테스트 주도 개발)

편집하기의견 남기기

ATDD(Acceptance Test Driven Development, 인수 테스트 주도 개발)

인수 테스트 주도 개발(Acceptance Test Driven Development, ATDD)은 비즈니스 고객, 테스터, 개발자 간의 커뮤니케이션을 기반으로 하는 개발 방법론이다.

What is Acceptance?

  • 인수받다의 그 인수다.
  • 소프트웨어개발을 의뢰하고 결과물을 인수받는다는 것이다.

Acceptance Criteria

  • 인수하기 위한 조건이다.

Example

강사는 강의료 환불을 해주기 위해 수강생의 수강을 취소할 수 있다.

  • given: 수강생이 수강 신청을 하였다, 과정의 남은 기간이 절반 이상이다.
  • when: 강사는 특정 수강생의 수강 상태를 취소 요청을 한다.
  • then: 특정 수강생의 수강 상태가 취소 된다, 특정 수강생의 결제 내역이 환불 된다.

조건 작성 순서

  1. 검증하고자 하는 When 구문을 먼저 작성
  2. 기대 결과를 의미하는 Then 구문을 작성
  3. When 과 Then 에 필요한 정보를 Given 에서 작성

Acceptance Test

  • 인수 조건을 위한 테스트다.
  • 사용자 관점, 즉 시스템의 외부 관점에서 이루어진다. 특정 입력이 주어지면 시스템의 올바른 출력을 지정하는 것과 같이 외부에서 볼 수 있는 효과를 리스트업한다.
  • 예를 들면, 주문이 지불에서 배송됨으로 바뀌는 것과 같이 상태가 어떻게 변경되는지 확인할 수 있다.

Tools

테스트 서버(환경)

  • @SpringBootTest(webEnvironment, RANDOM_PORT 설정) image

테스트 객체(클라이언트)

  • MockMVC: webEnvironment.MOCK 과 함께 사용가능, mocking 된 web environment 환경에서 테스트
  • WebTestClient: webEnvironment.RANDOM_PORT 또는 DEFINED_PORT 함께 사용, Tomcat 대신 Netty 기본 사용
  • RestAssured: 실제 web environment(apache tomcat)을 사용해 테스트

조합

  1. @SpringBootTest / Mock + MockMVC
  2. @SpringBootTest / RANDOM_PORT + RestAssured

Example

image

테스트 데이터 초기화

repository 활용하여 데이터 초기화

  • 손쉽게 데이터 초기화 가능
  • 구현이 달라지면 테스트 영향을 받음
  • 유효성 검사 로직 없음
  • 깨지기 쉬운 테스트가 될 가능성이 높음

요청을 통한 데이터 초기화

  • 테스트 객체를 이용하여 직접 호출 후 초기화

image

테스트가 다른 테스트에 영향을 주는 상황

@DirtiesContext

  • 스프링 테스트 환경에서 캐싱된 Context 를 사용하지 않도록 설정
  • 매번 Context 를 새로 구성하다 보니 시간이 많이 걸림

image

일괄적인 데이터 초기화

  • EntityManager 를 활영하여 테이블 이름 조회
  • 각 테이블 Truncate 수행
  • ID auto increment 값 초기화

image

중복 처리 & 가독성 개선 필요

  • 가독성이 좋지 않으면 방치될 가능성 높음
  • 반복되는 코드는 메소드로 분리
  • 다른 인수 테스트에서 재사용
  • 한글 메서드 네이밍으로 의도를 드러내기

외부 API 호출

  • 외부 서비스에 의존하는 경우 상당히 중요한 기능일 경우 허용
  • Fake 서비스에 요청하는 경우 메인 서비스가 죽었을 때 파악하기 힘듦

Example

Github API

  • 테스트 계정으로 실제 요청
  • 대기 시간이 필요한 경우 delay 처리

결제 API 연동

  • 실제가 아닌 Fake 서비스에 요청하도록 구성

TIP

간단한 성공 케이스 우선 작성

  1. 동작 가능한 가장 간단한 성공 케이스로 시작
  2. 테스트가 동작하면 더 좋은 생각이 떠오를 수 있음

인수 테스트 클래스

  1. 같은 테스트 픽처를 공유하는 인수 테스트를 클래스 단위로 묶음
  2. 필요한 given 만 모아서 하나의 인수 테스트 클래스를 만들어 다른 사람이 해당 클래스를 사용하면 된다는 것을 빠르게 파악

Live Templates

  1. template 를 설정해서 단축키로 템플릿 불러올 수 있음

Flow

  • Top-Down 방향으로 잡고, Bottom-Up 구현
  • 인수 테스트 작성을 통해 요구사항과 기능 전반에 대한 이해를 선행
  • 내부 구현에 대한 설계 흐름을 구상
  • 설계가 끝나면 도메인부터 차근차근 TDD 로 기능 구현
  • 도메인이 복잡하거나 설계가 어려운 경우 이해하고 있는 부분 먼저 기능 구현
  • 인수 테스트의 요청을 처리하는 부분부터 진행 가능

Creation

Acceptance Test 는 요구 사항이 분석될 때와 코딩 전에 생성된다. 이 덕에, 요구 사항의 요청자(프로덕트 오너, 비즈니스 분석가, 고객 담당자 등), 개발자 및 테스터가 공동으로 개발할 수 있다.

  • 개발자는 Acceptance Test 를 사용해 시스템을 구현한다.
  • 테스트에 실패하면, 요구 사항이 충족되지 않는다는 빠른 피드백을 제공한다.
  • 테스트는 비즈니스 도메인 용어로 지정된다. 그런 다음 용어는 고객, 개발자 및 테스터 간에 공유되는 유비쿼터스 언어를 형성한다.
  • 테스트와 요구 사항은 상호 연관이 있다.
  • 테스트가 없는 요구 사항은 제대로 구현되지 않았을 수 있다.
  • 요구 사항을 참조하지 않는 테스트는 불필요한 테스트다.
  • 구현이 시작된 후 개발된 Acceptance Test 는 새로운 요구 사항을 나타낸다.

Process

image

Acceptance criteria and tests by Example

Search Test

Acceptance Criteria

  1. 사용자는 검색어를 사용하여 저자와 제목 필드를 모두 검색하는 간단한 기본 검색을 할 수 있다.
  2. 사용자는 저자, 제목, ISBN 의 어떤 조합이든 입력하여 책을 검색할 수 있다.

Test by first AC

  • 제목에는 나타나지만 저자에는 나타날 가능성이 희박한 단어로 검색한다. ex) '항해'
  • 저자에는 나타나지만 제목에는 나타날 가능성이 희박한 단어로 검색한다. ex) '존(John)'

Test by second AC

  • 적어도 한 권은 있는 저자와 제목의 값을 사용한다.
  • 존재하지 않는 책의 저자와 제목의 값을 사용한다.
  • ISBN 으로 검색을 시도한다.

Checkout Test

Acceptance Criteria

  1. 사용자는 책을 '장바구니'에 넣어두고 쇼핑을 마친 뒤에 구입할 수 있다.
  2. 사용자는 장바구니에 있는 아이템의 수량을 조절할 수 있다. 수량을 0으로 지정하면 장바구니에서 아이템을 삭제한다.

2번 AC는 원래 아래 스토리이지만, 예외 상황에 의해 대체되었다.

사용자는 장바구니에 있는 아이템의 수량을 조절할 수 있다. 수량을 0으로 지정하면 장바구니에서 아이템을 삭제한다.

품절된 상품을 장바구니에 넣을 수 있는가?
출간되지 않은 책에 대해서는 어떠한가?
수량을 증가시키는 경우는 어떠한가?

Test by first AC

  • 품절된 책을 장바구니에 담는다. 사용자에게 재고가 확보되면 배송할 거라고 알려주는지 확인한다.
  • 아직 출간되지 않은 책을 장바구니에 담는다. 사용자에게 책이 출간되면 배송할 거라고 알려주는지 확인한다.
  • 재고가 있는 책을 장바구니에 담는다.

Test by second AC

  • 책의 수량을 1에서 10으로 변경한다.
  • 책의 수량을 10에서 1로 변경한다.
  • 수량을 0으로 바꾸어 책을 제거한다.

Payment Test

Acceptance Criteria

  1. 책들 구입하기 위해 사용자는 청구지 주소, 배송지 주소 및 신용카드 정보를 입력한다.

Test by first AC

  • 청구지 주소를 입력하고 배송지 주소가 같음을 표시한다.
  • 청구지 주소와 배송지 주소를 따로 입력한다.
  • 주소와 일치하지 않는 우편번호를 입력해 보고 시스템이 불일치를 잡아내는지 확인한다.
  • 유효한 비자카드를 사용하여 테스트한다.
  • 유효한 마스터카드를 사용하여 테스트한다.
  • 유효한 아메리칸익스프레스카드를 사용하여 테스트한다.(실패)
  • 유효기간이 만료된 비자카드를 사용하여 테스트한다.
  • 한도가 초과된 마스터카드를 사용하여 테스트한다.
  • 숫자가 빠진 비자카드 번호를 사용하여 테스트한다.
  • 숫자 위치가 바뀐 비자카드 번호를 사용하여 테스트한다.
  • 완전히 잘못된 비자카드 번호를 사용하여 테스트한다.

User Account Test

Acceptance Criteria

  1. 사용자는 배송지 정보와 요금청구 정보를 기억하는 계정을 만들 수 있다.
  2. 사용자는 자신의 게정에 저장된 신용카드 정보를 수정할 수 있다.
  3. 사용자는 자신의 계정에 저장된 배송지와 청구지 주소를 수정할 수 있다.

Test by first AC

  • 사용자는 게정을 생성하지 않고도 주문할 수 있다.
  • 계정을 생성한 다음 계정 정보가 저장되었는지 확인한다.

Test by second AC

  • 신용카드 번호를 유효하지 않는 번호로 변경하고 시스템이 사용자에게 경고하는지 확인한다.
  • 카드의 유효기간 날짜를 하루전으로 변경하고 시스템이 사용자에게 경고하는지 확인한다.
  • 새 유효한 카드 번호로 수정하고 변경된 내용이 저장되는지 확인한다.
  • 카드의 유효기간 날짜를 미래로 수정하고 변경된 내용이 저장되는지 확인한다.

Test by third AC

  • 배송지 주소의 여러 부분을 수정해 보고 변경된 내용이 저장되는지 확인한다.
  • 청구지 주소의 여러 부분을 수정해 보고 변경된 내용이 저장되는지 확인한다.

System manager test

Acceptance Criteria

  1. 관리자는 새로운 책을 사이트에 추가할 수 있다.
  2. 관리자는 책을 삭제할 수 있다.
  3. 관리자는 기존 책에 관한 정보를 편집할 수 있다.

Test by first AC

  • 관리자가 사이트에 책을 추가할 수 있는지 테스트한다.
  • 관리자가 아닌 사람이 책을 추가할 수 없는지 테스트한다.
  • 필요한 정보를 모두 입력해야만 책을 추가할 수 있는지 테스트한다.

Test by second AC

  • 관리자가 책을 삭제할 수 있는지 확인한다.
  • 관리자가 아닌 사람이 책을 삭제할 수 없는지 확인한다.
  • 책을 삭제한 후 이전에 그 책을 주문한 고객에게는 문제없이 배송되는지 확인한다.

Test by third AC

  • 제목, 저자, 쪽 수 등의 항목이 수정되는지 확인한다.
  • 가격이 수정되는지 확인하고, 변경된 가격이 이전 주문된 건에 대해서는 영향응ㄹ 미치지 않음을 확인한다.

Rule test

Acceptance Criteria

  1. 웹 사이트에서 발생하는 주문은 전화 주문과 동일한 주문 데이터베이스에 기록되어야 한다.
  2. 시스템은 최대 50명의 동시 사용자 접근을 처리할 수 있어야 한다.

Test by fist AC

  • 주문을 하고, 전화 주문 데이터베이스를 열어 주문이 그 데이터베이스에 저장되었는지 확인한다.

Test by second AC

  • 50명의 가상 사용자로 하여금 다양한 검색과 주문하는 것을 테스트한다. 나타나는 데 4초 이상 걸리는 화면이 없어야 하며 손실되는 주문도 없어야 한다.

Recommend Test

Acceptance Criteria

  1. 사용자는 다양한 주제에 대해 우리가 추천하는 도서들을 볼 수 있다.

Test by first AC

  • 주제(예를 들어 항해 또는 순항)를 선택하면 해당 주제에 적절한 추천 도서 목록이 나타나는지 확인한다.
  • 추천도서 목록에 있는 아이템을 클릭하면 웹 브라우저가 해당 도서의 정보를 보여주는 페이지로 이동하는지 확인한다.

Archive

Acceptance criteria and tests by Example

Acceptance criteria 는 테스트에서 확인할 사항에 대한 설명이다. "이용자로서 도서관에서 책을 대출하고 싶습니다" 와 같은 요구 사항이 주어지면 Acceptance Criteria 는 "책이 대출된 것으로 표시되었는지 확인" 일 수 있다. 이 요구 사항에 대한 승인 테스트는 매번 동일한 효과로 테스트를 실행할 수 있도록 세부 정보를 제공한다.

Test format

Acceptance Test 는 일반적으로 다음 형식을 따른다.

Given(setup)

시스템의 상태가 지정되는 것

When(trigger)

행동 또는 사건이 일어나는 것

Then(verification)

시스템 상태가 변경되거나, 출력이 만들어진 것

Example

Given - Book that has not been checked out
And - User who is registered on the system
When - User checks out a book
Then - Book is marked as checked out

Complete test

이전 단계에는 특정 예제 데이터가 포함되어 있지 않으므로 테스트를 완료하기 위해 추가된다.

Given

Book that has not been checked out

Books

  • Title : Great book
  • Checked out : No


User who is registered on the system

Users

  • Name : Sam

When

User checks out a book

Checkout action

  • User : Sam, Checks out, Great book

Then

Book is marked as checked out

Books

  • Title : Great book
  • Checked out : Yes
  • User : Sam

Test examination

특정 데이터로 테스트를 검토하면 일반적으로 많은 질문이 나온다. 예시의 경우 다음과 같을 수 있다.

책이 이미 대여된 경우 어떻게 하는가?
책이 존재하지 않으면?
사용자가 시스템에 등록되어 있지 않으면 어떻게 하는가?
책을 체크인해야 하는 날짜가 있는가?
사용자는 몇 권의 책을 체크아웃할 수 있는가?

이러한 질문은 누락되거나 모호한 요구 사항을 밝히는 데 도움이 된다. 예상 결과에 마감일과 같은 추가 세부 정보를 추가할 수 있다. 다른 승인 테스트는 이미 대출된 책을 대출하려고 하는 것과 같은 조건에서 예상한 오류가 발생하는지 확인할 수 있다.

Another test example

비즈니스 고객이 사용자가 한 번에 하나의 책만 대출할 수 있는 비즈니스 규칙을 원한다고 가정한다. 다음 테스트를 통해 다음 사항을 확인할 수 있다.

Scenario

Check that checkout business rule is enforced

Given

Book that has been checked out

Books

Data 1.

  • Title : Great book
  • Checked out : Yes
  • User : Sam

Data 2.

  • Title : Another great book
  • Checked out : No

Users

  • Name : Sam

When

User checks out another book

Checkout action

  • User : Sam, Checks out, Another great book

Then

Error occurs

Error occurred

  • Description
  • Violation of checkout business rule

Project acceptance tests

요구 사항에 대한 Acceptance tests 외에도 Acceptance tests 는 프로젝트 전체에서 사용할 수 있다. 예를 들어, 요구 사항이 도서관 도서 대출 프로젝트의 일부인 경우 전체 프로젝트에 대한 Acceptance test 가 있을 수 있다.

Example

  • 새 도서관 시스템이 프로덕션 단계에 있을 때 사용자는 현재보다 3배 빨리 책을 대출 및 반납할 수 있을 것이다.