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.