OTTER-LOG

3장, 단위 테스트 구조

단위 테스트, 블라디미르 코리코프 저/임준혁 역by otter2023년 1월 3일에 최종수정되었습니다.
잘못된 내용이 있으면 댓글을 달아주세요.

이번 장의 목표

  • 준비-실행-검증 패턴으로 작성된 단위 테스트의 구조 살펴보기

  • 단위 테스트 명명법

    좋지 않은 사례와 왜 좋은 선택이 아니었는지에 대해

  • 단위테스트를 위한 프레임워크

단위 테스트 구성하기

AAA 패턴 (arrange - act - assertion)

AAA패턴은 각 테스트를 준비-실행-검증이라는 세 부분으로 나눈다.

const sum = (first, second) => { return first + second; }; describe("sum", () => { it("sum", () => { // arrange // 클래스였다면 여기서, 생성자를 만들어 주자 const first = 10; const second = 20; // act const result = sum(first, second); // assertion result.toBe(30); }); });

이렇게, AAA 패턴을 사용하는 방법은 모든 테스트를 단순화시키고 균일한 구조를 가지게 하는 데 도움이 된다. 특히 이러한 일관성을 통해 테스트 코드를 읽는 것이 쉬워진다. 결과적으로 전체 테스트의 유지 보수 비용이 줄어들 수 있다.

  • 준비

    테스트 대상 시스템과 해당 의존성을 원하는 상태로 만든다.

  • 실행

    메서드를 호출하고, 의존성을 전달하며 반환 값이 있다면 반환값을 갭쳐한다.

  • 검증

    결과를 검증한다.

given, when, then 으로도 표현할 수 있다.


피해야할 패턴 파악하기

여러 개의 준비, 실행, 검증 구문 피하기

때로 준비, 실행, 검증 구문이 여러 개 있는 테스트를 만날 수 있는데 이러한 테스트는 하나의 테스트가 너무 많은 것을 한번에 검증한다는 것을 의미한다.

→ 테스트를 나누어야 한다!

여기서 중요한 부분은 때때로 준비 - 검증 구문은 여러개일 수 있지만, 실행 구문일 경우 특히 조심해야 하고 테스트를 나누는게 좋지 않는지 고민해보아야 한다.

그럼에도, 실행 구문이 여러개일때가 괜찮은 경우도 있다.

  • 시스템의 흐름 상 자연스러울 때 - 하나의 실행이 다른 실행의 후속실행이 되는 경우

If 문 피하기

if 문의 사용은 테스트가 한번에 너무 많은 것을 검증한다는 표시다. 이러한 테스트는 반드시 여러 테스트로 나누어야 한다. 테스트에 분기가 있어서 얻는 이점은 없고 읽기 어렵게 만든다.

if 문이 존재한다면 테스트를 나누자

각 구절은 얼마나 커야 하는가?

일반적으로 준비 구절이 가장 크다.