이 글은 동아리원들과 Test-Driven Development : By Example 을 함께 읽고 나눈 의견들과, 책의 내용들을 보며 개인적으로 정리한 글입니다.
테스트는 쉽지 않습니다. 좋은 테스트를 작성하는 것은 더욱 그렇습니다. 때문에 이번 TDD 북스터디를 통해 테스트를 어떻게 작성하면 좋을지에 대한 인사이트를 얻고, TDD를 잘 활용하는 방법에 대해 의견을 나누며 공부해보았습니다. 이 글은 책과 스터디원들의 의견들을 바탕으로, 개인의 생각을 정리한 글입니다. 기본적으로는 제가 책을 이해한 바에 따라 작성하기 때문에, 실제로 사용되지 않는 비공식적인 용어들이 사용될 수 있습니다. (주로 모호한 상황에서 등장할 것으로 보이는데, 그를 칭하는 명확한 단어가 있다면 댓글로 알려주시면 감사하겠습니다.)
오늘 포스팅에서는 역·저자의 글 부분과, 앞으로 테스트를 진행하기 위한 준비 과정을 담을 예정입니다. 책의 예제 코드는 자바와 파이썬을 기준으로 작성되기 때문에, 제가 주로 사용하는 자바스크립트 기반의 테스트 환경을 미리 구성할 예정입니다. 이 부분은 역·저자의 글 아래에서 이어가겠습니다.
역자의 글
북 스터디를 진행하시는 리더인 선배님께서 늘 하시는 말씀이 있습니다.
"책을 읽을때, 저자의 말과 목차를 먼저 보고 들어가자."
제가 보고 있는 책을 기준으로는, 두 버전의 역자의 글을 먼저 볼 수 있습니다. 하나는 재쇄를 찍으며, 하나는 책이 처음 나올때 작성된 글입니다.
처음 작성된 역자의 글에서는 아직 TDD라는 개념이 생소했던 시절, 어떻게 TDD를 습득하였는지에 대한 과정들이 그대로 적혀있습니다. 수 차례 시도해보며 실패도 하고, 성공도 하며 많은 것들을 느끼게 되는 과정을 보고 있자면 과거의 제 모습이 보이는 것 같아 묘한 동질감이 느껴졌습니다. 이 글을 작성하는 지금을 기준으로 이 책을 한 번 다 읽고, 시간이 지나 두 번째로 읽고 있기 때문에 처음 이 책을 통해 TDD를 접했을 당시 낯설었던 감정들을 다시 한 번 상기시켜주는듯 했습니다.
그만큼 TDD라는 방법론 자체가 처음 개발을 하시는 분에게는 매우 어색하게 느껴지고, 이게 정말 효율적인 방법이 맞는가에 대한 의심을 불러 일으키는 방법이라는데에는 십분 공감하였습니다. 저도 마찬가지로 TDD가 정말 좋은게 맞는지 굉장히 많은 고민이 들었었습니다.
지금와서 TDD의 효율에 대해 다시 생각해보면, 반은 맞고 반은 틀린 것 같습니다. 분명 TDD는 효율적인 방법이 맞지만, 모든 상황에서 반드시 높은 효율을 보장하는 방법은 아니라고 생각합니다. 당장 떠오르는 한 반례가 있다면, 아마 GUI 개발이지 않을까 싶습니다. 이 부분은 이후 나오는 저자(켄트 백)와의 인터뷰에서도 TDD를 적용하기 마땅한 방법을 찾지 못한 예시로 등장합니다.
... 『Contributing to Eclipse』 는 몇 개월 동안 코드를 테스트 주도로 작성하려면 어떻게 해야 할지 방법을 찾지 못한 또 다른 예입니다. ... (중략) ... 단지 몇 개의 GUI 테스트만 작성했습니다.
- 『Test-Driven Development』 한국어판 출간 인터뷰 中
저는 아직까지 모든 상황에서 만능 해결책이 되는 은탄은 찾지 못했습니다. TDD 역시 분명 그러한 은탄은 아닙니다. 그러나 분명히 가치있고, 효율적인 개발을 도와주는 방법론이라는 점에는 의심의 여지가 없습니다. 역자는 어렵고 의문스럽더라도, 직접 테스트를 기반으로 여러 프로그램들을 작성해보며 TDD를 제대로 느껴보는 것을 추천합니다. 저도 이 의견에는 고개가 끄덕여졌습니다. 테스트에 대한 감을 잡는데에는 역자가 추천하는 방법처럼 직접 해보는것만큼 확실한건 없었던 것 같습니다.
역자의 글 2
TDD가 처음 출간되고 4년이 지난 2008년, 테스트 주도 개발이 재쇄되던 시점에 역자가 남긴 글입니다. 이 책에서 고치고 싶은 점이 있냐는 출판사의 질문에, 역자는 특이하게도 "제목" 을 언급하였습니다.
우리가 보고있는 테스트 주도 개발의 원서 제목은 "Test-Driven Development: By Example" 입니다. 역자는 여기서 By Example에 집중하였는데, 번역서의 제목에선 빠져있는 "By Example"이 갖는 의미에 대해 다시 한 번 곱씹어보는 계기가 되었다고 합니다. 여기서 말한 예시는 예제 코드 뿐만이 아닌, 실제 시스템이 코드를 어떻게 사용해야 하는지 보여주는 예시에서 비롯되었다고 말합니다. 켄트 백이라면 분명히 그랬을거라고 확신하면서 말입니다.
우리가 이후에 작성할 테스트들을 보면 어떠한 메서드를 실행하고, 그 실행 결과가 우리의 예측과 맞아 떨어지는지를 확인하는 작업의 반복입니다. 여기서 단순히 메서드와 그 메서드의 결과만 생각할게 아니라, 왜 그 메서드를 사용해야 하는가? 또는 그 메서드들이 무엇을 하기 위한 메서드들인가? 에 대해서도 생각해보면 결국 하나의 커다란 프로그램이 작동하기 위한 기능들임을 알 수 있습니다. 이 커다란 프로그램을 역자가 위에서 말한 시스템이라고 생각해보면, 결국 TDD에서 테스트는 기능 작동에 대한 확인 뿐 아니라 어떻게 이 프로그램을 사용하는지에 대한 커다란 가이드북 같은 역할을 하고 있다는 느낌입니다.
아마도 역자는 이런 부분에 대해 이야기하고 싶었던 것이 아닐까 추측해봅니다.
또한, 역자는 TDD를 입문하는 사람들을 위해 테스트에 실패한 사람들을 위한 도움말을 추가하고 싶었으나 지면이 부족하여 적을 수 없었다고 돌아봅니다. 다만 한 가지 조언만 추가하자면, 실패했다고 해서 조급해지지 말고 어디에서 에러가 발생했을지 차분히 되짚어보는 자세를 가질 것을 이야기합니다. 언뜻 이후에 나오는 TDD에 대한 설명을 보면 굉장히 급박하고 쉴새없이 돌아갈 것 같지만(빨간 막대를 보고, 바로 초록 막대로 전환하고, 다시 코드로 가서 고치고...), 이는 이미 숙련된 사람들이 빠르게 진행하려는 것일 뿐 천천히 살펴보며 진행하더라도 아무런 문제가 되지 않습니다. 오히려 저는 이렇게 여유롭게 진행하는 것이 더 권장하는 방법이지 않을까 생각합니다.
여러분이 보고 있는 예시 코드들은 모두 켄트 백 이 책을 집필하며 몇 번이고 프로젝트를 갈아 엎은 끝에 선별되어 책에 실린 코드들입니다. 저자마저 이렇게 실패하는데 우리라고 실패하지 말란 법은 없겠지요. 충분히 실패하고, 갈아 엎으면서 걱정 없이 진행해보셨으면 좋겠습니다.
저자의 글
저자는 TDD를 한 마디로 "작동하는 깔끔한 코드를 만드는 방법" 으로 정의합니다. 흔히 빨강 - 초록 - 리팩토링이라고 하는 TDD의 순서를 간단히 소개하고, 우리가 왜 이렇게 해야하는지에 대한 내용을 언급합니다.
테스트 주도 개발은 프로그래밍하면서 나타나는 두려움을 관리하는 방법이다.
여기서 말하는 두려움은 프로그램이 너무 복잡해져서 앞으로 어떻게 설계를 해야할지, 혹은 이 프로그램의 결과가 어떻게 될지 알 수 없는데에서 오는 두려움을 말합니다. 저자는 테스트 주도 개발을 통해 이러한 복잡성을 눈에 보이는 도구(테스트)를 통해 관리하고, 두려움을 이겨낼 수 있다고 말합니다.
- 테스트를 하게되면 코드의 결함률을 낮출 수 있다.
- 예외 상황의 숫자를 줄이면, 사용자(고객)의 의견을 짧은 주기로 반영할 수 있다.
- 엔지니어들끼리의 협력과 소통이 더 긴밀해지고 쉬워진다.
이러한 효과들을 누리기 위해 앞으로 우리는 두 가지 예제를 통해 TDD를 연습할겁니다. 하나는 통화(currency)를 다루는 Money 예제이고, 다른 하나는 테스트 프레임워크를 만드는 xUnit 예제입니다.
테스트 환경 세팅
두 예시들은 각각 자바와 파이썬으로 진행되기 때문에, 제가 보기 편하고 익숙한 자바스크립트 코드로 수정하여 직접 타이핑해보는 실습을 병행하겠습니다. 본격적인 TDD에 들어가기 앞서, 테스트 환경을 간단히 구성하겠습니다.
패키지 매니저로는 npm, 테스트 라이브러리로는 jest. 이렇게 두 가지 스택을 이용하겠습니다.
먼저 npm init 명령어를 통해 프로젝트를 생성해줍니다.
다음으로는 jest 설정을 진행하겠습니다.
간단히 CLI를 이용하기 위해 전역 설치를 진행했습니다.
$ npm install jest --global
jest가 설치되었다면, init 명령어를 통해 설정 파일을 생성하겠습니다.
$ jest --init
잘 생성된 모습입니다. 여기서 필요한 옵션이 생기면 차차 수정하도록 하겠습니다.
다음으로는 jest 라이브러리를 프로젝트에 설치해줍니다.
$ npm install --save-dev jest
이제 준비가 끝났습니다. 예시로 테스트 하나를 작성해보겠습니다.
테스트는 __test__ 폴더를 하나 만들어서 작성하겠습니다.
__test__ > example.test.js
잘 실행되는 모습이네요. 이제 TDD로 들어갈 준비가 모두 끝났습니다.
다음 포스팅부터는 책의 예제를 실습해보며 본격적인 TDD를 진행해보도록 하겠습니다. 어려운 내용이지만, 차근차근 진행해보겠습니다.
읽어주셔서 감사합니다.
'기타' 카테고리의 다른 글
U+ 기가와이파이 공유기 IP 오류 해결 (2) | 2023.07.11 |
---|---|
TDD 스터디 #2 - 화폐 예제 (다중 통화 지원하기) (0) | 2023.07.02 |
TDD 스터디 #0 - 스터디에 들어가며 (0) | 2023.06.17 |
git에 파일을 추가할 수 없을때 (fatal: adding files failed) (0) | 2023.02.19 |
Github pages를 이용해 정적 페이지 배포하기 (0) | 2023.02.03 |
댓글