테스트 코드를 몰랐을 때와, 테스트 코드의 중요성을 알고 올바르게 쓰기 시작한 차이는 천양지차였습니다. 기본적인 방법은 이 책으로 배우고, 파이썬에선 어떻게 쓰이는지 스스로 찾아보았습니다. 이번 장에서는 단위 테스트가 시사하는 중요한 사실 몇가지를 살펴봅시다.
TDD는 실제 코드를 작성하기 전 단위 테스트부터 작성하라고 요구하지요. 책에서 제시하는 세 가지 법칙을 살펴봅시다.
말을 풀어보면…
정도가 되겠네요. 이러면 개발과 테스트가 30초 주기로 묶인다구요?? 절대 동의할 수 없습니다ㅠㅠ
이렇게 일하면 테스트코드도 수백수천개가 나오겠지요. 그렇지만 테스트 코드가 짐이되면 어떻게 될 까요?
실제 코드가 진화하면 테스트 코드도 그에 따라 발맞추어야 하며, 지저분한 테스트 코드는 안하느니만 못합니다. 그런데 실제 코드를 변화시킴에 따라 더러운 테스트 코드를 바꾸기는 쉽지 않지요. 이 때 악순환이 발생합니다.
테스트 코드 또한 실제 코드 만큼이나 중요합니다.
테스트 코드도 유지하지 않으면 망가집니다. 이게 없으면 실제 코드를 유연하게 만들 버팀목이 사라지는 셈입니다. 따라서 실제 코드를 점검하는 Automated unit test suite은 설계와 아키텍처를 깨끗하게 보존하는 열쇠입니다. 이게 있어야 코드를 바꾸기 쉽습니다.
즉 테스트 코드를 지저분하게 두지 말고 깔끔하게 만들어야 합니다. 그렇다면 깨끗한 테스트코드는 어떻게 만들까요?
세 가지가 필요합니다.
테스트 코드 또한 명료하고, 단순하고, 표현력이 좋은 코드여야 합니다.
AAA(Arrange-Assert-Act) 형식1으로 테스트코드를 세 부분으로 나누는 것이 권장됩니다. 정말 필요한 것들만 명료하게 제공합니다. 잡다하고 세세한 코드는 숨깁니다.
도메인을 표현하기 위해 감싼 나만의 함수와 유틸리티로 로직을 바로 테스트하면 테스트가 정말 간결해지겠지요. 이런 API는 테스트 코드를 위한 특수한 API가 되지요.
테스트 코드는 가능하면 짧게, 필요하다면 “그릇된 정보를 피하라” 라고 말했던 부분을 어길 수도 있습니다. 그렇지만 테스트를 빠르게 이해하기에는 더할나위없이 쉽지요. 실제환경에서는 신경써야할 메모리, CPU 효율도 테스트 코드 작성에는 무시될 수도 있습니다.
assert
하나이는 JUnit
의 전통 중 하나라고 합니다. 결론이 하나니까 직관적입니다. 그런데 유사 개념을 테스트할 때의 코드 중복은 어떻게 처리할까요?
코드가 복잡해지면 TEMPLATE METHOD 패턴을 적용해봄직 합니다만, 처음부터 그럴 필요는 없을 것입니다(저라도 assert
를 중복해서 쓰겠어요).
이는 지향해야 할 태도입니다. 그런데 assert
를 하나만 두기엔 너무 원론적입니다. 따라서…
한 개념을 테스트하기 위한 assert
는 같이 담을 수 있겠으나, 여러 개념이 테스트 메소드 안에 들어가지 않도록 하는 편이 좋겠습니다.
저자는 이런 이름을 붙여서 아래 규칙을 따르기를 말합니다.
테스트 코드는 중요합니다. 실제 코드만큼이나 중요하니, 이를 잘 관리해야합니다. 깨끗하게 관리하기 위해 가독성과 테스트 코드의 표준을 둡시다. 그리고 도메인을 잘 표현하는 별도 로직을 작성해서 짧고 핵심만 말하는 코드를 짜봅시다.
FitNesse
프로젝트에선 BUILD-OPERATE-CHECK 패턴이라고 부릅니다. 이렇게 부르는 이유는, 저자의 프로젝트에선 빌드하고 작동시킨 후 체크하기 때문이지요.↩