Clean Code - 테스트

2 minute read

무슨 일을 하든, 가장 우선이 되어야할 것은 가족이다. 가족.


TDD가 실제 코드를 짜기 전에 단위 테스트부터 짜라고 요구한다는 사실은 매우 중요하다. 아래의 3가지 법칙을 살펴보자.

TDD 법칙 세가지

  • 실패하는 단위 테스트를 작성할 때까지 실제 코드를 작성하지 않는다.
  • 컴파일이 실패하지 않으면서 실행이 실패하는 정도로만 단위 테스트를 작성한다.
  • 현재 실패하는 테스트를 통과할 정도로만 실제 코드를 작성한다.

깨끗한 테스트 코드를 유지하지 못하는 경우

  • 새 버전이 출시될 때 마다 팀이 테스트 케이스를 유지하고 보수하는 비용도 늘어난다.
  • 점차 테스트 코드는 개발자 사이에서 가장 큰 불만으로 자리잡는다.
  • 관리자가 예측 값이 너무 큰 이유를 물어보면 팀은 테스트 코드를 비난한다.
  • 결국 테스트 슈트를 폐기하지 않으면 안 되는 상황에 처한다.
  • 하지만 테스트 슈트가 없으면 개발자는 자신이 주성한 코드가 제대로 도는지 확인할 방법이 없다.
  • 테스트 슈트가 없으면 시스템을 이쪽으로 수정해도 저쪽이 안전하다는 사실을 검증하지 못한다.
  • 그래서 결함율이 높아지기 시작한다. 하지만 의도 하지 않는 결함 수가 많아지면 개발자는 변경을 주저한다.
  • 변경하면 득보다 해가 크다 생각해 더이상 코드를 정리하지 않는다.
  • 그러면서 코드가 망가지기 시작한다.
  • 결국 테스트 슈트도 없고, 얼기 설기 뒤섞인 코드에 , 좌절한 고객과, 테스트에 쏟아 부은 노력이 허사였다는 실망감만 남는다.

깨끗한 테스트 코드

깨끗한 테스트 코드에서는 가독성이 매우 중요하다.
테스트 코드에서의 가독성을 높이려면, 명료성, 단순성, 풍부한 표현력이 필요하다.
테스트 코드는 최소의 표현으로 많은 것을 나타내야 한다.

테스트의 유연성, 유지보수성, 재사용성을 제공한다.

  • 테스트 케이스가 있으면 변경이 두렵지 않다.
  • 테스트 커버리지가 높을 수록 공포는 줄어든다.

TDD의 핵심은 테스트 코드 및 테스트 걸리는 시간이 30초 이내여야 하고, 1차 테스트 코드는 오로지 결과를 위한 값을 반환 처리할 수 있어야 한다.

Simple Code - 중복이 없고, 누가봐도 명확한 코드이다. : Clean Code that works !!

TDD 프로세스

  • Needs를 파악
  • Todo List 정리
  • 상세 처리 항목 정의
  • 테스트 목록 정리 - TDD Start
  • assertEquals(a,b)
  • assertTrue(a)
  • assertFalse(b)
  • JUnit을 이용한 테스트 코드 작성
  • 반복 순환
  • 테스트 코드 작성
  • 실제 코드로의 적용 - 테스트 단계 및 범위 정하기

BUILD - OPERATE - CHECK

  • 테스트 구조
  • 테스트 자료를 만든다
  • 테스트 자료를 조작한다
  • 조작한 결과가 올바른지 확인한다

테스트 코드는 본론에 돌입해 진짜 필요한 자료 유형과 함수만 사용한다.
테스트당 Assert 함수 하나

given : 테스트 할 준비
when : 테스트할 대상 생성
then : 테스트 검증

BDD - TDD라는 말이 너무 추상적이어서 나온 패턴

테스트당 개념하나

테스트 함수보다 한 개념만 테스트 하기

Fast : 빠르게
Indepandent : 독립적으로
Repeatable : 반복가능하게
Self-Validating : 자가 검증하는
Timely : 적시에 - 실제로 구현하기 직전에!

깨끗한 테스트 코드

테스트 코드는 실제 코드 만큼이나 프로젝트 건강에 중요하다. 어쩌면 실제 코드보다 더 중요할지도 모르겠다. 테스트 코드는 실제 코드의 유연성, 유재소성, 재사용성을 보존하고 강화하기 때문이다. 그러므로 테스트 코드는 지속적으로 깨끗하게 관리하자. 표현력을 높이고 간결하게 정리하자. 테스트 API를 구현해 도메인 특화 언어를 만들자.

현실적인 테스트 작성하기

테스트 주도 개발은 반복적인 과정으로, 작은 절차들의 반복적인 수행을 의미한다. 그렇다, 우리는 경험에 근거한 좋은 추측을 하고 싶을 뿐, 정확히 옳아야하는 것은 아니다.

  • 입력과 출력 결정하기
  • 함수 시그니처 선택하기

어떤 데이터가 들어오고 나가는지 알았으니, 우리는 함수 시그니처를 골라야 한다. 즉 함수가 어떤 매개변수들을 취하며, 어떤 결과를 반환하는지 말한다.

  • 기능 상 아주 작은 하나의 관점으로 판단하기
  • 테스트 구현
  • 코드 구현