이 장을 읽기 전에
이 장은 16장: TDD 법칙과 F.I.R.S.T 원칙에서 다룬 Red-Green-Refactor 사이클과 F.I.R.S.T 원칙을 직접 적용하는 실습이다. 16장을 먼저 읽었다는 전제로 진행한다.
| 수준 | 읽을 부분 | 핵심 목표 |
|---|---|---|
| 입문자 | 실습 1 전체 | Red-Green-Refactor 사이클을 처음부터 끝까지 직접 따라간다 |
| 실무자 | 실습 2, “판단 기준” | F.I.R.S.T 위반 테스트를 식별하고 원인별로 고치는 방법을 익힌다 |
실습 1: TDD로 계산기 구현하기
간단한 계산기의 덧셈 기능을 TDD로 구현하는 과정을 처음부터 따라가 본다. 첫 단계는 아직 존재하지 않는 Calculator 클래스를 사용하는 실패하는 테스트를 작성하는 것이다.
| |
이 테스트를 컴파일되게 만드는 최소한의 코드만 작성한다. TDD의 두 번째 법칙(“컴파일은 성공하되 실행이 실패하는 정도로만 작성”)에 따라, 아직 로직을 채우지 않는다.
| |
이제 테스트를 실제로 통과시키는 최소한의 로직을 채운다.
| |
이 상태에서 뺄셈 기능을 추가하려면, 다시 실패하는 테스트를 먼저 작성하는 것으로 사이클을 반복한다.
| |
이 사이클을 나눗셈까지 반복하면, 자연스럽게 “0으로 나누면 어떻게 되는가"라는 경계 조건도 테스트로 먼저 다루게 된다.
| |
경계 조건을 테스트로 먼저 명시하면, 구현 단계에서 이 경우를 빠뜨릴 가능성이 줄어든다. 이는 TDD가 커버리지 수치보다 “설계 시점에 경계 조건을 미리 생각하게 만든다"는 부수 효과를 실제로 보여주는 사례다.
실습 2: F.I.R.S.T 위반 테스트 정리
아래 테스트는 실제 데이터베이스에 연결하고, 이전 테스트가 만든 데이터에 의존한다.
| |
이 두 테스트는 최소 세 가지 F.I.R.S.T 위반을 동시에 보인다. 실제 데이터베이스에 연결하므로 Fast를 위반해 실행이 느리고, test2가 test1의 실행 순서와 부수 효과에 의존하므로 Independent를 위반하며, 실제 프로덕션 DB 상태에 따라 결과가 달라질 수 있어 Repeatable도 위반한다. 인메모리 테스트 더블로 교체하면 세 문제가 동시에 해소된다.
| |
이제 이 테스트는 다른 테스트의 실행 여부나 순서와 무관하게, 어떤 환경에서 몇 번을 실행해도 동일한 결과를 낸다. 실제 데이터베이스와의 통합이 정말로 검증돼야 한다면, 이런 검증은 별도의 통합 테스트 계층으로 분리하고 단위 테스트와는 실행 빈도·속도 기준을 다르게 가져가는 것이 실무에서 흔한 절충안이다.
판단 기준: 테스트가 F.I.R.S.T를 위반하는지 빠르게 진단하기
새 테스트를 작성한 뒤 “이 테스트를 실행 순서를 바꿔도, 다른 테스트와 함께 병렬로 실행해도, 네트워크가 끊긴 환경에서도 같은 결과가 나오는가"를 자문한다. 하나라도 “아니오"라면 그 테스트는 외부 상태나 다른 테스트에 암묵적으로 의존하고 있다는 신호이며, 테스트 더블(스텁, 페이크)로 그 의존성을 대체할 필요가 있다.
다음 장에서는
18장: 클래스는 작아야 한다에서는 함수와 테스트를 넘어 클래스 전체의 설계 원칙(SRP, SOLID)을 다룬다.
평가 기준
- Red-Green-Refactor 사이클을 실제 기능 구현에 처음부터 끝까지 적용할 수 있다.
- 경계 조건(0으로 나누기 등)을 구현 전에 테스트로 먼저 명시할 수 있다.
- F.I.R.S.T 원칙을 위반하는 테스트를 진단하고 테스트 더블로 리팩토링할 수 있다.
참고 및 출처
- Martin, R. C. (2008). Clean Code: A Handbook of Agile Software Craftsmanship. Prentice Hall. 9장.
- Beck, K. (2002). Test-Driven Development: By Example. Addison-Wesley.
![[SoftwareTesting] 소스 코드 테스트 커버리지 메트릭과 활용](/post/2024-08-19-test-coverage/wordcloud_hu_5f670d08f61abc22.webp)
![[Rust] Comprehensive Rust 무료 강의 정리 및 코스 구조](/post/2022-12-30-comprehensive-rust/wordcloud_hu_d1420ff38434cdb6.webp)
![[Hardware] LattePanda Alpha에 Ubuntu 16.04 LTS 설치 가이드](/post/2018-12-06-install-ubuntu-16.04-on-lattepanda/wordcloud_hu_fc536f8de2cbd4bf.webp)
![[Tutorial] Learn Prompting - 프롬프트 엔지니어링 무료 가이드 정리](/post/2022-12-30-learn-prompting/wordcloud_hu_6a9d105de4834753.webp)