단위 테스트 6장(단위 테스트 스타일)

이현광·2022년 3월 23일
0

단위 테스트

목록 보기
4/6

단위테스트의 3가지 스타일

  • 출력 기반 테스트
  • 상태 기반 테스트
  • 통신 기반 테스트

출력 기반 스타일

출력 기반 테스트는 대상 시스템에 입력을 넣고 생성되는 출력을 점검하는 방식이다.
내부 상태를 변경하지 않는 코드이므로 반환 값만 검증하면 된다.

출력 기반 단위 테스트는 함수형이라고도 한다.
부작용이 없는 코드 선호를 강조하는 프로그래밍 방식인 함수형 프로그래밍에서 가져왔다.

상태 기반 스타일

작업이 완료된 후 시스템 상태를 확인하는 것이다.
여기에서 상태는 아래와 같은 외부 프로세스 외부 의존성의 상태 등을 의미할 수 있다.

  • SUT나 협력자 중 하나
  • 데이터베이스
  • 파일 시스템

통신 기반 스타일

목을 사용해 테스트 대상 시스템과 협력자 간의 통신을 검증한다.

단위 테스트 스타일 비교

  • 회기 방지 (상관 없음)
  • 빠른 피드백 (상관 없음)
  • 리팩터링 내성
  • 유지 보수성

리팩터링 내성 지표로 스타일 비교

리팩터링 내성은 리팩터링 중에 발생하는 거짓 정보 수에 대한 척도이다.

좋은 순으로 정렬을 하자면 아래와 같다.
출력 기반 > 상태 기반 >= 통신 기반

유지 보수성 지표로 스타일 비교

  • 테스트를 이해하기 얼마나 어려운가
  • 테스트를 실행하기 얼마나 어려운가

위의 두개의 특성으로 유지 보수성을 정의 한다.

출력 기반 > 상태 기반 >= 통신 기반

항상 다른 스타일보다 출력 기반 테스트를 선호해야하지만 이를 수행하기는 어렵다.

함수형 아키텍쳐

함수형 프로그래밍이란?

수학적 함수를 사용한 프로그래밍을 말한다.
즉 수학적 함수는 숨은 입출력이 없는 함수이다.
수학적 함수는 호출 횟수에 상관없이 주어진 입력에 대해 동일한 출력을 만든다.

출력 기반 테스트를 적용할 수 있는 메서드 유형은 수학적 함수 뿐이다.

하지만 숨은 입출력은 코드를 테스트하기 힘들게한다.

숨은 입출력은 아래와 같다

  • 부작용 : 메서드 시그니처에 표시되지 않은 출력이다.
  • 예외 : 호출된 예외는 메서드 시그니처가 전달하지 않은 출력을 추가한다.
  • 내외부 상태에 대한 참조

메서드가 수학적 함수인지 판별하는 법은 해당 메서드에 대한 호출을 반환 값으로 대체할 수 있는지 확인한느 것이다.

함수형 아키텍쳐란?

함수형 프로그래밍의 목표는 부작용을 완전히 제거하는 것이 아닌 비지니스 로직을 처리하는 코드와 부작용을 일으키는 코드를 분리하는 것이다.

코드를 두 부형으로 분류하면

  • 결정을 내리는 코드 : 부작용이 필요 없기 때문에 수학적 함수를 사용해 작성 할 수 있다.
  • 해당 결정에 따라 적용하는 코드 : 수학적 함수에 의해 이뤄진 모든 결정을 데이터 베이스의 변경이나 메세지 버스로 전송된 메세지와 같이 가시적인 부분으로 환한다.

결정을 내리는 코드 -> 함수형 코어
해당 결정에 따라 작용하는 코드 -> 가변 셀

함수형 코어와 가변셀은 다음과 같은 방식으로 협력한다.

  • 가변 셀은 모든 입력을 수집
  • 함수형 코어는 결정을 생성
  • 셀은 결정을 부작용으로 변환

이 두 계층으로 잘 분리하려면 가변 셀이 의사 결정을 추가하지 않게끔 결정을 나타내는 클래스에 정보가 충분히 있는지 확인해야 한다.
목표는 출력 기반 테스트로 함수형 코어를 두루 다루고 가변셀을 훨씬 더 적은 수의 통합 테스트에 맡기는 것이다.

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

아래 두 가지 리팩터링 단계를 따른다.

  • 프로세스 외부 의존성에서 목으로 변경
    목으로 변경하면 테스트는 더 이상 파일 시트셈에 접근하지 않으므로 더 빨리 실행되고 시스템을 다룰 필요가 없으므로 유지비도 절감 된다.
  • 목에서 함수형 아키텍처로 변경
    더이상 목 설정이 필요가 없고 단순한 입출력만 필요로 하므로 테스트 가독성을 크게 향상 시킨다.

함수형 아키 텍쳐의 단점

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

모든 코드 베이스를 함수형 아키텍쳐로 전환할 수는 없다. 그렇게에 코드베이스가 단순하거난 그렇게 중요하지 않으면 함수형 아키텍쳐에 필요한 초기 투자는 큰 효과를 가질 수 없다.

profile
cccooodddiiinnngg

0개의 댓글