1) 개요
- 테스트에서 목을 사용하는 것은 논란의 여지가 있는 주제다.
어떤 사람들은 목이 훌륭한 도구이며 대부분의 테스트에 적용해야 한다고 주장한다.
다른 사람들은 목이 테스트 취약성을 초래하며 사용하지 말아야 한다고 주장한다.
속담에도 있듯이 진실은 어딘가에 있다.
- 여기서는 목이 취약한 테스트, 즉 리팩터링 내성이 부족한 테스트를 초래하는 것을 살펴본다.
그러나 목을 적용할 수 있는 경우가 있고, 심지어 목 사용이 바람직한 경우도 있다.
그리고 단위 테스트의 런던파와 고전파에 대한 논쟁을 집중적으로 다룬다.
요컨대 분파 간 의견 차이는 테스트 격리 문제에 대한 견해에서 비롯된다.
런던파는 테스트 대상 코드 조각을 서로 분리하고,
불변 의존성을 제외한 모든 의존성에 테스트 대역을 써서 격리하자고 한다.
- 고전파는 단위 테스트를 분리해서 병렬로 실행할 수 있게 하자고 한다.
테스트 간에 공유하는 의존성에 대해서만 테스트 대역을 사용한다.
- 목과 테스트 취약성 사이에는 깊고 불가피한 관련이 있다.
다음은 어떻게 관련이 있는지 그 기초를 차근차근 설명한다.
또한 리팩터링 내성 저하 없이 목을 사용하는 방법을 살펴본다.
2) 목과 스텁 구분
- 목은 테스트 대상 시스템(SUT)과 그 협력자 사이의 상호 작용을 검사할 수 있는
테스트 대역이라고 했다.
테스트 대역에 또 다른 유형이 있는데, 바로 스텁(stub)이다.
여기서는 목이 무엇이고 스텁과 어떻게 다른지 자세히 살펴보자.
(1) 테스트 대역 유형
- 테스트 대역은 모든 유형의 비운영용 가짜 의존성을 설명하는 포괄적인 용어다.
이 용어는 영화 산업의 '스턴트 대역'이라는 개념에서 비롯됐다.
테스트 대역의 주 용도는 테스트를 편리하게 하는 것이다.
테스트 대상 시스템으로 실제 의존성 대신 전달되므로, 설정이나 유지 보수가 어려울 수 있다.
-제라드 메스자로스에 따르면, 테스트 대역에는 더미, 스텁, 스파이, 목, 페이크라는 다섯 가지가 있다.
여러 가지 유형에 겁먹을 수 있지만, 실제로는 목과 스텁의 두 가지 유형으로 나눌 수 있다.
- 이 두 유형의 차이점은 다음과 같다.
(1) 목은 외부로 나가는 상호 작용을 모방하고 검사하는 데 도움이 된다.
이러한 상호작용은 SUT가 상태를 변경하기 위한 의존성을 호출하는 것에 해당된다.
(2) 스텁은 내부로 들어오는 상호작용을 모방하는 데 도움이 된다.
이러한 상호 작용은 SUT가 입력 데이터를 얻기 위한 의존성을 호출하는 것에 해당한다.
- 다섯 가지 변형의 나머지 차이점은 미미한 구현 세부 사항이다.
예를 들어, 스파이는 목과 같은 역할을 한다.
스파이는 수동으로 작성하는 반면, 목은 목 프레임워크의 도움을 받아 생성된다.
가끔 '직접 작성한 목'이라고 부르기도 한다.
- 한편, 스텁, 더미, 페이크의 차이는 얼마나 똑똑한지에 있다.
더미는 널값이나 가짜 문자열과 같이 단순하고 하드코딩된 값이다.
SUT의 메서드 시그니처를 만족시키기 위해 사용하고 최종 결과를 만드는데 영향을 주지 않는다.
스텁은 더 정교하다.
시나리오마다 다른 값을 반환하게끔 구성할 수 있도록 필요한 것을 다 갖춘 완전한 의존성이다.
마지막으로 페이크는 대다수의 목적에 부합하는 스텁과 같다.
차이점은 생성에 있다.
페이크는 보통 아직 존재하지 않는 의존성을 대체하고자 구현한다.
- 목과 스텁의 차이점에도 유의하라. 목은 SUT와 관련 의존성 간의 상호 작용을 모방하고 검사하는 반면,
스텁은 모방만 한다. 이는 중요한 차이점이다.
'단위 테스트' 카테고리의 다른 글
[단위 테스트] 좋은 단위 테스트의 4대 요소 자세히 살펴보기 (0) | 2024.07.17 |
---|