책 소개
소스 코드 파일은 여기에서 내려 받으실 수 있습니다.
https://github.com/AcornPublishing/test-driven-development
요약
단위 테스트 코드 작성을 기본으로 하는 테스트 주도 개발 방식은 소프트웨어가 테스트 가능한(Testable) 구조를 갖도록 강제하며, 이로 인해 보다 간단하면서도 구조화된 설계로 이끌 뿐만 아니라 코드에 대한 신뢰를 높일 수 있는 효과적인 방법이다. 이 책에서는 Go, 자바스크립트, 파이썬의 세 가지 프로그래밍 언어로 테스트 주도 개발을 실천하는 실용적 방법을 제공한다. 켄트 벡(Kent Beck)의 저서 『테스트 주도 개발』(인사이트, 2014)에서 다룬 돈 문제(Money Problem) 예제를 각 언어로 재해석해 서술했으며, 테스트 주도 개발 방식에 쉽고 재미있게 익숙해질 수 있도록 돕는다. 실패하는 테스트를 먼저 작성하고 프로덕션 코드를 작성해 테스트를 통과하게 만든 후 개선하는, '레드-그린-리펙터 사이클'의 테스트 주도 개발 필수 구성 요소 세 단계를 다룬다. 또한 GitHub Action을 활용한 지속적 통합과, 자동화된 회귀 테스트의 실천적 방법을 제시한다.
추천의 글
컴퓨터과학 및 소프트웨어 공학 교육자로 일한 30년 경력을 통틀어, 2001년 산업계에 잠깐 몸담은 이후로 자동화된 단위 테스트만큼 내 수업과 연구를 형성하고 스며든 기술은 거의 없었다. 테스트 주도 개발(Test-Driven Development, TDD)은 구체적이지만 널리 적용 가능한 기술로 운용할 수 있는 일반적인 접근 방법이다.
마틴 파울러(Martin Fowler)의 『UML Distilled』(홍릉과학출판사, 2005)를 객체지향 개발 수업교재로 채택한 후, 여전히 테스트 주도 개발을 구체적인 의미에서 대부분을 부작용으로 이해한 기억이 난다. 마틴은 성공적인 반복 개발 프로세스에서 주로 발견되는 세 가지 주요 사례인 자동화된 회귀 테스트, 리팩터링, 지속적 통합을 논의한다. 이 간단 명료한 설명이 뇌리에 박혀, 가르치는 입장에서 학생들이 코드의 나머지를 테스트할 추가적인 코드를 작성할 때 다채로운 테스트 결과의 형태로 즉각적인 피드백이 이뤄지도록 설득하는 과정이 늘 즐거웠다.
깨달음의 순간은 거의 10년이 지난 2012년경에 또 있었다. 소프트웨어 아키텍처에 관한 소프트웨어 엔지니어링 라디오 팟캐스트를 듣기 시작할 때였다. 팟캐스트에서 언급된 참고 문헌을 읽다가 ‘밥 삼촌(Uncle Bob)’ 로버트 C. 마틴(Robert C. Martin)의 저서 『클린 소프트웨어』(제이펍, 2017)에서 ‘뜻밖의 재미있는 아키텍처’란 제목의 짧은 절을 우연히 발견했다. 이 절에서는 테스트 가능한 코드를 만드는 데 집중하는 것이 어떻게 관리 가능한 아키텍처라는 좋은 방향으로 대부분 자연스레 이어지는지 논의한다.
두 가지를 종합하면 자동화된 테스트가 프로세스와 아키텍처뿐만 아니라 기능 및 비기능 요구 사항을 함께 묶는 방법이라 강조한다. 코드가 기능 요구 사항을 충족시키는 데 더 많은 신뢰를 줌으로써, 테스트 가능성(Testability)은 거의 틀림없이 가장 중요한 비기능 요구 사항이 된다.
거의 10년이 지난 해 여름, 저자로부터 그의 책에 관해 연락을 받았다. 덧붙여 말하자면, 내년은 저자와 함께 세 개의 대학원 과정 수업을 수강한 지 25주년이 되는 해다! 그가 성공적인 기술 전문가이자 마틴 파울러와 같은 사상가, 저자가 되는 걸 보는 것은 매우 보람된 일이다. 테스트 주도 개발을 늘 더 배우려는 열정이 있는 저자에게 추천사를 부탁받아 영광이라 생각했다.
특히 이 책에는 일상 생활에서 매우 익숙한 실행 예제를 사용해 직접 해보면서도 체계적인 방식으로 테스트 주도 개발 프로세스에 독자의 마음을 사로잡는 점이 담겨 있어 매우 인상적이다. 레드-그린-리팩터 사이클은 프로그래밍 언어에 관계없이 프로세스의 분위기를 설정한다. 금융 통화 도메인에서 계속되는 피처는 구체적이고 관련시키기 쉽지만, 계속해서 더 복잡한 문제 사이로 독자를 안내함으로써 신뢰를 구축하고 미묘한 타협점을 노출시키고, 나아가 탐구하려는 호기심을 일깨운다. 최종 코드 리뷰는 프로필, 목적, 프로세스의 세 가지 관점으로 검토하며 그 과정에서 수집된 통찰력을 통합시킨다.
약간 상호 보완적인 설계를 바탕으로 Go, 자바스크립트, 파이썬이라는 인기 있는 언어로 테스트 주도 개발 접근 방식의 광범위한 적용 가능성이 있는 강력한 사례를 글로 녹여 냈다. 자바스크립트와 파이썬은 이미 시장에서 최고 위치를 차지하고 있으며 Go는 빠르게 떠오르고 있다. 뿐만 아니라 언어 설계와 세 개의 프로그래밍 언어 간 관계의 인식과 부가적인 접점을 제공한다.
Go, 자바스크립트, 파이썬과 같이 영향력이 강한 언어에 끌린 새로운 소프트웨어 개발자 세대와 함께 공명해 상승 효과를 내고 테스트 주도 개발의 고결한 길을 이끌어 낼 책이길 바란다. 최고의 재즈 색소폰 연주자인 캐넌볼 애덜리(Cannonball Adderley)가 뉴욕에서 실시간 관람 중인 청중에게 ‘힙하다(Hipness)’를 설명할 때 했던 말을 빌려 글을 마무리하겠다.
‘힙하다’는 것은 마음 상태가 아니라 피할 수 없는 인생의 현실이다!
―콘스탄틴 로이퍼(Konstantin Läufer),
로욜라 대학교 시카고 컴퓨터과학과 교수
이 책에서 다루는 내용
◆ 도메인 복잡성을 제어하기 위한 테스트 주도 개발의 분할 정복 접근 방법 사용
◆ 언어, 테스팅 프레임워크, 도메인 개념을 아우르는 테스트 주도 개발 동작 방식 이해
◆ 테스트 주도 개발이 지속적 통합을 가능하게 하는 방식 학습
◆ 테스트 주도 개발을 바탕으로 리펙터링 및 재설계 지원
◆ 자바스크립트로 간단하고 효과적인 단위 테스트 하네스 작성 방법 학습
◆ 테스트 주도 개발 진행 중 만든 단위 테스트를 바탕으로 지속적 통합 환경 구축
◆ 테스트 주도 개발을 사용해 Go, 자바스크립트, 파이썬으로 깨끗하고, 깔끔한 코드 작성
이 책의 대상 독자
소프트웨어를 작성하는 개발자를 대상으로 한다.
‘개발자’에 어울리는 직함이 많다. 소프트웨어 엔지니어, 애플리케이션 아키텍트, 데브옵스 엔지니어, 자동화 테스트 엔지니어, 프로그래머, 해커, 코드 위스퍼러 등 직함은 셀 수도 없다. 개발자를 가리키는 직함은 인상적이거나 겸손하거나 유행을 타거나 근엄하거나 전통적이거나 현대적인 느낌이 있다. 다양한 직함 속 개발자들은 매일은 아니더라도 적어도 일주일의 어느 정도는 컴퓨터 앞에서 소스 코드를 읽고 쓰는 데 시간을 보낸다는 공통점이 있다. 그런 이유로 ‘개발자’라는 용어로 대상 독자를 특정했다.
코딩은 상상력을 동원할 수 있는 가장 자유롭고 평등한 활동이다. 이론적으로, 신체적 기량에서 ‘두뇌’만 있다면 필요한 모든 것이 준비된 셈이다. 나이, 성별, 국적, 출신 중 어느 것도 장애물이 돼서는 안 된다. 특히 신체적 장애는 장애물이 될 수 없다.
목차
목차
- 1부. 시작하기
- 1장. 돈 문제
- 레드-그린-리팩터: TDD 구성 요소
- 문제 인식
- 첫 번째 실패하는 테스트
- Go
- 자바스크립트
- 파이썬
- 그린으로 전환
- Go
- 자바스크립트
- 파이썬
- 마무리하기
- Go
- 자바스크립트
- 파이썬
- 변경 사항 반영하기
- 중간 점검
- Go
- 자바스크립트
- 파이썬
- 2장. 다양한 통화로 돈 계산
- 유로에 발 들이기
- Go
- 자바스크립트
- 파이썬
- DRY한 코드를 유지하라
- Go
- 자바스크립트
- 파이썬
- 반복하지 말라고 하지 않았나?
- 분할 정복
- Go
- 자바스크립트
- 파이썬
- 마무리하기
- Go
- 자바스크립트
- 파이썬
- 변경 사항 반영하기
- 중간 점검
- 유로에 발 들이기
- 3장. Portfolio
- 다음 테스트 설계하기
- Go
- 자바스크립트
- 파이썬
- 변경 사항 반영하기
- 중간 점검
- 다음 테스트 설계하기
- 2부. 모듈화
- 4장. 관심사의 분리
- 테스트 코드와 프로덕션 코드
- 단방향 의존성
- 의존성 주입
- 패키징 및 배포
- 모듈화
- 의존성 제거
- 중간 점검
- 테스트 코드와 프로덕션 코드
- 5장. Go의 패키지 및 모듈
- 코드를 패키지로 분리하기
- Go 모듈
- 패키지 생성하기
- 캡슐화
- 테스트에서 중복 제거하기
- 변경 사항 반영하기
- 중간 점검
- 6장. 자바스크립트의 모듈
- 코드를 모듈로 나누기
- 자바스크립트 모듈로 넘어가기
- CommonJS
- 비동기 모듈 정의
- 유니버설 모듈 정의
- ESModules
- 테스트 개선하기
- 테스트에서 중복 제거하기
- 테스트 클래스 및 테스트 메서드 추가하기
- 자동으로 테스트를 찾고 실행하기
- 테스트가 성공적으로 실행되면 출력 생성하기
- 앞서 실행된 테스트가 어써션에서 실패해도 모든 테스트를 실행하기
- 변경 사항 반영하기
- 중간 점검
- 7장. 파이썬의 모듈
- 모듈로 코드를 분리하기
- 테스트에서 중복 제거하기
- 변경 사항 반영하기
- 중간 점검
- 3부. 피처와 재설계
- 8장. 포트폴리오 평가하기
- 돈 섞기
- Go
- 자바스크립트
- 파이썬
- 변경 사항 반영하기
- 중간 점검
- 돈 섞기
- 9장. 여기도 통화, 저기도 통화
- 해시(맵) 만들기
- Go
- 자바스크립트
- 파이썬
- 변경 사항 반영하기
- 중간 점검
- 해시(맵) 만들기
- 10장. 오류 처리
- 오류 위시리스트
- Go
- 자바스크립트
- 파이썬
- 변경 사항 반영하기
- 중간 점검
- 오류 위시리스트
- 11장. 은행 업무로 재설계
- 의존성 주입
- 모두 합치기
- Go
- 자바스크립트
- 파이썬
- 변경 사항 반영하기
- 중간 점검
- 4부. 마무리 짓기
- 12장. 테스트 순서
- 환율 변경
- Go
- 자바스크립트
- 파이썬
- 변경 사항 반영하기
- 중간 점검
- 환율 변경
- 13장. 지속적 통합
- 핵심 개념
- 버전 관리
- 빌드 서버 및 에이전트
- 아티팩트 저장소
- 배포 환경
- 모두 합치기
- 깃허브 계정 생성
- 깃허브 계정 인증
- 코드 저장소를 깃허브에 푸시
- CI 빌드 스크립트 준비
- Go
- JavaScript
- Python
- 변경 사항 반영하기
- 중간 점검
- 핵심 개념
- 14장. 회고
- 프로필
- 순환 복잡도
- 결합도
- 단순성
- 목적
- 응집도
- 완전성
- 프로세스
- 모두 합치기
- Go
- 자바스크립트
- 파이썬
- TDD는 죽었다?
- 중간 점검
- 프로필
- 부록 A. 개발 환경 구축
- 온라인 REPL
- Repl.it
- LeetCode
- CoderPad
- Go 플레이그라운드
- 온라인 REPL의 종합 목록
- 통합 개발 환경
- 비주얼 스튜디오 코드
- 인텔리제이 IDEA
- 이클립스
- 언어 도구 설치하기
- Go
- 자바스크립트/ES6
- 파이썬
- 온라인 REPL
- 부록 B. 세 언어의 간략한 역사
- Go
- 자바스크립트
- 단언 모듈
- 모듈 메커니즘
- 파이썬
- 부록 C. 감사의 말