Code

[단위 테스트] 5-1. 목과 테스트 취약성: 목

noahkim_ 2025. 1. 24. 03:56

블라디미르 코리코프 님의 "단위 테스트" 책을 정리한 포스팅입니다.


1. 목과 스텁 구분

  • 테스트 대상 시스템과 그 협력자 사이의 상호 작용을 검사할 수 있는 테스트 대역

 

  • 외부로 나가는 상호 작용을 모방하고 검사하는 용도
  • SUT가 상태를 변경하기 위한 의존성을 호출하는 상황
  • ex) 메일 호출

 

스텁

  • 내부로 들어오는 상호 작용을 모방하는 용도
  • SUT가 입력 데이터를 얻기 위한 의존성을 호출하는 상황
  • ex) 데이터베이스 조회

 

스텁으로 상호 작용을 검증하지 말라
  • 스텁은 내부로 들어오는 상호 작용만 모방하고 검사하지 않음
  • SUT에서 스텁으로의 호출은 SUT가 생성하는 최종 결과가 아님
    • 최종 결과를 산출하기 위한 수단
    • 내부 구현 세부 사항에 해당됨
  • 이러한 호출을 검증하는 것은 테스트 취약성으로 이어질 수 있음 (과잉 명세)

 

CQS

  • Command Query Separation
  • 모든 메서드는 명령이거나 조회여야 함

 

명령
  • 부작용이 있고, 반환값이 없음
  • 대체하는 테스트 대역은 대역은 목

 

조회
  • 부작용이 없고, 반환값이 있음
  • 조회를 대체하는 테스트 대역은 대역은 스텁

 

2. 식별할 수 있는 동작과 구현 세부 사항

식별할 수 있는 동작은 공개 API와 다르다

  • 공개 API는 식별할 수 있는 동작으로, 비공개 API는 구현 세부 사항으로 설계될 수록 좋은 설계임

 

식별할 수 있는 동작의 기준
  • 클라이언트가 목표를 달성하는 데 도움이 되는 연산
  • 클라이언트가 목표를 달성하는 데 도움이 되는 상태

 

구현 세부 사항 유출

연산
  • 단일한 목표를 달성하고자 클래스에서 호출해야 하는 연산의 수가 1보다 크면 해당 클래스에서 구현 세부 사항을 유출할 가능성이 있음
  • 이를 위해 캡슐화를 잘하여 불변성을 위반하지 않고 세부사항을 노출하지 않음
    • 해당 연산이 클래스의 불변성을 위반하지 않도록 할 수 있음
    • 객체 내부 상태가 손상되는 위험으로부터 보호

 

상태
  • 유의미한 동작에 관련한 상태를 노출하는 것도 구현 세부 사항 유출