Daily Notebook

[TDD] Fixture와 Mock이란?

by 배부른코딩로그

TDD

💡 테스트 코드를 작성할 때, 자주 언급되는 Fixture와 Mock에 대해서 정리해보자!

목표

  • Fixture와 Mock에 대해서 설명할 수 있다.
  • Fixutre와 Mock을 용도에 알맞게 활용할 수 있다.

 

Test Fixture

주제를 의역하자면, '테스트를 위해 고정되어 있는 것'이다.

 

왜 Fixture를 만들어야 할까?

 

테스트는 외부 요인의 간섭을 최대한 없앨 필요가 있기 때문이다.

외부 DB나, API 등 대상 서버의 네트워크, 정기작업 이슈가 있다면, 우리는 테스트를 진행할 수 없다.

이를 개선하기 위해 변경되지 않는 상태나 데이터를 미리 만들어 두는 작업을 'Test Fixture'를 만든다고 한다.

Fixture란, 미리 만들어둔 더미 데이터다.

 

예시

- Mock 또는 Fake Object의 셋팅이나 생성, 삽입할 데이터가 필요할 경우. ex) static Admin

- 변하지 않으며 구체적으로 알고있는 데이터가 필요한 경우. ex) DB Rows

- 특정 상태로 초기화가 필요한 객체가 존재할 경우.

 

즉, 테스트를 위해 변경되지 않는 상태의 객체나 데이터를 만들어 둔 것을 'Fixture'라고 한다.

 

 

Mock, Mocking

Mock이란, '가짜로 만들어진 어떤 것'으로 해석할 수 있다.

Mocking은 유닛 테스트에서 주로 등장하는데, 테스트 대상의 객체에 의존되어 있는 다른 객체들을 페이크 객체로 만드는 것이다. 예시를 통해 이해해보자.

 

예시

테스트 대상은 다른 객체, 함수 간의 의존성을 가지고 있을 수 있다.

회원 가입을 하기 위해서는 ID, PW를 저장시면 되지만, 실제로 ID 중복체크도 있고, 비밀번호 유효성 검사, 암호화 등등 하나의 행동에는 실제로 다양한 의존 관계가 존재한다.

 

하지만, 나는 ID / PW 가 제대로 저장되는지만, 알고 싶고 이를 테스트 하고 싶다.

이를 위해서는 ID 중복체크는 무조건 True, 비밀번호 유효성 검사도 무조건 True, 암호화는 '쀍퉥쾍'으로 만들어 준다고 가정해보자. 그렇다면, DB insert 되기 전 객체의 데이터는 { ID: '배부른코딩로그', PW: '쀍퉥쾍' } 라면, 정상적으로 회원 가입 로직을 수행한 것으로 볼 수 있을 것이다.

 

위에서 회원 가입이라는 행동에 의존된 것들을 가짜 행위한다고 가정한 것이 Mocking이다.

테스트 대상이 아닌 것들을 Fake Object, Fake Action 처리하는 것을 의존성을 Mocking 처리해다고 말할 수 있다.

 

이처럼 Mocking은 테스트 대상 객체의 행동을 고립시키기 위해서, 의존성을 배제하기 위해서는 의존되어있는 객체들의 행동을 가짜로 만들어주는 것이다.

 

 

+) Stubbing

찾아보니 Stubbing이라는 개념도 있었다.

Stub는 테스트가 실행되고 통과만 될 정도로만 작성한다.

 

그러면, Mock과 Stub의 차이점은 무엇일까?

 

Mock은 조금 더 디테일하다. '비즈니스 로직이 예상하는 대로 흘러갔는지'까지 검증하는게 일반적이다.

반면에 Stub는 관심사 하나만 중요하게 생각한다. 예시를 들어보자.

 

예시

Stub의 대표적인 예제는 Controller - Service 관계를 들 수 있다.

Controller는 일반적으로 Service에서 가공된 데이터를 가져온다.

하지만, Controller의 응답을 테스트함에 있어서 Service가 어떻게 실행되는지 궁금하지 않다.

Service로부터 반환받은 데이터를 클라이언트에게 제대로 응답하는지만 궁금할뿐이다.

이 경우, Service라는 것을 정의할 필요가 없다. 클라이언트로 전해줄 정적 데이터만 필요할 것이다.

이런 경우 "Stubbing한다"라고 표현할 수 있다.

 

  • Stub - 단순한 테스트용이라, 대체한 객체에 대한 정확한 검증하지 않음.
    ex) 인메모리로 가상 데이터
  • Mock - 테스트 대상이 의존하는 객체를 사용하고 동일한 역할을 흉내내고 있는지까지 검증.
    (이 데이터에 실제 사용하려는 DB에 정확하게 동작하는가)

 

Last Updated. 2021. 11. 02.

 

반응형

블로그의 정보

배부른코딩로그

배부른코딩로그

활동하기