ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 6. 단위 테스트 스타일
    개발 도서/Unit Testing 2024. 6. 18. 23:53

    6.1단위 테스트의 세 가지 스타일

    • 출력 기반 테스트
      • SUT에 입력을 넣고 출력을 점검하는 방식이다.이러한 단위 테스트 스타일은 전역 상태나 내부 상태를 변경하지 않는 코드에만 적용되므로 반환 값만 검증하면 된다.
      • 출력 기반 단위 테스트 스타일은 함수형이라고도 한다.이 이름은 사이드 이펙트 없는 코드를 선호를 강조하는 방식인 함수형 프로그래밍에 뿌리를 두고 있다. 이 장의 후반부에서 함수형 프로그래밍과 함수형 아키텍처를 자세히 설명한다.
    • 상태 기반 테스트
      • 작업이 완료된 후 시스템 상태를 확인하는 것이다.SUT, 협력자, 데이터베이스, 파일 시스템 등 과 같은 프로세스 외부 의존성의 상태 등을 의미한다.
    • 통신 기반 테스트
      • 목을 사용해 테스트 대상 시스템과 협력자 간의 통신을 검증한다.

    6.2 단위 테스트 스타일 비교

    • 출력 기반 테스트
      • 테스트 품질이 가장 좋다.
      • 구현 세부 사항에 거의 결합되지 않으므로 리팩터링 내성이 있다.
      • 작고 간결하므로 유지 보수하기 쉽다.
    • 상태 기반 테스트
      • 안정성을 위해 더 신중해야 한다.
      • 비공개 상태를 노출하지 않도록 해야 한다.
      • 출력 기반 테스트 보다 크기가 큰 편이라 유지 보수가 쉽지 않다.
      • 헬퍼 메서드와 값 객체를 사용해 유지 보수성 문제를 완화할 수도 있지만 제거할 수는 없다.
    • 통신 기반 테스트
      • 마찬가지로 안정성을 위해 더 신중해야 한다.
      • 애플리케이션 경계를 넘어서 외부 환경에 사이드 이펙트가 보이는 통신만 확인해야 한다.
      • 목은 공간을 많이 차지하는 경향이 있어서 가독성이 떨어진다.
      • 유지 보수성이 가장 좋지 않다.

    6.3 함수형 아키텍처의 이해

     

    6.3.1 함수형 프로그래밍이란


    함수형 프로그래밍은 수학적 함수(순수 함수)를 사용한 프로그래밍이다.
    수학적 함수는 숨은 입출력이 없는 함수다.
    숨은 입출력은 사이드 이펙트와 예외가 해당한다.
    수학적 함수의 모든 입출력은 메서드 이름, 인수, 반환 타입으로 구성된 메서드 시그니처에 명시해야 한다.
    수학적 함수는 호출 횟수에 상관없이 주어진 입력에 대해 동일한 출력을 생성한다.
    수학적 함수는 명시적이므로 테스트 용이성을 상당히 높인다.

     

    6.3.2 함수형 아키텍처


    함수형 프로그래밍의 목표는 비즈니스 로직과 사이드 이펙트를 분리하는 것이다.

    함수형 아키텍처는 사이드 이펙트를 비즈니스 연산의 가장자리로 밀어내 분리를 이루는 데 도움이 된다. 이 방법으로, 사이드 이펙트를 다루는 코드를 최소화하면서 순수 함수 방식으로 작성된 코드의 양을 최대화할 수 있다.

    함수형 아키텍처는 모든 코드를 함수형 코어와 가변 셀이라는 두 가지 범주로 나눈다.
    가변 셀은 입력 데이터를 함수형 코어에 공급하고, 코어가 내린 결정을 사이드 이펙트로 변환한다.

     

    6.3.3 함수형 아키텍처와 육각형 아키텍처 비교


    함수형 아키텍처와 육각형 아키텍처의 차이는 사이드 이펙트의 처리에 있다.
    함수형 아키텍처는 모든 사이드 이펙트를 도메인 계층 밖으로 밀어낸다.
    이와 반대로, 육각형 아키텍처는 도메인 계층에만 한정돼 있는 한은 도메인 계층에 의해 만들어진 사이드 이팩트도 괜찮다.
    극단적으로 함수형 아키텍처는 육각형 아키텍처다.

     

    6.4 함수형 아키텍처와 출력 기반 테스트로의 전환


    해당 절은 코드를 통해 육각형 아키텍처를 함수형 아키텍처로 리팩토링 하는 과정을 소개한다.
    실제 책을 참고하거나, 함수형 아키텍처로의 리팩토링을 조사하자.

     

    6.5 함수형 아키텍처의 단점 이해하기


    함수형 아키텍처와 전통적인 아키텍처 사이의 선택은 성능과 코드 유지 보수성 사이의 절충이며, 함수형 아키텍처는 유지 보수성 향상을 위해 성능을 희생한다.

    모든 코드베이스를 함수형 아키텍처로 전환할 수는 없다. 전략적으로 적용하라.
    시스템의 복잡도와 중요성을 고려하라.
    코드베이스가 단순하거나 그렇게 중요하지 않다면, 함수형 아키텍처에 필요한 초기 투자는 별 효과가 없다.
    반대로, 코드가 복잡하거나 성능 영향이 그다지 눈에 띄지 않는다면 함수형 아키텍처를 사용해 유지 보수성을 향상시키는 것을 고려할 수 있다.

     

    결과적으로 함수형 아키텍처는 출력 기반 테스트와 코드의 유지 보수성을 위한 기법이며,
    위의 내용을 이해하고 전략적으로 적용할 필요가 있다.
    다만 대부분의 경우 모든 도메인 모델을 불변으로 할 수 없기 때문에 출력 기반 테스트에만 의존할 수 없다.
    기본적으로 출력 기반 테스트 + 상태 기반 테스트를 조합하여 사용하며, 가끔씩 통신 기반 테스트를 섞어 사용해도 괜찮다.
    모든 테스트를 출력 기반 테스트로 만드는 것이 아니라, '가능한 많은' 테스트를 전환하는 것을 목표하자.

     

Designed by Tistory.