Life/컨퍼런스

[우아한 Tech] 우아한 ATDD

샤아이인 2022. 3. 10.

 

2021년 3월에 진행된 우아한 테크 세미나에서 류성현님의 '우아한 ATDD' 스트리밍 영상을 보고 정리한 내용입니다.

 

1. ATDD 란?

  • 인수테스트는 사용자의 시나리오를 기반으로 진행되는 test이다.
  • ATDD(인수 테스트 주도 개발)는 요구사항에 대한 인수 테스트를 이용하여 요구사항을 명확히 하고 모든 팀원이 요구사항에 대한 공통의 이해를 바탕으로 개발을 진행하는 방법.

 

개발을 하기전 인수 테스트 먼저 작성하여 전체적인 가이드 라인을 잡는다. 이후 그 인수 테스트를 충족시키기 위해 개발을 해 나간다.

인수 테스트를 기반으로 개발을 할 경우 다음과 같은 장점이 있습니다.

  • 기존 인수 테스트 장점
    • 빠른 피드백을 받을 수 있음
    • 회귀 오류를 잡아줄 꾸준한 테스트를 만들 수 있음
    • 기존 기능을 망가뜨리지 않고 새 기능을 추가할 수 있음
  • 인수 테스트를 작성하면서 구현할 대상에 대한 이해도 증진
  • 작업의 시작과 끝이 명확해져서 심리적인 안정감에 도움

 

2. 용어간의 차이

 

  • TEST : 구현먼저 -> 이후 테스트(검증) -> 이는 마치 하루 일과를 끝내고 작성하는 일기와 같다.
  • TDD : 테스트(요구사항) -> 구현 + @ -> 하루 일과 시작전에 작성하는 TODO List 와 같다.
  • BDD : 행위중심(요구사항) -> 구현
  • ATDD : 인수 테스트(요구사항) -> 인수 테스트 -> 구현

 

BDD 와 ATDD 모두 given, when, then을 사용하기 때문에 비슷하다 느끼는 분들이 많다.

 

3. ATDD Process

위 프로세스는 개발 뿐만 아니라 전체적인 프로세스에 해당된다.

이번 세미나 에서는 개발자의 입장 부분만 다루기로 했다.

4. ATDD Develop Process

1. 요구사항

사용자 스토리 (누가/무엇을/왜)
강사는 강의료를 환불해주기 위해 수강생의 수강을 취소할 수 있다.

 

2. 인수 조건 정의

 

  • 인수 테스트가 충족해야하는 조건
  • 인수 조건을 표현하는 시나리오 기반 표현 방식 사용(ex. Given/When/Then)
  • 인수 조건 작성 방법
    1. 검증하고자 하는 when 구문 먼저 작성
    2. 기대 결과를 의미하는 then 구문 작성
    3. when과 then에 필요한 정보를 given을 통해 마력우아한ATDD_최종
given
    강사는 강의를 생성했다.
    강사는 강의를 신청 가능 상태로 변경하였다.
    강의 모집인원 만큼 신청을 받았다.
when
    회원이 수강 대기 신청을 요청한다.
then
    회원은 강의의 수강 대기자로 등록 되었다.

 

3. 인수 테스트 작성

 

  • 인수 조건을 검증하는 테스트
  • 실제 요청/응답 환경과 유사하게 테스트 환경 구성

 

4. 인수 테스트 기반, 기능 구현

  • 인수테스트를 충족하기 위한 코드 구현
  • 기능 구현은 TDD로 진행할 수 있음

 

5. 테스트 도구

테스트 서버(환경)

  • @SpringBootTest
  • webEnvironment 속성을 사용하여 테스트 서버의 실행 방법을 설정
  • 실제 웹 환경과 유사한 RANDOM_PORT 설정 선택

@ExtendWith(SpringExtension.class)를 사용하면 Spring test context를 사요할 수 있게 된다.

@BootstrapWith(SpringBootTestContextBootstrapper.class)는 SpringBootConfig를 자동으로 검색해주고, webEnvironment 모드로 지원해준다. webEnvironment는 테스트 환경에서 웹서버 환경을 설정할 수 있게 도와준다.

 

테스트 클라이언트

  • RestAssured
    • 실제 web environment(Apache Tomcat)을 사용하여 테스트
  • MockMVC
    • @SpringBootTest의 webEnvironment.MOCK 과 함께 사용 가능
    • mocking 된 web environment 환경에서 테스트
  • WebTestClient
    • @SpringBootTest의 webEnvironment.RANDOM_PORT 나 DEFINED_PORT와 함께 사용
    • Netty 를 기본으로 사용

 

조합

  • @SpringBootTest / RANDOM_PORT + RestAssured
  • @SpringBootTest / Mock + MockMVC

 

6. 테스트 데이터 초기화

테스트 데이터 초기화

  • 일괄 데이터 초기화
    • EntityManager를 활용한 테이블 이름 조회
    • 각 테이블 Truncate 수행
    • ID auto increment 값 초기화
  • @DirtiesContext
    • 스프링 테스트 환경에서 캐싱된 Context를 사용하지 않게 설정
    • 매번 Context를 새로 구성하다 보니 많은 시간 소요

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

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

 

Outside In 방식의 TDD를 추천한다.

도메인부터 TDD

  • 인수 테스트를 통해 시나리오 및 전반적인 기능에 대한 이해를 했다면, 핵심 기능에 대한 도메인 설계를 한 후 도메인 객체에 대한 TDD 수행

 

추천하는 흐름

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

 

7. ATDD의 장, 단점

1) 장점 : Common Understaning

- 다른 포지션의 관점은 물론 업무 프로세스도 간접적으로 익힐 수 있음

- 다른 포지션의 진행 상황에 대한 인지와 이해도가 높아짐

 

2) 단점

- 인수 조건 정의의 어려움

- 문서를 어떻게 관리해야 할 지에 대한 고민이 필요

- 리소스 : (기획/개발) 두번 작업하는 느낌을 받음

 

댓글