목과 테스트 취약성

Crow·2022년 8월 11일
0

Unit Testing

목록 보기
2/5
  • 목과 스텁 구분
  • 식별할 수 있는 동작과 구현 세부 사항 정리
  • 목과 테스트 취약성 간의 관계 이해
  • 리팩터링 내성 저하 없이 목 사용

테스트 대역 유형

테스트 대역은 크게 목(목,스파이), 스텁(스텁,더미,페이크)로 나눌수있음
두 유형은 다음과 큰 차이점 존재

  • 목은 외부로 나가는 상호작용을 모방하고 검사하는데 도움
  • 스텁은 내부로 들어오는 상호 작용을 모방하는 데 도움

나머지 차이점은 미미한 구현 세부사항임

스파이는 목과 같은 역할 그러나 스파이는 수동작성하지만,
목은 프레임워크의 도움을 받아 생성

스텁 더미 페이크의 차이는 얼마나 똑똑한지에 있음
스텁:시나리오마다 다른값을 반환하게끔 구성할 수 있음(완전한 의존성)
더미:널값이나 가짜 문자열과 같이 단순하고 하드코딩된 값
페이크: 스텁과 비슷하지만 생성에 차이 존재(존재하지 않는 의존성을 대체하고자 구현)

Mock(도구)은 목(테스트 대역)이나 스텁을 만드는 데 사용할 수 있는 목 라이브러리 클래스이다

스텁과 상호 작용을 검증하면 취약한 테스트로 이어짐

명령 조회 분리(CQS) 원칙에 따르면, 모든 메서드가 명령 또는 조회 중 하나여야 하지만 둘다는 안됨(명령을 대체하는 테스트 대역은 목이며, 조회를 대체하는테스트 대역은 스텁임)

모든 제품 코드는 공개 API인지 비공개 API인지 식별할 수 있는 동작인지
구현 세부 사항인지라는 두 가지 차원으로 분류할 수 있음

코드의 공개성은 private, public, internal 키워드 등 접근 제한자에 의해 제어된다

다음 요구 사항을 하나라도 충족하면 식별할 수 있는 동작이다(둘다 아니면 구현 세부 사항)

  • 클라이언트가 목표를 달성하는 데 도움이 되는 연상르 노출하라(연산은 계산을 수행하거나 부작용을 초래하거나 또는 둘 다 하는 메서드다)
  • 클라이언트가 목표를 달성하는 데 도움이 되는 상태를 노출하라(상태는 시스템의 현재 상태다)

잘 설계된 코드는 식별할 수 있는 동작이 공개 API와 일치하고 구현 세부 사항이 비공개 API 뒤에 숨겨져 있는 코드이다
(공개 API가 식별할 수 있는 동작 이상으로 커지면 코드는 구현 세부 사항을 유출)

캡슐화는 코드를 불변성 위반으로부터 보호하는 행위다
(클라이언트는 구현 세부사항을 사용해 불변성을 우회할 수 있기 때문에 구현 세부 사항을 노출하면 캡슐화가 위반되는 경우가 종종생김)

육각형 아키텍처는 상호 작용하는 애플리케이션의 집합이고 각 애플리케이션은 육각형으로 표시함
(각 육각형은 도메인과 애플리케이션 서비스라는 두 계층으로 구성)

육각형 아키텍처는 다음과 같이 세 가지 관점을 강조함

  • 도메인과 애플리케이션 서비스 계층 간의 영향 분리
    (도메인 계층은 비지니스 로직을 애플리케이션 서비스는 도메인 계층과 외부 애플리케이션 간의 작업을 조정)

  • 애플리케이션 서비스 계층에서 도메인 계층으로의 단방향 의존성 흐름
    (도메인 내 클래스는 서로에게만 의존해야하고, 애플리케이션 서비스 계층의 클래스에 의존해서는 안됨)

  • 외부 애플리케이션은 애플리케이션 서비스 계층이 유지하는 공통 인터페이스를 통해 연결됨
    (아무도 도메인 계층에 직접 액세스 할 수 없다)

육각형의 각 계층은 식별할 수 있는 동작을 나타내며 각각의 구현 세부 사항이 있다

애플리케이션에는 시스템 내부 통신과 시스템 간 통신이라는 두 가지 통신 유형 존재 (시스템 내부 통신은 애플리케이션 내 클래스 간의 통신,시스템 간 통신은 애플리케이션이 외부 애플리케이션과 통신할때를 말함)

시스템 내 통신은 구현 세부 사항이다 애플리케이션을 통해서만 접근할 수 있는외부 시스템을 제외하고 시스템 간 통식은 식별할 수 있는 동작이다.

애플리케이션을 통해서만 접근할 수 있는 외부 시스템과의 상호작용도 구현 세부 사항인데, 그 결과의 부작용은 외부에서 확인할 수 없기 때문이다

시스템 내 통신을 검증하고자 목을 사용하면 취약한 테스트로 이어진다
(따라서 시스템 간 통신과 해당 통신의 부작용이 외부 환경에서 보일 때만 목을 사용하는것이 타당함)

무슨말인지 모르겠는게 너무 많음..

profile
어제보다 개발 더 잘하기 / 많이 듣고 핵심만 정리해서 말하기 / 도망가지 말기 / 깃허브 위키 내용 가져오기

0개의 댓글