Java

ATDD 아주 간단히 찍먹

감동이중요해 2021. 7. 21. 01:37

ATDD

ATDD를 간단하게 소개해보자면...

  • 인수 테스트는 고객과 개발자, 그리고 테스터간의 커뮤니케이션을 기반으로 한 개발 방법론이다. 이러한 프로세스는 개발자와 테스터가 구현 전에 고객의 요구를 이해하는 데 도움이 되며 고객이 자신의 도메인 언어로 대화 할 수 있도록 한다.

Trade off of TDD

테스트 케이스가 없는 코드는 깨끗한 코드가 아니다. 아무리 코드가 우아해도, 아무리 가독성이 높아도, 테스트 케이스가 없으면 깨끗하지 않다.

  • 테스트는 코드 품질을 일정 수준까지 보장할 수 있는 가장 확실한 수단
  • TDD는 개발보다는 테스트를 우선으로 개발하는 방법론
  • TDD를 마냥 진행하기에는 몇 가지 어려운 문제점이 있다.
    • TDD는 실패한 테스트부터 작성해야 한다. 어떻게 시작하고 어디까지 구현해야 하는가?
    • 막상 TDD로 구현을 하고 나니 쓰지 않는 코드가 완성되었다.
    • 어렵사리 완성을 했지만 요구사항이 변경되며 테스트 코드까지 대거 변경해야 한다. 어디부터 다시 TDD를 시작해야 할까?
    • TDD로 개발하니 어디부터 구현해야 하는지 감이 잘 오지 않아 생산성이 저하되었다.

ATDD 는 이 고민에 대한 해결책이 될 수 있다. 인수 테스트는 작업의 시작과 끝이 명확한 테스트이기 때문에 생산성에 큰 도움이 된다.

ATDD 개요

ATDD Cycle

  1. 사용자 시나리오 설계
  2. 작업 대상의 요청값응답값 설정
  3. 위의 절차를 토대로 ATDD 작성
    • 작성된 테스트는 Black box 방식이기 때문에 실제로 어떻게 구현하느냐는 고려 대상이 아니다.
    • 요청값과 응답값만을 확인하여 전 구간을 검증
  4. 작성된 ATDD를 망가뜨리지 않는 선에서 기능과 단위 테스트를 작성

인수 테스트의 조건

  1. 인수 조건이 명확해야 한다.
    • 인수 조건은 개발자가 소프트웨어의 의도를 명확하게 이해했음을 드러내는 수단이다.
    • 인수 조건의 예시
  2. 실제 요청/응답 환경과 유사한 테스트 환경이 구축되어 있어야 한다.

ATDD의 장점

  1. 테스트 의도를 더 명확하게 전달할 수 있어 구현 대상에 대한 이해가 빠름.
  2. 작업의 시작과 끝부터 정한 뒤 Top-down 방식으로 코드를 작성하는데 도움이 됨.
  3. 테스트를 최대한 수정하지 않으면서 리팩토링하기에 수월함.

ATDD 도구 소개

특징

  1. 이해하기 쉬운 구조로 단순화된 API

     given().
         param("key1", "value1").
         param("key2", "value2").
     when().
         post("/somewhere").
     then().
         body(containsString("OK"));
  2. 검증을 위한 다양한 방식의 API 지원

     // Example with JsonPath
     String json = get("/lotto").asString();
     List<String> winnerIds = from(json).get("lotto.winners.winnerId");
    
     // Example with XmlPath
     String xml = post("/shopping").andReturn().body().asString();
     Node category = from(xml).get("shopping.category[0]");

프로젝트에 추가하기

gradle 기준으로 작성

  1. rest-assured

    dependencies { 
        testImplementation 'io.rest-assured:rest-assured:3.3.0' 
    }
  2. spring-restdocs

    dependencies { 
        testImplementation 'org.springframework.restdocs:spring-restdocs-restassured' 
    }

프로젝트에 더 맞는 의존성을 불러와서 사용하면 된다.

예제 코드

dhmin5693/ATDD-product-example