테스트를 객체 지향적인 맥락으로 이해하기에 좋은!
smackdown***
|
2014-01-05
Effective Unit Testing : 클린 코드와 좋은 설계를 이끄는 단위 테스트
테스트가 갖춰야 할 요건에 따라 나눈 테스트 카탈로그를 제공한다. 따라서 필요할 때마다 원하는 목록을 참고하여 자신이 작성한 테스트에서 문제를 발견하고 수정해 나갈 수 있으며 더욱 응용력 높은 학습을 할 수 있다.
- 저자 : 라쎄 코스켈라
- 번역 : 이복연
- 출간 : 2013-11-11
“개발자를 위한 단위 테스트”라는 책을 택한 이유는 일단 책의 코드들이 거의 다 JAVA로 쓰여있는 만큼, 자바 프로그래머를 위한 책이라고 생각되어서였다. JUnit 코드 샘플들과 JMock 같은 테스팅 툴들이 이용되었는데, 책이 진작 가치를 지닌 이유는 머리말에 있었다. 저자는 테스트를 작성하는 방법이 언어와 무관하므로 특정 기술에 종속된 조언은 배제를 하겠다고 명시했었고, 결국 책의 내용들은 단위 테스트를 ‘어떻게’ 할까라는 생각보다 ‘왜’ 라는 의문들을 풀어주는데 초점이 맞춰져 있다.
1장에서 저자는 기본적인 소개와 자주 등장하는 이유들을 다시 한번 언급하며 왜 유닛테스트와 자동화가 중요한지를 간단한 역사적인 일화와 함께 설명한다. 버그를 식별하는 것과 디자인을 적용하는 것, 스코프를 잘못 잡아 저지르는 실수와 테스트를 작성하면서 또 배우는 경험들이 그러한 이유들이다.
2장에서는 어떤 것이 좋은 테스트인지에 대해 더 깊게 이야기해본다. 저자가 언급하는 가독성과 유지보수성, 구조화의 여부, 무엇에 대한 검사인지, 안정적인지, 반복 가능한지, 테스트 더블의 활용도라는 좋은 테스트에 대한 기준은 분명 완벽하지 않고 주관적임도 언급한다. 당연히 품질에 영향을 주는 요소들은 매우 많고 상황(context)에 의존하는 경우가 매우 많기 때문이다. 또한 테스트 코드의 품질을 평가하는 기준도 사람마다 다르다. 가치가 있는 기준을 제시한 것도 분명하지만 나는 무엇보다 책에 있는 코드들이 그가 겪은 여러 경험들을 최대한 압축시켜서 쉽게 전달하려고 고민한 티가 나서 좋은거 같다.
3장은 Part 1에서 이야기하던 좋은 테스트에 대한 구체적인 결론이다. 테스트 더블이라는 개념을 설명하는데 대부분을 할애하는데 이는 ‘xUnit Test Patterns : Refactoring Test Code’ 라는 책에서 소개된 개념이다. 왜 테스트 더블을 쓰는지에 대한 5가지 이유를 정리하는데 이는 가장 중요한 이슈중 하나인 테스트 대상 코드의 격리, 그리고 테스트 속도의 개선, 예측 불가능한 실행 요소의 제거, 시뮬레이션, 감춰진 정보로의 쉬운 도달이다. 그리고 테스트 더블이라는 불리는 객체를 4가지 분류하여 설명한다. 간단한 테스트 스텁부터 정교한 Mock 까지를 예시를 들어 장단을 살핀다.
4장에서는 가독성에 대해 이야기를 하는데 저자의 철학이 담긴 듯한 말들이 몇 개 있었다. 테스트 코드에서 어떤 방식으로 의도를 표현할지 결정할 때, 코드 중복이나 성능보다 가독성과 명료성이 더 중요함을 알아두라는 것. 절대 실패할 리가 없는 테스트는 십중팔구 아무것도 검사하지 않은 것이기에 별 가치가 없다는 것이고 당연히 정반대의 경우도 그러하다. 테스트의 도메인에 적용된 ‘단일 책임 원칙’은, 테스트가 실패하는 이유는 오직 하나뿐이어야 한다는 말이다. 이 역시 테스트의 본질이 명료함에 있다는 것이고 이것마저 없어질 경우 쓸모없어진다는 이야기일 것이다.
5장은 유지보수성에 있어서, 6장은 신뢰성에 있어서 테스트 냄새라는 것이 무엇인지 알려주고 이들이 등장했을 때 다루는 방법을 각각 서술한다.
이 책의 핵심인 ‘7장 테스트 가능 설계’에서 저자는 중요한 몇가지 디자인 원칙을 언급한다. 모듈러 설계와 SOLID 설계 원칙(단일 책임 원칙, 개방 폐쇄 원칙, 리스코프 치환 원칙, 인터페이스 분리 원칙, 의존 관계 역전 원칙) 등과 이러한 객체 지향적인 디자인의 원리를 이야기하고, 이들을 적용했을 때 테스트가 더 용이해짐을 설명한다.
8장에서는 자바가 아닌 JVM 기반 언어들의 유닛 테스팅에 대해 이야기를 해서 또다른 흥미를 끈다.
이 책의 강력한 장점은 저자가 집약해놓은 테스팅의 구성과 관련 아이디어들을 하나의 흐름으로 나열하되, 그 흐름을 책을 통해 배우는 사람과 상호작용할 수 있게끔 코드에도 반영한 것이 아닐까 싶다. 즉, 코드를 다루면서 분명히 이 책에 들어있는 추상화된 생각들과 아이디어가 명확히 구체화되는 점이 나에겐 좋았다. 책에서의 화법 역시 좋은 것이, ‘실제’의 경험과 삽질을 계속 가지고 감으로써 읽는 사람에게는 그러한 시간들을 낭비하지 말라는 확실한 동기를 줌으로써 끝까지 열심히 읽게 해주는 것 같다.