일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 운영체제
- OS
- REACT
- 컴퓨터공학
- Zerobase
- Operating System
- 글또
- 알고리즘
- 자바스크립트
- useState
- codestates
- java
- 개발공부
- node.js
- execution context
- 자료구조
- context switching
- react 기초
- 파이썬 알고리즘 인터뷰
- python algorithm
- 비동기
- typeScript
- JavaScript
- Python
- 코드스테이츠
- algorithm
- 프로그래머스
- Computer Science
- 파이썬
- 자바
- Today
- Total
Back to the Basics
[리뷰 - 단위 테스트의 기술] - 단위 테스트 제대로 알기! 본문
개인적으로 요즘 테스트, 특히 단위 테스트에 대해 관심이 생기고 있었다.
단위 테스트를 어떻게 잘, 효율적으로 작성할 수 있을까? 유의미한 단위 테스트는 어떻게 작성하는 것이 좋을까? 하는 고민을 했었고
[TEST]테스트 원칙에 대하여 - 소프트웨어 테스트의 7원칙과 FIRST원칙 이라던가 [TEST]테스트 코드를 어떻게 시작하면 좋을까
와 같은 글도 작성하면서 조금씩 공부를 하고 있다.
이런 와중에 "[길벗출판사] 26차 개발자 리뷰어"를 모집한다는 광고를 보았는데, 그중에 "단위 테스트의 기술"이라는 책이 눈에 들어왔다. 저번에 신청했을 때는 선정이 안되었었기 때문에 큰 기대 없이 신청서 작성을 하였다. 그런데 운 좋게도 이번엔 당첨이 되었다.
책은 이틀 뒤에 받았고, 긴 연휴 동안 천천히 읽었고, 쉬는 목적으로 갔던 해외여행 일정에서도 틈틈이 읽었다.
사실 이런 기술서적은 코드를 직접 쳐보거나 책에서 알려주는 참고 자료들도 찾아보면서 읽는 편이라 책을 조금 느리게 읽는 편이다. 이번엔 기간이 정해져 있어서 원래 읽던 대로 읽지는 못해서 한 번 더 천천히 읽어볼 예정이다.
서론을 여기까지 하고 책에 대한 리뷰를 해보겠다.
목차는 아래와 같다
[목차]
1. 이 책에 대하여
2. 느낀점
3. 마치여
이 책에 대하여
이 책은 로이 오셔로브와 블라디미르 코리코프가 쓴 단위 테스트에 관한 책이다. TDD가 아닌 "단위 테스트" 자체에 초점을 맞추고 있으며, 테스트 작성법부터 시작해 신뢰성 있고 유지보수가 쉬운 테스트 작성 방법, 단위 테스트 도입 노하우, 레거시 코드에 단위테스트를 도입하는 방법 등 실용적인 가이드를 제공한다.
초판은 C#으로 예제가 작성되었는데, 이번 3판에서는 JavaScript와 TypeScript로 바뀌었다. JS의 동적 타입과 TS의 정적 타입 예시를 모두 보여주는데, 대부분의 테스트 관련 서적이 Java 기반인 것에 비해 내가 주로 쓰는 언어로 되어있어서 반가웠다. 물론 이런 기술 서적의 개념들은 특정 언어에 국한되지 않아서 어떤 언어든 적용할 수 있다..!
책은 총 4부로 구성되어 있고, 각 부분은 다음과 같은 내용을 다룬다:
1부: 단위 테스트의 기본기
1장에서는 테스트 단위의 정의, 시작점과 종료점 구분, 단위/통합 테스트의 차이, TDD와의 관계 등을 다룬다. 2장에서는 Jest를 사용한 테스트 작성법, AAA 패턴, 테스트 이름 짓기와 USE 전략, 테스트 구조화 방법 등을 소개한다.
2부: 실전 테스트 작성과 리팩터링
3장은 의존성 종류에 따라 목과 스텁을 어떻게 다르게 사용하는지 다룬다. 특히 스텁을 활용해 내부로 들어오는 의존성을 분리하는 방법과 리팩터링 기술을 집중적으로 다룬다. 순수 함수 스타일과 객체지향형 스타일로 각각의 접근법을 보여주어 개발자의 이해를 돕는다.
4장에서는 반대로 목을 사용해 외부로 나가는 의존성을 분리하는 방법을 소개한다. 목과 스텁의 차이점을 명확히 설명하고, 다시 순수함수 스타일과 객체지향 스타일로 다양한 예시를 통해 개념을 설명한다.
3, 4장에서 수동으로 목과 스텁을 만드는 방식은 중복 코드와 복잡성 문제를 야기할 수 있다. 이를 해결하기 위해 5장에서는 격리 프레임워크를 사용하는 방법을 소개한다.
6장은 비동기 코드에 대한 테스트 기법을 다루며, 실무에서 자주 마주치는 비동기 로직의 테스트 방법을 제시한다.
3부: 신뢰할 수 있는 테스트, 테스트의 유지보수성에 대한 모범 사레들
1, 2부에서 단위 테스트의 기본기와 핵심 기술을 배웠다면, 3부는 테스트의 품질을 높이는 방법론을 제시한다.
7장은 신뢰할 수 있는 테스트에 대해 깊이 파고든다. 잘못된 테스트, 신뢰성 없는 테스트의 패턴과 문제점을 살펴본다. 7장은 나 자신이 지금까지 작성했던 테스트들을 돌아보게 만드는 내용이었다.
8장에서는 테스트의 유지보수성을 높이기 위한 다양한 기술과 접근법을 소개한다.
개인적으로 7, 8장이 가장 중요하다고 생각한다. 이전 회사 경험을 되돌아보면, 유지보수의 어려움 때문에 방치된 수많은 실패한 테스트들이 떠오른다. 지금 와서 생각해보면, 그때 작성했던 테스트들이 정말 신뢰할 수 있는 것들이었는지, 혹시 그저 형식적으로 의무감에서 작성한 것은 아니었는지 의문이 든다.
4부: 실무에 단위 테스트를 도입하는 여러 방법
4부는 실무에서 실제로 마주할 수 있는 문제들을 다룬다. 현실적인 이야기들이 담겨 있어 충분히 공감하며 상상할 수 있었다.
9장에서는 테스트 코드의 가독성을 다룬다. 이름 짓기는 항상 중요하고 어려운 작업이지만, 테스트에서는 그 중요성이 더욱 크게 느껴진다. 무엇을, 어떻게, 왜 테스트하는지 명확히 알 수 있도록 작성한다면 테스트 코드 자체가 훌륭한 문서화 도구가 될 수 있다.
10장은 효과적인 테스트 전략 수립 방법을 다룬다.
11장에서는 조직 내 단위 테스트 도입 과정에서 발생할 수 있는 현실적인 문제들과 초기 도입 시 겪는 어려움들을 구체적으로 다룬다.
12장은 테스트 코드가 전혀 없는 레거시 코드에 테스트를 도입하는 방법을 소개한다. 단위테스트가 없는 기존 코드에 테스트를 적용해야 한다면 11, 12장이 큰 도움이 될 것이다. 세부 상황에 대한 더 자세한 예시가 있었으면 좋겠지만, 그래도 접근 방식에 대한 가이드로는 충분하다고 생각한다.
느낀 점
이 책을 읽으면서 지금까지의 내 테스트 방식의 실수들을 깨달았다. 특히 목과 스텁을 명확히 구분하지 않고 무분별하게 사용했던 점, 하나의 테스트에 여러 검증을 넣었던 점, 의존성 해결을 위해 불필요하게 복잡한 목 객체를 만들었던 경험들이 떠올랐다.
책을 통해 그동안 잘못된 방법으로 테스트를 해왔음을 인정하게 되었다. 앞으로 이 책을 다시 정리하며 읽으면서 모범 사례들을 꼼꼼히 정리해볼 생각이다.
특히 8장의 유지보수성 부분에서 가장 인상 깊은 문장이 있었다. "테스트가 장기적으로 가치가 있으려면 정말로 비즈니스에서 중요하게 생각하는 부분에서만 납득 가능한 이유로 실패해야 한다"는 문장이다.
테스트의 실패는 프로덕션 코드의 실제 버그를 발견하는 "실제 실패"여야 한다. 그 외의 이유로 발생하는 테스트 실패는 모두 "거짓 실패"다. 테스트 유지보수성의 중요성을 뼈저리게 느끼고 있는데, 과거 유지보수 힘든 테스트코드 때문에 결국 테스트코드를 포기했던 개발 문화를 떠올리게 한다.
테스트 코드를 잘 작성하는 방법에 대한 갈망이 있었는데, 이 책이 그 가이드가 될 것 같다. 책에서 언급한 다양한 테스트 관련 도서들도 시간 날 때 읽어보고 싶다. 특히 마이클 C. 페더스의 "레거시 코드 활용 전략"이 읽고 싶지만, 아직 읽을 책들이 산더미라 언제 읽을지는 미지수다.
마치며
평소에 관심 있던 주제에 대한 책이라 흥미진진해하며 읽었다.
한 번 읽기엔 아쉬워서 두고두고 생각날 때마다 가이드처럼 읽어도 좋을 것 같다.
'Books & Reviews' 카테고리의 다른 글
[코드트리 한 달 사용기] 체계적이고 기본에 충실한 코테준비 (1) | 2025.02.03 |
---|---|
[REFACTORING - 2] CH01 정리 및 리뷰 (0) | 2025.01.19 |
데이터 중심 애플리케이션 설계 - 3장 저장소와 검색 (0) | 2023.05.02 |