Post

TDD

TDD

Practical Testing: 실용적인 테스트 가이드를 듣고 요약한 내용입니다.

TDD

  • 테스트 주도 개발 Test Driven Development
  • 프로덕션 코드보다 테스트 코드를 먼저 작성하여 테스트가 구현 과정을 주도하도록 하는 개발 방법론
  • RED → GREEN → REFACTOR
    • 실패하는 테스트 작성
    • 테스트가 통과하도록 최소한의 코딩
    • 구현 코드 개선, 테스트 통과 유지하면서 리팩토링

선 기능 구현, 후 테스트 작성 시

  • 테스트 자체의 누락 가능성
  • 특정 테스트 케이스만 검증할 가능성
    • 해피 케이스
  • 잘못된 구현을 다소 늦게 발견할 가능성

선 테스트 작성, 후 기능 구현 시

  • 복잡도가 낮은, 테스트 가능한 코드로 구현할 수 있게 한다.
    • 유연하면서 유지보수가 쉬움
  • 쉽게 발견하기 어려운 엣지 케이스를 놓치지 않게 해준다.
  • 구현에 대한 빠른 피드백을 받을 수 있다.
  • 과감한 리팩토링이 가능해진다.

애자일 방법론 vs 폭포수 방법론

소프트웨어 개발 방법론에는 크게 애자일(Agile)과 폭포수(Waterfall) 방식이 있습니다.

애자일 방법론

  • 반복적이고 점진적인 개발 방식
  • 유연성과 변화에 대한 빠른 대응이 가능
  • 고객 피드백을 지속적으로 반영
  • 작은 단위의 기능을 빠르게 개발하고 테스트
  • TDD와 같은 실천 방법들과 잘 어울림

폭포수 방법론

  • 순차적이고 선형적인 개발 방식
  • 각 단계가 명확히 구분되며, 이전 단계가 완료되어야 다음 단계로 진행
  • 초기 계획과 문서화에 많은 시간 투자
  • 변경사항 반영이 어려움
  • 대규모 프로젝트나 요구사항이 명확한 경우에 적합

TDD는 애자일 방법론의 실천 방법 중 하나로, 빠른 피드백과 유연한 개발을 추구하는 애자일의 철학과 잘 맞습니다.

익스트림 프로그래밍 (XP: eXtreme Programming)

익스트림 프로그래밍은 애자일 소프트웨어 개발 방법론 중 하나로, 높은 품질의 소프트웨어를 생산하고 고객의 요구사항 변화에 유연하게 대응하는 것을 목표로 합니다.

  • 지속적인 통합과 배포
  • 짧은 개발 주기
  • 페어 프로그래밍
  • 단순한 디자인
  • 코드 리팩토링
  • 테스트 주도 개발 (TDD)

XP는 TDD를 핵심 실천 방법 중 하나로 채택하고 있어, TDD와 XP는 밀접한 관계를 가지고 있습니다.

스크럼 (Scrum)

스크럼은 애자일 프레임워크 중 하나로, 복잡한 제품 개발을 위한 프레임워크입니다.

  • 반복적이고 점진적인 개발 방식
  • 스프린트라 불리는 짧은 개발 주기 (보통 2-4주)
  • 데일리 스크럼 미팅을 통한 팀 커뮤니케이션 강화
  • 제품 백로그, 스프린트 백로그를 통한 작업 관리
  • 스프린트 리뷰와 회고를 통한 지속적인 개선

칸반 (Kanban)

칸반은 시각적인 워크플로우 관리 방법으로, 지속적인 개선과 효율성 향상을 목표로 합니다.

  • 작업의 시각화: 칸반 보드를 사용하여 작업 상태를 명확히 표시
  • 진행 중인 작업 제한 (WIP 제한)
  • 작업 흐름의 지속적인 관리와 최적화
  • 명시적인 프로세스 정책
  • 피드백 루프를 통한 지속적인 개선

테스트 코드는 문서

  • 프로덕션 기능을 설명하는 테스트 코드 문서
  • 다양한 테스트 케이스를 통해 프로덕션 코드를 이해하는 시각과 관점을 보완
  • 어느 한 사람이 과거에 경험했던 고민의 결과물을 팀 차원으로 승격시킴

    → 모두의 자산으로 공유할 수 있다.

문서의 기능을 하기 위해서…

  • @DisplayName 을 섬세하게
    • 테스트 행위에 대한 결과까지 기술하기
      • BAD : 음료 1개 추가 테스트
      • GOOD : 음료를 1개 추가할 수 있다.
      • BEST : 음료를 1개 추가하면 주문 목록에 담긴다!
    • 도메인 용어를 사용하여 한층 추상화된 내용을 담기
      • BAD : 특정 시간 이전에 주문을 생성하면 실패한다.
      • GOOD : 영업 시작 시간 이전에는 주문을 생성할 수 없다.
    • 테스트의 현상을 중점으로 기술하지 말 것

BDD

  • Behavior Driven Development
  • TDD에서 파생된 개발 방법
  • 함수 단위의 테스트에 집중하기보다, 시나리오에 기반한 테스트케이스(TC) 자체에 집중
  • 개발자가 아닌 사람이 봐도 이해할 수 있을 정도의 추상화 수준을 권장
1
2
3
Given : 시나리오 진행에 필요한 모든 준비 과정 (객체, 값, 상태 등)   
When : 시나리오 행동 진행
Then : 시나리오 진행에 대한 결과 명시, 검증
1
2
3
4
어떤 환경에서 (Given)
어떤 행동을 진행했을 때 (When)
어떤 상태 변화가 일어난다 (Then)
→ DisplayName에 명확하게 작성할 수 있다.

JUnit vs Spock

JUnit과 Spock은 둘 다 Java 생태계에서 사용되는 인기 있는 테스팅 프레임워크입니다.

JUnit

  • Java에서 가장 널리 사용되는 테스팅 프레임워크
  • 간단하고 직관적인 문법
  • 풍부한 어노테이션을 제공하여 테스트 설정과 실행을 쉽게 함
  • AssertJ, Mockito 등 다른 라이브러리와 쉽게 통합 가능

Spock

  • Groovy 기반의 테스팅 프레임워크로, Java 프로젝트에서도 사용 가능
  • BDD 스타일의 문법을 사용하여 더 읽기 쉽고 표현력이 풍부한 테스트 작성 가능
  • 데이터 주도 테스팅을 위한 강력한 기능 제공
  • Mock 객체 생성이 내장되어 있어 별도의 라이브러리가 필요 없음

선택은 프로젝트의 요구사항, 팀의 선호도, 그리고 기존 코드베이스에 따라 달라질 수 있습니다. JUnit은 Java 개발자에게 더 친숙할 수 있지만, Spock는 더 표현력이 풍부한 테스트 작성을 가능하게 합니다.

This post is licensed under CC BY 4.0 by the author.