DEV Community

leo
leo

Posted on • Edited on

Mock and Stub

Intro

최근에 현재 일하는 회사의 admin 프로젝트에 testing library를 통해 테스트 환경을 구현하기 위해서 노력 중이다.

컴포넌트 테스트 코드를 작성할 때, api의 호출에 대한 의존성이 걸린 부분이 많았다. 따라서 테스트 코드를 원활하게 작성하기 위해서 이런 부분을 해결하기 위해서 Test Double이란 방법을 사용해야 했다.

따라서 이에 대해 한번 정리를 해봐야 할 필요성이 느껴져서 블로그 글을 작성하게 됐다.

테스트의 방법론에 대해서 공부를 해 본 사람이라면 Test Double이라는 용어에 대해서 분명 들어봤을 것이다.

나 같은 경우는 한 회사에서 면접을 봤을 때, 면접관이 Test Double의 Mock과 Stub에 대해서 질문을 했기 때문에 그때 이 용어를 처음 들어봤었다. 물론 그때 당시에는 대답하지 못했었다.

Test Double이란

Test Double이란 용어는 할리우드의 Stunt Double 에서 유래가 생겼다. 할리우드에서 액션 영화를 찍을 때 영화배우들은 위험한 장면들을 촬영해야 하는 경우가 많다. 만약 실제 배우들이 다치게 되면 영화를 찍을 수가 없기 때문에, 다른 사람들이 이런 위험한 상황을 대신 찍어야 했는데 이를 대신해서 촬영하는 스턴트 배우들을 'double'이라고 한다.

Test Double의 역할도 Stunt Double과 별반 다르지 않다. 먼저 xUnit Test Patterns의 저자인 Gerard Meszaros가 정의한 테스트 더블을 살펴보자.

When we are writing a test in which we cannot (or chose not to) use a real depended-on component (DOC), we can replace it with a Test Double.

쉽게 풀이를 해보자면, 우리가 테스트 코드를 작성할 때 해당 테스트 코드에서 의존성 문제를 해결할 수 없거나, 해결할 수 있지만 사용하길 원하지 않는 경우, 우리는 이런 의존성을 테스트 더블을 통해서 대체할 수가 있다. 테스트 더블은 테스팅용 목적으로 실제 의존성을 대체하는 것을 말한다.

물론 이런 의존성이 항상 문제가 되는 것은 아니다. 하지만 이런 의존성 들이 side effect(ex: API 요청, 데이터베이스 접근, 상태 값 변경등)를 가지고 있다면 테스트를 어렵게 만드는 요소가 된다.

테스트 더블은 이런 의존성 때문에 테스트를 진행하기 어렵거나, 테스트를 진행했을 때의 기회비용이 큰 경우(테스트 안에서 특정 라이브러리를 실제로 실행을 하는 경우 작업이 너무 무거워서 시간이 오 래걸리는 경우), 이를 대신해서 테스트를 쉽게 할 수 있도록 사용할 수 있는 객체를 말한다.

테스트 더블에서 가장 많이 언급되는StubMock에 대해서 최대한 쉽게 설명을 해보겠다.

Stub

stub이란 미리 정해진 상세한 데이터값을 가진 있는 객체이고 테스트를 수행할 때 의존성 대체를 해서 나올 결과값을 대체할 때 사용한다.

결과값을 살펴보면서 해당 테스트가 올바르게 작동됐는지 안됐는지 살펴보기 때문에 상태 검증이다.

예를 들면, 특정 api 호출이 제대로 작동됐는지에 대해서 살펴볼 때, 해당 함수가 몇 번이나 실행되는지 또는 어떤 인자와 함께 실행됐는지에 대해서 보단, 반환하는 결과값에 대한 검증만 한다.

Mcok

mock은 상호작용에 관한 것이다. mock을 사용할 때는 상태검증에 대해선 전혀 걱정하지 않는다. 대신 mock 객체가 얼마나 테스트 코드와 상호작용했는가에 집중한다.

예를 들면 특정 함수가 몇 번이나 실행됐는가, 또는 여러 개의 함수들이 일정한 순서대로 동작이 됐는가, 어떤 인자와 함께 실행됐는가를 살펴보는 데 집중한다.

Top comments (0)