추가적인 정리 Mock

Jake Seo·2021년 5월 25일
0

Mock이란?

영어 단어적 의미로는 모양을 흉낸 모조품을 뜻한다. ex) 목각폰

개발에서는 테스트 등의 이유로 실제 객체를 만들기에는 여러가지 의존성이 많이 걸쳐 있어서 시간과 비용이 많이 들 때, 가짜 객체를 만들어 사용하는 것을 Mock이라고 한다.

Mock 객체가 필요할 때는?

  • 모듈이 가진 "의존성" 때문에 테스트가 어려워질 때
  • 테스트 작성을 위한 환경 구축이 어려울 때
    • 환경 구축을 위한 작업 시간이 많이 필요할 때 Mock객체를 사용한다. (데이터베이스, 웹서버, FTP서버 등)
    • 아직 개발되지 않은 모듈을 사용하는 테스트가 필요할 때 사용한다.
  • 테스트가 특정 경우나 순간에 의존적일 때
    • 30초간 네트워크에 연결이 되지 않으면 Timeout이 출력되도록 작성한 프로그램을 작성했을 때, 30초간 네트워크가 안되는 환경 등을 만들기 어렵다.
  • 테스트 시간이 오래걸릴 때
    • 개인 PC나 서버 성능 문제 혹은 특정 모듈 실행 시 시간이 오래걸릴 때 Mock으로 대체해서 만들면 빠르게 테스트가 가능하지만, 대체되는 것에 대한 신뢰성을 확보해야 한다.

Mock의 분류와 테스트 더블

테스트 더블

메스자로스가 "xUnitTest Patterns"에서 만들어낸 용어이다. 테스트를 진행하기 어려울 때 이를 대신해 테스트를 진행하도록 만들어주는 객체를 말한다. Mock 객체와 유사한 의미를 가지며 테스트 더블은 상위의 의미로 사용된다.

더미 객체

  • 인스턴스화될 수 있는 수준으로만 객체를 구현한다.
  • 객체의 기능은 사용하지 않지만 인스턴스화된 객체 자체로만 테스트를 진행할 수 있을 때 사용한다.

테스트 스텁

  • 더미 객체보다 좀 더 구현된 객체로 더미 객체가 실제로 동작하는 것처럼 보이게 만든 객체이다.
  • 객체의 특정 상태를 가정해서 만들며, 특정 값을 리턴하거나 특정 메세지를 출력하는 작업을 한다.
  • 특정 상태를 가정해서 하드코딩된 형태이기 때문에 로직에 따른 값의 변경은 테스트 불가능하다.
    • ex) 동작이 성공하는 경우를 테스트할 때는 동작이 성공하는 테스트 스텁을 만들어놨기 때문에, 동작이 실패하는 경우를 테스트 하려면 테스트 스텁을 실패를 가정하여 다시 만들어야 한다.

페이크 객체

  • 여러 상태를 대표할 수 있도록 구현된 객체다.
  • 실제 로직이 구현된 것처럼 보이게 한다.
  • 실제로 DB에 접속해서 비교할 때와 동일한 모양이 보이도록 객체 내부에 구현할 수 있다.
  • 페이크 객체를 만드는 복잡도로 인해 시간이 많이 걸릴 경우
    • 적절한 수준에서 구현하거나 Mock 프레임워크를 사용한다.
    • 혹은 실제 객체를 가져와 테스트한다.

테스트 스파이

  • 테스트에 사용되는 객체를 말한다. 메소드의 사용 여부 및 정상 호출 여부를 기록하고, 요청 시에 알려준다.
  • 테스트 더블로 구현된 객체에 자기 자신이 호출되었을 때, 확인이 필요한 부분을 기록하도록 구현한다.
  • 특정 테스트 메소드가 몇번 호출되었는지 필요한 경우에 전역 변수로 카운트를 설정하고 특정 테스트 메소드에서 카운트를 올리며 이를 가져올 수 있다.
  • 특정 테스트 메소드가 호출되었을 때 또 다른 메소드가 실행이 되어야 한다와 같은 행위 기반 테스트가 필요한 경우 사용한다.
  • 테스트 스파이는 특수한 경우를 제외하고는 잘 쓰이지 않으며 보통 Mock 프레임워크에서 기본적으로 기능을 제공한다.

Mock 객체

  • 행위를 검증하기 위해 사용되는 객체를 지칭하며 수동으로 만들 수도 있고 프레임워크를 통해 만들 수도 있다.
  • 행위 기반 테스트는 복잡도나 정확도 등 작성하기 어려운 부분이 많기 때문에 상태 기반 테스트가 가능하다면 만들지 않는 것이 좋다.

Mock 사용 시 유의사항

  • Mock 프레임워크가 정말 필요한지 확인한다.
  • Mock을 사용하는 경우 테스트 케이스 유지에 복잡성이 더해지기 때문에, Mock이 없는 의존성 작은 구조를 최대한 유지한다.
  • Mock 객체는 가짜 객체일 뿐이라 실제 객체로 작동했을 때 작동하지 않을 수도 있다.
profile
풀스택 웹개발자로 일하고 있는 Jake Seo입니다. 주로 Jake Seo라는 닉네임을 많이 씁니다. 프론트엔드: Javascript, React 백엔드: Spring Framework에 관심이 있습니다.

0개의 댓글