클린 코드[Clean Code] TIL #9. 8장. 경계 ~ 9장. 단위 테스트

​DAY 9 - 22/05/07
오늘 읽은 범위 : 8장 경계, 9장 단위 테스트

책에서 기억하고 싶은 내용

8장. 경계

  • 외부 코드 사용하기( p. 144 )
    • 패키지 제공자나, 프레임 워크 제공자는 적용성을 최대한 넓히려 애쓴다.
    • 사용자는 자신의 요구에 집중하는 인터페이스를 바란다.
  • 경계 살피고 익히기( p. 147 )
    • 우리 쪽 코드를 작성해 외부 코드를 호출하는 대신, 먼저 간단한 테스트 케이스를 작성해 외부 코드를 익히면 어떨까?
    • 짐 뉴커크는 이를 학습 테스트라 부른다.

9장. 단위 테스트

  • TDD 법칙 세 가지( p. 155 )
    • 첫째 : 실패하는 단위 테스트를 작성할 때까지 실제 코드를 작성하지 않는다.
    • 둘째 : 컴파일은 실패하지 않으면서, 실행이 실패하는 정도로만 단위 테스트를 작성한다.
    • 셋째 : 현재 실패하는 테스트를 통과할 정도로만 실제 코드를 작성한다.
    • 실제 코드와 맞먹을 정도의 방대한 테스트 코드는 심각한 관리 문제를 유발하기도 한다.
  • 깨끗한 테스트 코드 유지하기
    • 테스트는 유연성, 유지 보수성, 재사용성을 제공한다.( p. 157 )
    • 코드에 유연성, 유지 보수성, 재사용성을 제공하는 버팀목이 바로 단위 테스트다.
  • 이중 표준
    • 테스트 API 코드에 적용하는 표준은 실제 코드에 적용하는 표준과 확실히 다르다.
    • 코드의 깨끗함과는 철저히 무관하다.
  • 깨끗한 테스트 코드가 따라야하는 규칙 : FIRST
    • 빠르게(Fast) : 테스트는 빨라야 한다.
    • 독립적으로(Independent) : 각 테스트는 서로 의존하면 안된다.
    • 반복 가능하게(Repeatable) : 테스트는 어떤 환경에서도 반복이 가능해야 한다.
    • 자가 검증하는(Self-Validating) : 테스트는 bool 값으로, 어떤 결과를 꼭 내야한다. 테스트 스스로가 성공과 실패를 가늠하지 않는다면, 판단은 주관적이 되며 지루한 수작업 평가가 필요하게 된다.
    • 적시에(Timely) : 테스트는 적시에 작성해야한다. 단위 테스트는 실제 코드를 구현하기 직전에 구현한다.

오늘 읽은 소감? 떠오르는 생각

외부 API를 코드의 많은 변경 없이 작성할 수 있는 방법을 제공해줘서 많은 도움이 되었다.

경계를 Wrapper 클래스로 묶고, 9장에서 말하고 있는 테스트 코드를 통해서 코드를 작성한다면 외부 API의 변경에 대해서 빠르게 문제점에 대응할 수 있지 않을까 라는 생각이 들었다.

 

회사에서도 항상 테스트 코드와 커버리지에 대한 중요성을 항상 언급하셨었다.

어떤 팀은 테스트 코드를 작성하지 않은 코드는 아예 코드 리뷰를 하지 않는 팀도 있었다. 그만큼 테스트를 통해 에러가 적고 품질이 좋은 코드를 사전에 만들으려는 노력이 반영된 프로세스가 아닐까 생각이 들었다.

 

좋은 테스트 코드를 작성하는 법에 대해서도 깊게 생각해본 적이 없었던 것 같다. 오히려 내가 예상했던 로직이 제대로 동작하느냐, 제대로 동작하지 않느냐를 판단하게끔 하는데 급급했던 것 같다. 많은 반성이 되었다.

지금 내가 작성해놓은 테스트 코드를 남이 봤을 때 한눈에 알아볼 수 있을까? 그렇지는 않을 것 같다.

그래도 나름 9장에서 말하고 있는 메서드 당 assert는 하나여야 한다거나, 빠르게 동작해야 한다거나 등의 원칙은 나름 지켜지고 있는 것 같아서 위안이 되었다.

현재 작성한 테스트 코드도 더 간단하고, 읽기 쉽게끔 변경해봐야겠다.


궁금하거나, 잘 이해되지 않는 내용
"학습 테스트"
  • API, 라이브러리, 프레임워크가 어떻게 동작하는 지 검증하기 위한 테스트
  • 기능 검증을 위한 테스트가 아님
"어댑터(adapter 패턴)"
  • 한 클래스의 인터페이스를 클라이언트에서 사용하고자 하는 다른 인터페이스로 변환
  • 인터페이스 호환성 문제 떄문에 같이 쓸 수 없는 클래스들을 연결해서 사용이 가능하다.

"Build-Operate-Check 패턴"

다음과 같은 순서대로 테스트 코드를 작성하는 패턴이다.

  • 1. 테스트 자료를 생성한다.
  • 2. 테스트 자료를 조작한다.
  • 3. 조작한 결과가 올바른지 확인한다.

"Template Method 패턴"

  • 어떤 작업을 처리하는 일부분을 서브 클래스로 캡슐화하여 전체 일을 수행하는 구조는 바꾸지 않으면서, 특정 단계에서 수행하는 내역을 바꾸는 패턴
  • 전체적으로는 동일하나, 부분적으로 다른 기능을 수행하는 메서드를 구현할 때 용이하다.