Unit Testing

단위테스트(2) 단위테스트 구조

25G 2024. 2. 4. 19:18

AAA 패턴

AAA 패턴은 준비, 실행, 검증 이라는세 부분으로 나누어서 하나의 단위테스트를 구성하는 것 이다.
AAA 패턴은 스위트 내 모든 테스트가 단순하고 균일한 구조를 갖는 데 도움이 된다. 이러한 일관성이 이 패턴의 가증 큰 장점이다.

  • 준비구절에서는 테스트 대상 시스템과 해당 의존성을 원하는 상태로 만든다.
  • 실행 구절에서는 sut에서 메서드를 호출하고 준비된 의존성을 전달하며 출력 값을 캡처한다.
  • 검증 구절에서 결과를 의도된 값이나 상태가 되었는지 검증한다.

AAA 패턴의 주의할점

  • 여러개의 준비, 실행, 검증 구절 피하기
    • 이는 애매하고 이상한 통합테스트와 다를바가 없어진다.
  • 테스트 내에 if문 피하기
    • 이 또한 위와 비슷하게 if문이 있는 단위 테스트를 만날 수 있다. 이것도 안티패턴. 단위 테스트든 통합 테스트든 테스트는 분기가 없는 간단한 일련의 단계여야한다.

테스트 구절 크기는 얼마만해야함?!

테스트 구절의 크기에 따라 각각의 지침이 있다.

준비 구절이 큰 경우

일반적으로 준비 구절이 세 구절 중에 가장 크고 만약 크게 된다면 비공개 메서드나 별도의 팩토리 클래스를 통해서 도출하는 것이 좋다. 준비 구절에서 도움이 되는 패턴으로 오브젝트 마더 와 테스트 데이터 빌더가 있다.

실행 구절이 한줄 이상인 경우를 경계하라

실행 구절이 한줄 이상인 경우 캡슐화가 깨지기 때문에 db정합성 문제나 코드보호에 어려움이 생긴다. 잠재적 모순으로 부터 코드를 보호하는 행위를 캡슐화 라고 한다. 코드 캡슐화를 항상 지켜야 한다.

검증 구절에는 검증문이 얼마나 있어야 하는가

단일 동작 단위는 여러 결과를 낼 수 있으며, 하나의 테스트로 그 모든 결과를 평가하는 것이 좋다. 그렇기는 해도 검증 구절이 너무 커지는 것은 경계해야 한다. 제품 코드에서 추상화가 누락됐을 수 있다. 모든 속성을 검증하는 대신 객체 클래스 내에 적절한 동등 맴버를 정의하는 것이 좋다. 그렇게 하면 단일 검증문으로 객체를 기댓값과 비교할 수 있다.

준비 실행 검증 주석 제거하기

주석 대신 빈줄 한줄로 대체한다.

테스트 간 테스트 픽스처 재사용

테스트 픽스처?

테스트 픽스처는 테스트 대상 객체다. 정규 의존성, 즉 전달되는 인수를 뜻한다. 데이터베이스에 있는 데이터나 파일일 수 있고 이러한 객체는 각테스트 실행전 고정상태로 유지하기 때문에 동일한 결과를 생성한다.

테스트 픽스처를 사용하면 단위테스트 간에 공통적으로 사용하는 준비단계의 데이터를 효과적으로 작성할 수 있고 코드의 양을 크게 줄일수 있다. 하지만 테스트 간 결합도가 높아지고 테스트 가독성이 떨어진다는 단점을 가지고 있다.

테스트간의 높은 결합도는 안티패턴

테스트 픽스처를 사용해 여러 단위테스트에 대상 객체를 통일하면 해당 객체의 수정이 일어나면 이를 사용하는 모든 단위테스트에 영향이 가기 때문이다. 좀 더 나은 테스트 픽스처를 제사용법은 꼭 생성자 사용이 최선의 방법이 아니라는 점이다. 또는 비공개 팩토리 메서드를 두는것이 될 수 있다.
공통 초기화 코드를 비공개 팩토리 메서드로 추출해 테스트 코드를 짧게 하면서, 동시에 테스트 진행상황에 대한 전체 맥락을 유지할 수 있게된다.

단위테스트 명명법

이는 꽤 오랜 시간 규칙을 시도해 왔다. 하지만 번번히 실패하는 명명법은 다음과같다

  • 테스트 대상 메서드 테스트 중인 메서드 이름
  • 메서드를 테스트 하는 조건
  • 현재 시나리오에서 테스트 대상 메서드를 기대하는것
    위는 동작 대신 구현세부 사항에 집중하게끔 부추기기때문에 도움이 되지 않는다.

간단하고 쉬운 영어 구문이 훨씬 더 효과적이며 엄격한 명명 구조에 얽매이지 않고 표현력이 뛰어나다.

단위 테스트 명명 지침

  • 엄격한 명명 정책을 따르지 않는다. 복잡한 동작에 대한 높은 수준의 설명을 이러한 정책의 좁은 상자 안에 넣을 수 없다. 표현의 자유를 허용하자
  • 문제 도메인에 익숙한 비개발자들에게 시나리오를 설명하는 것 처럼 테스트 이름을 짓자.
  • 단어를 언더바"_" 로 구분한다.
  • 테스트 이름에 sut의 메서드 이름을 포함하지 말것 코드를 테스트 하는 것이 아니라 애플리케이션 동작을 테스트하는 것이라는 점을 명심하자.

매개변수화된 테스트 리팩터링하기

보통 테스트 하나라로 동작단위를 완전하게 설명하기에 부족한 경우가 많은데 이때 매개변수화된 테스트를 사용해 유사한 테스트를 묶는 기능을 대부분의 테스트 프레임워크에서 지원한다.

검증문 라이브러리를 사용한 테스트 가독성 향상 하자

좀더 검증문 라이브러리를 사용하면 좀더 이야기같은 추상화된 검증문을 사용할 수 있어 가독성을 높여서 좀 더 읽기 좋은 테스트코드가 될 수 있다.

 

출처: Unit Testing 블라디미르 코리코프