새로운 내용을 공부할 때
새로운 내용의 공부를 시작할 때 용어의 정의를 이해하지 못하거나 정확하게 알지 못한다면 그 용어가 포함된 문장을 이해하지 못합니다.
작은 단어 하나가 내용을 이해하지 못하게 하기 때문에 용어를 정확하게 이해하는 것이 중요합니다.
테스트 대역
목표 D-day : 29 일
테스트 대역에 대해서 학습한 것을 정리하려고 합니다.
학습 목표
- 테스트 대역에 대한 질문
- Dummy
- Stub
- Fake
- Mock
- Spy
- 정리
테스트 대역에 대한 질문
테스트 대역이란 무엇이며, 왜 필요한가요?
테스트 대역은 테스트를 위해 만들어진 진짜가 아닌 가짜 객체나 컴포넌트를 말합니다.
테스트 대역은 실제 객체를 대신해서 행동하고 실제 객체가 하지 못하는 일을 대신합니다.
예를 들어, 테스트를 작성할 때 어떤 코드는 테스트 단계에서 실제로 실행하기 부담스러운 경우가 있습니다.
외부 API를 사용하여 결제나 메일을 보내는 기능이라면 테스트를 위해 매번 결제하거나 메일을 보내기 어렵습니다.
이런 경우 응답 값은 예측할 수 있기 때문에 테스트 대역을 통해서 외부 네트워크를 사용하지 않고 테스트를 할 수 있습니다.
실제 테스트 관심사는 결제 API 결과가 아니라 결과 이후를 테스트 하고 싶은 경우처럼 말이죠
테스트 대역에는 여러 종류가 있는데, 그 중에서 Mock과 Stub의 차이점을 설명해 주실 수 있나요?
Stub은 테스트에 필요한 정적인 데이터를 미리 반환하도록 설정되었습니다. 특정 메서드 호출에 대해 예상된 응답을 제공합니다.
외부 의존성이나 구현되지 않은 시스템의 결과를 대체하기 위해 사용합니다.
Mock은 특정 메서드 호출 여부, 호출 횟수, 파라미터 등을 검증할 수 있는 객체입니다.
상태를 사용하여 검증하는 방식인 상태 기반 검증, 메서드 호출 여부를 확인하는 방식인 행동 기반 검증을 통해서 테스트를 합니다.
테스트 대상이 협력 객체와 어떻게 상호작용하는지 확인하거나 테스트 대상의 메서드를 호출하여 상태 변경을 확인하는 방법이 있습니다.
언제 Mock을 사용하는 것이 적합하고, Stub이나 Fake로 대체해도 괜찮은 경우는 어떤 경우인가요?
Mock은 객체 간의 상호작용을 검증할 때 적합합니다. 예를 들어, 특정 메서드가 호출되었는지, 상태가 예상한 대로 변화되었는지 확인하는 목적입니다. Mock을 사용할 경우 테스트 관심사는 테스트 대역이 실행하게 되었는지 검증하기 위함입니다.
Stub은 정해진 응답을 반환하는 역할로, 테스트 관심사에 필요한 예측된 결과에 대한 테스트를 작성할 때 필요합니다.
Fake는 실제 객체처럼 내부 로직이 있습니다. 메모리와 같이 간단한 방법으로 상태를 유지하여 테스트를 할 수 있습니다.
테스트 대역이 주체가 되어 내부 로직을 테스트하고 싶을 때 적합합니다.
테스트 대역을 사용할 때 주의할 점은 무엇인가요? 특히 잘못된 테스트 코드가 만들어질 수 있는 위험은 무엇인지 설명해 주세요.
테스트 대역은 실제 객체의 동작을 대신하거나 외부 의존성을 가벼운 대체물로 대체하여 테스트의 효율성과 테스트 관심사 집중을 높이는데 유용합니다. 그러나 무분별한 테스트 대역을 잘못 사용하는 경우 문제가 발생합니다.
테스트 신뢰성이 떨어집니다: 테스트 대역은 실제 객체와 동일하게 동작하지 않을 수 있습니다. 만약 테스트 대역이 실제 객체와 다르게 구현된다면, 테스트 결과가 실제 상황과 일치하지 않을 수 있습니다. 이는 실제 어플리케이션에서의 예상하지 못한 오류로 이어질 수 있습니다.
과도한 Mock사용 지나치게 행동 기반 검증을 하는 경우 테스트 코드가 구현 세부 로직에 의존하게 됩니다.
이말의 의미는 메서드 실행 여부를 검증하다보니 메서드에 대해 알고 있어야하고 만약 메소드가 변경된다면 테스트 코드가 의미가 없어집니다. 이렇게 오히려 테스트 코드 때문에 실제 객체가 유연하게 확장하거나 수정하기 어려워질 수 있습니다.
의미없는 테스트가 생길 수 있습니다. 지나치게 단순화하여 실제 객체의 내부 로직이 제대로 작동하는지 확인할 수 없을 수 있습니다. 이로 테스트 품질을 저하할 수 있습니다.
Dummy
정의 : 숨만 쉬는 객체
테스트 관심사에 필요한 의존성 객체를 만들 때 사용한다.
빈 깡통이다
Stub
정의 : 기생충 (조종한대로 움직인다.)
테스트 관심사에 필요한 응답이 필요한 경우에 사용한다.
항상 동일한 예상 결과를 반환한다.
Mock
정의 : 신체 모형으로 동작을 테스트한다.
객체의 상태나 협력 객체의 상호작용을 검사할 때 사용한다.
Fake
정의 : 메모리 테스트 객체
실제 객체와 로직은 동일하여 상태를 유지한다.
given,when,then
에 테스트 객체가 모두 필요하다면 테스트 흐름이나 직관성이 좋다.
Spy
정의 : 상속한 테스트 객체
Mock과 유사하지만 실제 로직을 사용한다.
호출할 경우 실제 객체 내부 상태가 변경되거나 호출을 확인할 수 있다.
정리
테스트 대역은 적절한 상황에 사용하는 것이 중요한데
결국 테스트 대역으로 사용하려는 실제 객체는 메서드와 상태 변경 로직이 이미 검증된 객체여야한다.
그래야 Stub이나 Mock,Spy등으로 사용한 다른 테스트들도 테스트가 의미가 있어지기 때문입니다.
남용하거나 실제 객체의 응답이 아닌 경우를 사용하면 테스트 품질이 떨어질수있습니다.
그리고 테스트 대역은 순수 자바 코드를 사용하여 구현할 수 있으며 mockito을 학습하는 것은 좋으나 기술에만 의존하면 본래 테스트 대역이 가진 목적을 놓칠 수 있기 때문에 상황에 맞는 대역을 선택할 수 있어야한다.
댓글남기기