TDD 법칙 3가지

  • 첫째 법칙

    • 실패하는 단위 테스트를 작성할 때 까지 실제 코드를 작성하지 않는다.
  • 둘째 법칙

    • 컴파일은 실패하지 않으면서 실행이 실패하는 정도로만 단위테스트를 작성한다.
  • 셋째 법칙

    • 현재 실패하는 테스트를 통과할 정도로만 실제 코드를 작성한다.
  • 실제코드와 맞먹을 정도로 방대한 테스트코드는 심각한 관리문제를 유발하기도 한다.

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

    • 지저분한 테스트코드는 차라리 안하니만 못하다.

    • 코드가 진화하면 테스트코드도 맞춰서 진화해야한다.

    • 코드만진화하고 안바꾸면 나중에 엄청난 부채로 돌아온다

    • 테스트 코드는 실제 코드 못지않게 중요하다

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

      • 코드에 유연성 , 유지보수성, 재사용성을 제공하는것은 바로 단위테스트
      • 테스트코드가 지저분하면 코드를 변경하는 능력이 떨어지며
      • 테스트 코드가 지저분할수록 실제코드도 지저분해진다.
      • 실제 코드도 망가지고 테스트코드도 잃어버린다.
  • 깨끗한 테스트 코드

    • 깨끗한 코드를 만들기 위해선 3가지가 필요하다

    • 가독성 , 가독성 , 가독성

    • ( 가독성 개 중요 )

    • 테스트 코드에 가독성을 높이려면 ?

      • 명료성, 단순성, 풍부한 표현력이 필요하다.
      • 테스트 코드는 최소한의 표현으로 많은것을 나타내야 한다.
    • build operate check 패턴

      • 웬지 given when then 느낌나는 패턴임
  • 도메인에 특화된 언어

    • 테스트에 특화된 API를 따로 만들어라.
  • 이중 표준

    • 테스트 API코드에 적용하는 표준은 실제 코드에 적용하는 표준과 확실히 다르다.
    • 단순하고 간결하고 표현력이 풍부해야 하지만, 실제 코드만큼 효율적일 필요는 없다.
    • 실제 환경에서는 절대로 안되지만 테스트 환경에서는 전혀 문제없는 방식이 있다.
    • 대개 메모리나 CPU 효율과 관련 있는 경우다.
    • 코드의 깨끗함과는 철저히 무관하다
  • 테스트당 assert 하나

    • JUNIT으로 테스트 코드를 짤 때는 함수마다 assert문을 단 하나만 사용해야 한다고 주장한 학파가 있다.

    • 장점은 있다.

    • assert문이 하나인 함수는 결론이 하나라서 코드를 이해하기 쉽고 빠르다.

    • 만약 어거지로 합쳐서 하나로 만드는 경우가 있다면 차라리 두개로 나눠라

    • 이럴때 중복되는 부분이 있는데 이런것은 템플릿 메소드 패턴을 사용하면

    • 중복을 제거할수 있다.

    • given when 부분을 부모 클래스에 두고 then 부분을 자식클래스에 두면 된다.

    • 아니면 완전히 독자적인 테스트 캘르스를 만들어 @Before 함수에 given when 부분을 넣고 @Test함수에 then부분을 넣어도 된다.

    • 하지만 모두가 배보다 배꼽이 더 크다.

    • 이것저것 감안해보면 결국 assert문을 여럿 사용하는 편이 좋다고 생각한다.

    • 결국 assert문이 여러개 써서 깔끔해진다면 여러개써라

    • 단지 assert문 개수는 최대한 줄여야 좋다는 생각이다.

    • ( 왜냐 이해하기가 쉬워지니까 )

  • 테스트당 개념 하나

    • 테스트 함수마다 한 개념만 테스트하라
    • 가장 좋은 규칙은
    • 개념당 assert문 수를 최소로 줄여라 와 테스트 함수 하나는 개념 하나만 테스트하라
  • F.I.R.S.T

    • 깨끗한 테스트는 다음 다섯가지 규칙을 가진다.
      • 빠르게

        • 테스트는 빨라야한다. 느리면 자주 돌릴 엄두를 못낸다.
        • 자주 돌리지 않으면 초반에 문제를 찾아내 고치지 못한다.
        • 코드를 마음껏 정리하지도 못한다.
      • 독립적으로

        • 각 테스트는 서로 의존하면 안된다.
        • 한 테스트가 다음 테스트가 실행될 환경을 준비해서는 안된다.
        • 테스트가 서로에게 의존하게 되면 하나가 실패할때 나머지도 잇달아 실패하므로 원인을 진단하기 어렵다.
      • 반복가능하게

        • 어떤 환경에서도 테스트는 반복가능해야한다.
        • 그렇지 않으면 환경이 지원되지 않기에 테스트를 수행하지 못하는 상황이 직면한다.
      • 자가검증하는

        • 테스트는 bool 값으로 결과를 내야한다.
        • 성공 아니면 실패다.
        • 통과여부를 알려고 로그파일을 읽게 만들어서는 안된다.
      • 적시에

        • 테스트는 적시에 작성해야 한다.

        • 단위테스트는 테스트하려는 실제 코드를 구현하기 직전에 구현한다.

        • 실제 코드를 구현한 다음에 테스트 코드를 만들면 실제 코드가 테스트하기 어렵단

        • 사실을 발견할지도 모른다.

        • 테스트가 불가능하도록 실제 코드를 설계할지도 모른다.

        • ( 결국 테스트를 만들기전에 실제 코드를 만들면 테스트가 불가능하게 설계할수도 있는 상황이 올수도 있다는 것인듯..? )

'book > 클린코드' 카테고리의 다른 글

12장 - 창발성  (0) 2021.01.03
10장 - 클래스  (0) 2020.12.22
8장 - 경계  (0) 2020.11.30
7장 - 오류처리  (0) 2020.11.27
6장 - 객체와 자료구조  (0) 2020.11.25

+ Recent posts