단위 테스트

  • 테스트 코드는 실제 코드만큼이나 프로젝트 건강에 중요하다. 어쩌면 실제 코드보다 더 중요할지도 모르겠다. 테스트 코드는 실제 코드의 유연성, 유지보수성, 재사용성을 보존하고 강화하기 때문이다. … 표현력을 높이고 간결하게 정리하자. 테스트 API를 구현해 도메인 특화 언어를 만들자. …
    테스트 코드가 방치되어 망가지면 실제 코드도 망가진다. 테스트 코드를 깨끗하게 유지하자.
  • 테스트 코드를 막 짠게되었을때 결과 -> 테스트 코드의 유지 보수가 어려워 진다 -> 실패 케이스가 늘어 난다 -> 불만과 핑계, 비난 -> 테스트 슈트를 폐기기해야하는 상황에 처한다 -> 테스트 슈트 폐기 -> 코드를 수정해도 안정하다는 검증을 하지 못한다 -> 결함률 증가 -> 코드를 변경이 득보다 해가 크다고 생각한다 -> 코드를 정리하지 않는다 -> 코드가 망가지기 시작 -> 테스트 슈트도 없고, 얼기설기 뒤섞인 코드에, 좌절한 고객과, 테스트에 쏟은 노력에 대한 실망감만 남는다

1. 깨끗한 테스트 코드 유지하기

  • 테스트 코드는 실제 코드 못지 않게 중요함
  • 테스트는 유연성, 유지보수성, 재사용성을 제공함
    • 모든 변경이 잠정적 버그인 상황에서 테스크 케이스가 있으면 믿는 구석이 생심
    • 실제 코드를 점검하는 자동화된 단위 테스트 슈트는 설계와 아키텍처를 최대한 깨끗하게 보존하는 열쇠

2. 깨끗한 테스트 코드

  • 가독성: 명료성, 단순성, 풍부한 표현력
  • 최소한의 표현으로 많은 것을 나타내야 함
  • 본론에서 진짜 필요한 자료 유형과 함수만 사용
    1. 테스트 자료를 만듬
    2. 테스트 자료를 조작
    3. 조작한 결과가 올바른지 확인
  • 도메인에 특화된 테스트 언어
    • 시스템 조작 API 위에다 함수와 유틸리티를 구현한 후 그 함수와 유틸리티를 사용함
    • 테스트 코드를 짜거나 읽기 쉽게 됨
  • 이중 표준
    • 메모리나 CPU 효율과 관련있는 경우
    • 실제 코드만큼 효율적일 필요는 없음
    • 테스트 코드에 적용하는 표준과 실제 표준이 다름

3. 테스트 당 assert 하나

  • 테스트가 중복 될 경우 before 또는 class를 사용하여 중복된 테스트를 빼줌
  • assert문은 최대한 줄이는게 좋음
  • 테스트 당 개념 하나

4. F.I.R.S.T.

  1. Fast: 테스트는 빨라야 한다.
  2. Independent: 각 테스트는 서로 의존하면 안된다.
  3. Repeatable: 어떤 환경에서도 재사용이 가능해야 한다.
  4. Self-validating: Boolean값으로 결과를 내야한다.
  5. Timely: 적시에 작성한다.