9장 단위 테스트
#
시작하기단위 테스트가 중요하다는 사실은 귀가 닳도록 들었따!
그럼 단위 테스트가 왜 필요하고, 제대로 된 테스트 케이스는 어떻게 만드는 것인가!
#
TDD 법칙 세가지- 실패하는 단위 테스트를 작성할 때까지 실제 코드를 작성하지 않는다.
- 컴파일은 실패하지 않으면서 실행이 실패하는 정도로만 단위 테스트를 작성한다.
- 현재 실패하는 테스트를 통과하는 정도로만 실제 코드를 작성한다.
- 이렇게만 하면 사실상 모든 코드를 테스트하는 테스트 케이스가 나온다.
- 하지만 실제 코드와 맞먹을 정도로 방대한 테스트 코드는 심각한 관리 문제를 유발한다.
#
깨끗한 테스트 코드 유지하기테스트 코드? 누가 알아줌? 지저분해도 빨리!
- 지저분한 테스트 코드는 오히려 없는게 낫다!
- 지저분한 테스트 코드 → 테스트 케이스를 추가시간 UP → 배보다 배꼽
- 테스트에 쏟은 노력이 허사가 되지 않기 위해선 깨끗한 단위테스트를 작성해야한다.
#
테스트는 유연성, 유지보수성, 재사용성을 제공한다- 아무리 설계를 잘해놨어도, 테스트 코드가 없으면 개발자는 변경을 주저한다.(나..너무 무서워~~)
- 자동화된 단위 테스트 슈트는 설계와 아키텍쳐를 최대한 깨끗하게 보존하는 열쇠다.
- 깨끗한 테스트가 있으면 처음에는 부실한 구조여도 마음껏 개선할 수 있다.
#
깨끗한 테스트 코드가독성, 가독성, 가독성
- 지금까지 클린코드에서 제시한 것과 다르지않다.(명료성, 단순성, 풍부한 표현력)
- Testcode Best Practice (feat: BUILD-OPERATE-CHECK 패턴)
function test_function() { # BUILD - 테스트 자료 만들기 # OPERATE - 테스트 자료 조작, 테스트할 함수 실행 # CHECK - 조작한 결과가 올바른지 확인}
- 중요한건 코드를 읽는 사람이 코드가 수행하는 기능을 재빨리 이해해야 한다.
#
도메인에 특화된 테스트 언어- 기술적인 용어 보다는 비즈니스 용어를 사용하여 별도 테스트 API를 만들자.
- crawler.addPage (읽는 사람: crwaler가 뭐지 알아야하나?)
- makePage(읽는 사람: 아 테스트 전에 페이지를 구성하는 부분이구나)
#
이중 표준- 테스트 코드에서 만큼은 그동안 공부한 클린코드 규칙을 위반해도 된다고?
- 이부분은 자원과 메모리가 한정적인 임베디드 시스템 기준의 내용이므로 패쓰
- 그만큼 규칙을 위반해서라도 가독성이 좋아질 수 있다면 그렇게 하라는 정도로 이해
#
테스트당 assert 하나개념 당 assert문 수를 최소로 줄여라.
- 확실히 assert가 '하나'이면 테스트가 무엇을 확인하려는지 이해하기 쉽다.
- 한 테스트에서 assert를 여러개 확인할 수 있음에도 억지로 분리하면?
- 중복되는 코드가 많아진다.
- 물론
TEMPLATE MOTHOD 패턴
을 이용하여 중복을 해결할 수 있다. - 하지만 역시나 배보다 배꼽
- 개발 편하게 하려고 테스트 짜는데, 테스트 짜다가 힘 다뺀다? no good~
#
테스트당 개념 하나테스트 함수마다 한 개념만 테스트하라.
#
F.I.R.S.T~때문에 테스트를 못했다는 핑계를 만들 수 없는 환경을 만들어야한다.
- Fast(빠르게)
- 테스트가 빠르지 않으면 자주 돌릴 엄두를 못낸다.
- 아니 개발 빨리하려고 테스트 넣었는데 테스트가 느려서 복창이 터진다? no good~
- Independent(독립적으로)
- 각 테스트는 서로 의존하면 안된다.
- 회원가입 테스트 완료한 데이터를 가지고 회원탈퇴 테스트하도록 작성했다면?
- 회원가입 테스트가 실패하면 회원탈퇴 테스트도 실패 no good~
- Repeatable(반복가능하게)
- 실제 환경, QA 환경, 인터넷이 없는 환경에서도 실행할 수 있어야한다.
- Self-Validationg(자가검증하는)
- 테스트는 성공/실패 (bool)로 결과를 내야한다.
- 테스트를 하고 두개의 파일을 직접 눈으로 비교해야한다면 판단이 주관적이된다.
- Timely(적시에)
- 단위 테스트는 테스트하려는 싱제 코드를 구현하기 직전에 구현한다.
- 실제코드를 작성하고 테스트를 작성하려고 하면 테스트하기 어려울 수가 있다.
#
결론- 테스트 코드는 실제 코드 만큼이나 프로젝트 건강에 중요하다.
- 테스트 코드는 실제 코드의 유연성, 유지보수성, 재사용성을 보존하고 강화하기 때문이다.
- 테스트 코드가 망가지면 실제 코드도 망가진다.
- 테스트 API를 구현해 도메인 특화 언어(Domain Specific Language)를 만들자.