좋은 단위 테스트

theonde·2022년 10월 21일
post-thumbnail

좋은 단위 테스트의 4대 요소

  1. 회귀 방지

가능한 많은 코드를 실행해야 테스트에서 버그가 드러날 확률이 높아진다.

  1. 리팩토링 내성

    • 테스트가 거짓 양성을 내지 않고 리팩토링을 할 수 있는 정도를 의미한다.

    • 거짓 양성: 실제 기능은 의도한대로 작동하지만 테스트는 실패를 나타낸다. (허위 경보)

      • 원인: SUT와 구현 세부 사항이 많이 결합될수록 허위 경보이 많이 생긴다.

      • 해당 구현 세부 사항에서 테스트를 분리하자.

    • 리팩토링은 애플리케이션의 동작에 영향을 주지 않으면서 구현을 변경하는 것이다. 따라서 변경할때 마다 테스트가 실패하는 것은 테스트가 구현 세부 사항에 결합되어 있기 때문이다.

    • 코드의 내부 작업과 테스트 사이를 가능한 한 멀리 떨어뜨리고 최종 결과를 목표로 한다.

    • "어떻게"보다 "무엇"에 중점을 둬야한다.

  2. 빠른 피드백

    • 테스트가 빠를수록 더 많은 테스트를 수행할 수 있고 더 자주 실행할 수 있다.

    • 버그를 수정하는 비용을 줄일 수 있다.

  3. 유지 보수성

    • 테스트 코드를 이해하기 쉬워야 한다.

    • 테스트 코드 품질은 제품 코드만큼 중요하다.

    • 테스트를 작성할 때 절차를 생략하지 말자, 테스트 코드를 일급 시민으로 취급하자.

이상적인 테스트

  • 위의 좋은 테스트의 4가지 조건중 하나라도 수치가 0이면 그 테스트는 절대 좋은 테스트가 아니다.

  • 좋은 테스트의 조건들 중 3가지(회귀 방지, 리팩토링 내성, 빠른 피드백)조건은 상호 배타적이라 모든 조건이 완벽하게 충족될 순 없다. 즉, 세가지 중 두 가지만 최대화 할 수 있다.

  • 위 세 가지 조건 중 리팩토링 내성은 포기할 수 없다. 따라서 회귀 방지와 빠른 피드백 사이에서 절충이 귀결된다.

  • 리팩토링 내성을 포기할 수 없는 이유는 테스트가 리팩토링 내성이 있거나, 없거나 둘 중 하나이기 때문이다. (중간이 없다는 뜻) 회귀 방지와 빠른 피드백은 조절할 수 있으므로 리팩토링 내성은 포기할 수 없는 것이다.

테스트 스위트를 단단하게 만들려면 테스트의 거짓 양성을 제거하는 것이 최우선 과제다.
(리팩토링 내성이 있는 테스트가 되어야 한다.)

테스트 피라미드

  • 각 층의 너비가 넓을 수록 해당 테스트가 많다는 뜻이다.

  • 층의 높이는 최종 사용자의 동작을 얼마나 유사하게 흉내 내는지 나타내는 척도다.

  • 피라미드 내 테스트 유형에 따라 빠른 피드백과 회귀 방지 사이에서 선택을 한다.

    • 피라미드 상단의 테스트는 회귀 방지를, 피라미드 하단의 테스트는 빠른 피드백(실행 속도)를 선호한다.
  • 모든 테스트의 거짓 양성은 최소화 해야한다.

  • 엔드 투 엔드 테스트가 가장 적은 이유는 실행 속도가 느리고 유지 보수성이 결여되어 있기 때문이다. (필요한 경우에만 사용한다.)

  • 단위 테스트는 알고리즘, 비즈니스 복잡도가 없는 환경에서는 유용하지 않다.

  • 통합 테스트는 코드가 단순하더라도 DB와 같은 하위 시스템들과 통합돼 잘 잘동하는지는 확인해야하기 때문에 단순한 CRUD 작업이라도 중요한 테스트다.

    • 이러한 상황에서는 단위 테스트보다 통합 테스트가 더 많아질 수 있다. (엔드 투 엔드 테스트는 없거나 더 적다.)

블랙박스 테스트, 화이트박스 테스트

  • 블랙박스 테스트: 시스템의 내부 구조를 몰라도 시스템의 기능을 검사할 수 있는 테스트

    • 애플리케이션이 어떻게 해야 하는지가 아니라 무엇을 해야 하는지가 중심이다.
  • 화이트박스 테스트: 애플리케이션의 내부 작업을 검증하는 테스트

    • 소스 코드를 테스트한다.
  • 화이트박스 테스트는 동작에만 의존할 때 놓칠 수 있는 버그들을 발견할 수 있지만, 리팩토링 내성이 없다. (구현과 결합되어 있다.)

    • 블랙박스 테스트는 정 반대의 장단점을 가지고 있다.

리팩토링 내성은 포기할 수 없기 때문에 블랙박스 테스트를 기본으로 선택한다.

  • 모든 테스트가 시스템을 블랙박스로 보게 만들고 문제 영역에 의미 있는 동작을 테스트 해야한다.

  • 테스트를 통해 비즈니스 요구사항을 알 수 있어야 한다. 알 수 없다면 그 테스트는 깨지기 쉬운 테스트다. 테스트를 재구성하거나 삭제하는게 좋다.

profile
개발자ㅋ.ㅋ

0개의 댓글