테스트 주도 개발 입문 : 깔끔한 코드 작성을 위한 폴리글랏 안내서 - 에이콘 소프트웨어 테스팅 시리즈
Description
단위 테스트 코드 작성을 기본으로 하는 테스트 주도 개발 방식은 소프트웨어가 테스트 가능한(Testable) 구조를 갖도록 강제하며, 이로 인해 보다 간단하면서도 구조화된 설계로 이끌 뿐만 아니라 코드에 대한 신뢰를 높일 수 있는 효과적인 방법이다. 이 책에서는 Go, 자바스크립트, 파이썬의 세 가지 프로그래밍 언어로 테스트 주도 개발을 실천하는 실용적 방법을 제공한다. 켄트 벡(Kent Beck)의 저서 『테스트 주도 개발』(인사이트, 2014)에서 다룬 돈 문제(Money Problem) 예제를 각 언어로 재해석해 서술했으며, 테스트 주도 개발 방식에 쉽고 재미있게 익숙해질 수 있도록 돕는다. 실패하는 테스트를 먼저 작성하고 프로덕션 코드를 작성해 테스트를 통과하게 만든 후 개선하는, '레드-그린-리펙터 사이클'의 테스트 주도 개발 필수 구성 요소 세 단계를 다룬다. 또한 GitHub Action을 활용한 지속적 통합과, 자동화된 회귀 테스트의 실천적 방법을 제시한다.
저자

살림시디퀴

저자:살림시디퀴
소프트웨어개발자,교육자,연사이자저자다.몇번의기술호황과불황이반복되는시기를겪으며의료,유통,관공서,금융및제약부문에서크고작은팀의일원으로소프트웨어를개발했다.소프트웨어를개발하는동안부끄러운지도모른채저질렀던실수에서얻은교훈을다른이들과공유하고자한다.
노력을토대로세계무대로나아가길즐긴다.경험을글로풀어블로그(thesaleem.com/blog)에게시하는데,가끔은제삼자의관점에서쓴글도볼수있다.

역자:김인태
컴퓨터공학을전공했고,모바일단말,자동차전장,미디어스트리밍분야에서다수의소프트웨어개발프로젝트에참여했다.그과정을통해다양한프로그래밍언어와시스템환경에서소프트웨어개발경험을쌓았다.14년차소프트웨어엔지니어로일하고있으며,국내소프트웨어테스트전문가자격시험인TTA주관CSTS의시험위원으로도활동하고있다.

목차


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
____파이썬

부록B.세언어의간략한역사
__Go
__자바스크립트
____단언모듈
____모듈메커니즘
__파이썬

부록C.감사의말

출판사 서평

이책에서다루는내용

도메인복잡성을제어하기위한테스트주도개발의분할정복접근방법사용
언어,테스팅프레임워크,도메인개념을아우르는테스트주도개발동작방식이해
테스트주도개발이지속적통합을가능하게하는방식학습
테스트주도개발을바탕으로리펙터링및재설계지원
자바스크립트로간단하고효과적인단위테스트하네스작성방법학습
테스트주도개발진행중만든단위테스트를바탕으로지속적통합환경구축
테스트주도개발을사용해Go,자바스크립트,파이썬으로깨끗하고,깔끔한코드작성

이책의대상독자

소프트웨어를작성하는개발자를대상으로한다.

‘개발자’에어울리는직함이많다.소프트웨어엔지니어,애플리케이션아키텍트,데브옵스엔지니어,자동화테스트엔지니어,프로그래머,해커,코드위스퍼러등직함은셀수도없다.개발자를가리키는직함은인상적이거나겸손하거나유행을타거나근엄하거나전통적이거나현대적인느낌이있다.다양한직함속개발자들은매일은아니더라도적어도일주일의어느정도는컴퓨터앞에서소스코드를읽고쓰는데시간을보낸다는공통점이있다.그런이유로‘개발자’라는용어로대상독자를특정했다.

코딩은상상력을동원할수있는가장자유롭고평등한활동이다.이론적으로,신체적기량에서‘두뇌’만있다면필요한모든것이준비된셈이다.나이,성별,국적,출신중어느것도장애물이돼서는안된다.특히신체적장애는장애물이될수없다.

지은이의말

우리는말로표현할수없을만큼운이좋다.우리는수년간테스트주도개발을했다.머큐리우주프로그램코드를작성한개발자들이펀치카드로테스트주도개발(Test-DrivenDevelopment,TDD)을실천한지도수십년이지났다(https://oreil.ly/pKpSZ).테스트주도개발적용을수월하게하는XUnit라이브러리는세기를거슬러올라간다.사실,『테스트주도개발』(인사이트,2014)을저술하고JUnit프레임워크를개발한켄트벡은스스로테스트주도개발의실천(https://oreil.ly/zDyBr)을발명이아닌‘재발견’이라말한다.이표현은그의겸손의증거이면서도사실이다.테스트주도개발은소프트웨어개발만큼이나오래됐다.

그렇다면테스트주도개발이표준코드작성방식과여전히거리가먼이유는무엇일까?일정의압박이있을때,또는IT예산을줄여야할때,또는(개인적으로가장좋아하는)‘소프트웨어딜리버리팀의속도향상’이필요할때흔히희생돼야하는첫번째대상이테스트주도개발일까?테스트주도개발은결함개수를줄이고설계를더간단하게만들며개발자스스로가갖는코드에대한신뢰를향상시키는데경험적이고실험적인증거가있음에도이런모든이유가제시된다.

테스트주도개발이마지못해채택되거나쉽게버려지는이유는무엇일까?테스트주도개발실천을꺼리는이들이주장은크게두가지다.

첫째,어디서부터어떻게시작해야할지모르겠다.

아마도가장흔한이유는인지도와노출의부족이다.다른기술과같이,테스트주도스타일의코드작성은배워야한다.많은개발자들은이기술을배울외적동기(시간,리소스,지침,격려)도내적동기(꺼리는마음과두려움극복)도없다.

둘째,테스트주도개발은토이프로그램이나인터뷰에서는쓸법하나‘실제세계’코드작성에는제대로작동하지않는다.

사실이아니지만이해는된다.대부분의테스트주도개발튜토리얼과이책을포함한서적에서는뻔한도메인에서비교적간단한예제를선택하도록강요한다.상업적으로배포된애플리케이션(예:금융기관,의료관리시스템,자율주행자동차)에서빼낸소프트웨어조각의실제코드를바탕으로테스트주도개발기사나책을쓰기는어렵다.우선한가지이유는,실제코드는대부분독점소유권이있으며오픈소스가아니다.다른이유로는,가장많은청중들에게가장폭넓은관심을가질도메인의코드를보여주는것은저자의역할이다.고도로전문적인도메인의문맥상에서테스트주도개발을보여주는것은애매함에경계에있어비논리적이다.그렇게하려면무엇보다해당도메인의난해한전문용어와은어들의장황한설명이필요하다.테스트주도개발을이해하기쉽고,접근하기쉬우며,심지어사랑스럽게만들려는저자의의욕을꺾게될것이다.

테스트주도개발문헌에서실제세계코드를사용함에있어이런장애물에도불구하고,개발자는어김없이테스트주도개발로프로덕션소프트웨어를작성한다.아마도최고의설득력있는예시는JUnit프레임워크(https://oreil.ly/UCPcg)자체에대한단위테스트스위트일것이다.리눅스커널(아마세계에서가장활발히사용되고있는소프트웨어조각)은단위테스트를바탕으로개선되고있다.

코드작성부터하고테스트를작성해도충분하다.테스트주도개발은너무제한적이고현학적이다.

이주장은‘단위테스트는지나치게과대평가됐다(https://oreil.ly/Y7S5M)’라고가끔큰소리치는것을듣는것보다더신선하다!프로덕션코드를작성한후작성하는테스트는아무런테스트도작성하지않는것보다는낫다.개발자가자신의코드에신뢰를높이고우발적인복잡성을줄이며,믿을만한문서를제공하는모든일은좋다.다만,단위테스트를프로덕션코드를작성하기전에작성하면,임의의복잡성의발생을예방하도록강제하는기능을제공한다.

테스트주도개발은다음두가지실용적인규칙을방호책으로제공해더간단한설계를할수있다.

1.실패하는테스트를고치기위해서만프로덕션코드를작성하라.

2.테스트가그린일때만열성적으로리팩터링하라.

우리가작성하는모든코드를자동으로그리고필연적으로동작하는가장간단한코드가되도록테스트주도개발이보장하는가?아니다.그렇지않다.그렇게할수있는어떤사례,규칙,책,선언서는없다.단순성이달성되고유지되도록이런사례에숨을불어넣는사람에게달려있다.

이책은테스트주도개발이세가지다른프로그래밍언어에서어떻게작동하는지설명하고지도한다.테스트주도개발을꾸준히연습하는습관과자신감을심어주는것이목적이다.야심에찬목적일순있지만달성하기힘들진않기를소망한다.

옮긴이의말

여러프로그래밍언어로소프트웨어를개발하는접근방식인폴리글랏프로그래밍은,다양한언어의장점을활용해보다유연하고최적의성능과확장성을제공하는소프트웨어개발을가능케한다.한언어만고수하는소프트웨어개발자가아닌이상자의또는타의에의해여러프로그래밍언어를접하게되며,자연스레폴리글랏프로그래밍을하는상황에놓인다.

단위테스트코드작성을기본으로하는테스트주도개발방식은,소프트웨어가테스트가능한(Testable)구조를갖도록강제하며,이로인해보다간단하면서도구조화된설계로이끌어줄뿐만아니라코드의신뢰도를높일수있는효과적인방법이다.

이책에서는개발자에게사랑받는Go,자바스크립트,파이썬의세가지프로그래밍언어로테스트주도개발을실천하는실용적방법을제공한다.켄트벡의저서『테스트주도개발』(인사이트,2014)에서다룬‘돈문제’예제를각언어로재해석해쉽고재밌게테스트주도개발방식에익숙해질수있도록설명했다.

테스트주도개발은지속적통합및회귀테스트를자동화해빠르고정확하게결함을발견할수있게하며,켄트벡이얘기했듯이소프트웨어개발자자신이작성한코드에대한두려움을관리하는데효과적이다.윤오영작가의수필「방망이깎던노인」에서방망이장인이질좋은방망이하나를깎아내는데노련하게무던히애를쓰듯이,소프트웨어개발자또한품질좋은소프트웨어를개발하기위해많은수고를아끼지않는다.테스트주도개발은질좋은방망이와같은소프트웨어를깎아내게끔하는정교하고견고한도구이기에소프트웨어개발자라면반드시경험하고체득해야한다고생각한다.

시간은좀흘렀으나2015년에구글,넷플릭스,어도비본사에직접방문한적이있다.현업개발자들로부터이야기를들을기회가있었는데,각회사의소프트웨어테스팅에대한인식과노력은정말인상적이었다.이후여러프로젝트에서다양한프로그래밍언어(C/C++,Go,파이썬,코틀린,자바)로개발하며테스트주도개발및단위테스트에계속관심을두게됐다.이책을통해테스트주도개발의가치를이해하고그과정을즐길수있기를희망한다.