코딩하는 털보

클린 코드, 9. 단위 테스트 본문

Book/클린 코드

클린 코드, 9. 단위 테스트

이정인 2021. 8. 25. 13:29

클린 코드, 9. 단위 테스트

애자일과 TDD 덕택에 단위 테스트를 자동화하는 프로그래머들이 많아졌으며 점점 더 늘어나는 추세다. 하지만 테스트를 추가하려고 급하게 서두르는 와중에 많은 프로그래머들이 제대로 된 테스트 케이스를 작성해야 한다는 중요한 사실을 놓치고있다.

  • TDD 법칙 세 가지

    • 첫째 법칙 : 실패하는 단위 테스트를 작성할 때까지 실제 코드를 작성하지 않는다.
    • 둘째 법칙 : 컴파일은 잘 돼면서 실행이 실패하는 정도로만 단위 테스트를 작성한다.
    • 셋째 법칙 : 현재 실패하는 테스트를 통과할 정도로만 실제 코드를 작성한다.

    이렇게 일하면 실제 코드를 사실상 전부 테스트하는 많은 테스트 케이스가 나온다. 하지만 실제 코드와 맞먹을 정도로 방대한 테스트 코드는 심각한 관리문제를 유발하기도 한다.

  • 깨끗한 테스트 코드 유지하기
    테스트 코드는 실제 코드 못지 않게 중요하다. 실제 코드 못지 않게 깨끗하게 짜야 한다.
    테스트는 유연성, 유지보수성, 재사용성을 제공한다. 특히 테스트 케이스가 깨끗하고 커버리지가 높을수록 그렇다.

  • 깨끗한 테스트 코드
    깨끗한 테스트 코드 = 가독성이 좋은 테스트 코드, 테스트 코드는 최소의 표현으로 많은 것을 나타내야 한다.

    • BUILD-OPERATE-CHECK 패턴 : 테스트 자료를 만들고 조작하고 결과를 확인하는 세 부분으로 테스트 코드 나누어 가독성을 높여준다.
    • DSL : 도메인에 특화된 언어. 테스트 코드 작성 시 잡다하고 세세한 테스트 구현 코드를 숨기는 DSL을 만들어 테스트 코드 가독성을 향상 시킬 수 있다.
  • 테스트 당 assert 하나
    테스트 케이스 메서드마다 assert 문을 단 하나만 사용하면 결론이 하나라서 가독성이 좋아진다.
    여러 aseert 문을 하나로 병합하기 불합리하다면 여러개의 테스트로 나눈다. 하지만 테스트를 분리하면 중복은 많아진다.

    • TEMPLATE METHOD 패턴 : 어떤 작업을 처리하는 일부분을 서브 클래스로 캡슐화해 전체 일을 수행하는 구조는 바꾸지 않으면서 특정 단계에서 수행하는 내역을 바꾸는 패턴, 전체적으로는 동일하면서 부분적으로는 다른 구문으로 구성된 메서드의 코드 중복을 최소화 할 때 유용하다.
      given-when-then 에서 given/when 부분을 부모 클래스에 두고 then 부분을 자식 클래스에 두면 된다.
    • 또는 새로운 테스트 클래스에서 given/when 부분을 @Before에 두고 then 부분을 @Test에 두면 된다.
    • 두 방법 모두 가능은 하지만 배보다 배꼽이 더 큰 느낌이 있다. 테스트 당 assert 문을 하나로 강제하기 보다는 assert 문 개수를 최대한 줄이려고 노력하자.
    • 결과적으로 하나의 테스트 메서드는 하나의 개념만 테스트하고 하나의 개념 당 assert 문 수를 최소로 줄여야 한다.
  • FIRST

    • Fast : 테스트는 자주 돌릴 수 있을 정도로 빨라야 한다.
    • Independent : 각 테스트는 서로 의존해서는 안된다.
    • Repeatable : 테스트는 어떤 환경에서도 반복 가능해야 한다.
    • Self-Validating : 테스트가 스스로 성공과 실패를 가늠하여 결과를 내야한다. 다른 수작업이 없어야 한다.
    • Timely : 테스트는 적시에 작성해야 한다. 단위 테스트는 실제 코드를 구현하기 직전에 구현한다.
Comments