ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Mock이란?
    테스트 2021. 10. 19. 15:14

     

     '오늘 뭐먹지' 프로젝트 프로토타입을 만들 때 JEST를 사용해서 테스트를 작성해보려고 했는데 MOCK이라는 것에 막혀서 옴짝달싹 못했던 때가 있었다. 그래서 테스트에 대해 막연한 두려움마저 생겨날 지경이라 이번에 Mock을 공부해서 막연한 두려움을 없애고 테스트를 진행해보고 싶은 마음에 조사를 진행했고, 정리했다. 

     

    Mock이란? 

    실제 객체를 '흉내'내는 시뮬레이션 된 객체, 소프트웨어 테스팅 계획에서 주로 쓰인다.

     


     

    Mock을 사용해야 하는 이유?

     

    그림1 - 식당 시나리오 참여자

     

     

    시나리오를 하나 들어 설명하겠다. 현재 식당에서 손님이 주문을 하는 상황이라 가정하자. 이 시나리오에서는 손님이 웨이터에게 메뉴를 주문하면, 웨이터는 요리사에게 메뉴를 전달하고, 메뉴가 완성되면 다시 손님에게 음식을 전달해주는 시나리오로 흘러간다.

     

     


     

    요리사 객체 테스트

    그림2 - 성공적인 요리사 테스트

     우선 '요리사' 객체의 행동을 테스트 한다고 해보자. 크게 어려울 것 없이 테스트 드라이버가 요리사에게 '햄버거를 만들어줘!' 라는 요청을 하고, 요리사가 햄버거를 정상적으로 만들어낸다면 테스트는 정상적으로 수행된 것이다. 

     

     


    웨이터 객체 테스트

    그림 3 - 웨이터 객체 성공적인 테스트1
    그림 4 - 요리사 객체 성공적인 테스트 2

     이번에는 '웨이터' 객체의 행동을 테스트한다고 해보자. 웨이터의 테스트는 손님(테스트 드라이버)에게서 주문을 받고 요리사에게 주문된 메뉴를 전달 한 뒤, 햄버거 배달을 정상적으로 수행한다면 이는 정상적으로 테스트가 진행된 것이다. 

     

     

     

     

    그림 5 - 요리사 객체에 의존하는 웨이터 객체
    그림 5 - 요리사 객체에 의존하는 웨이터 객체2

     

     하지만 '웨이터' 객체에만 유닛테스트를 진행하기란 쉽지 않다. 왜냐하면 웨이터객체는 요리사 객체에 의존하기 때문에, 요리사 객체의 상태에 따라서 줄 수 있는 값이 달라지기 때문이다. 예를들어 요리사가 유난히 까탈스러운 사람이라 요리를 만들 직원이 없으면 햄버거를 아예 안만들어 줄 수도 있고, 손이 유난히 느린 사람이라 요리를 만드는데 한시간씩이나 걸릴 수도 있다. 이처럼 요리사의 상태에 따라 웨이터가 할 수 있는 일이 달라지기에 웨이터 객체에만 테스트를 진행하기란 어렵다.

     

     

    그림 6 - 테스트에 mock 객체 사용

     이런 문제들을 해결하기 위해 나타난게 테스트만을 위한 객체인 Mock 객체이다. 실제 객체의 상태와는 상관 없이 언제나 테스트에 적합한 데이터를 제공함으로써 '요리사'객체에 의존하는 '웨이터' 객체를 의존관계를 신경쓰지 않고 테스트를 진행 할 수 있도록 해준다.

     


     

    mock object의 구현

     

    Mock Object의 구현은 Fake, stub, mock 세가지로 나뉘고 위의 식당 시나리오를 mock객체로 쓴다고 했을 때 하는 일은 다음과 같다.

    1. Fack Object : 냉동과 전자레인지를 사용해서 요리사인척하는 객체
    2. stub Object : 주문과 상관 없이 항상 핫도그를 주는 핫도그 판매점
    3. mock object : 요리사로 위장한 대본을 따라하는 잠복 경찰

    * 여기서 Mock은 어떤 테스트 데이터를 줘야하고 어떤 결과가 나와야하는지 이미 알고 있는 객체이다.

    * Mock 구현시 각 언어 진영의 mock framework를 사용하면 간편하다. Java의 경우는 Mockito.

     

    mock 객체를 사용한 테스트 예시

     

    성공하는 테스트

    1. Test Driver -> mock cook : 핫도그를 주문 할 것이고, 핫도그를 응답받을 것으로 예상됨
    2. Test Driver(고객이라고 가정한채로 테스트) -> Writer: 핫도그 한 개만 주세요.
    3. Waiter -> mock cook : 핫도그 한 개 주세요
    4. Waiter -> Test Driver : 핫도그 배달
    5. 테스트 성공!

     

    실패하는 테스트

    1. Test Driver -> mock cook : 핫도그를 주문할 것이고 핫도그를 응답 받을 것으로 예상됨
    2. Test Driver -> Waiter: 핫도그 한 개 주세요
    3. Waiter -> mock cook : 햄버거 하나 주세요
    4. Mock cook stop the test : 핫도그 주문이 아니야!
    5. Test Driver : 테스트 실패!

    Mock 사용시 주의사항

     

    1. Mock 객체를 불필요하게 많이 사용하면, 후에 할 리팩토링에서 에러가 발생해 테스트에 대한 유지보수 비용이 크게 발생되어 질 수 있다.

    2. Simulate한 객체이므로 실제 객체로 작동을 해봤을 때 예상한 것과 다르게 동작할 수 있다.

     

    * 그러니 꼭 필요한 객체에 필요한 행동만 주의 깊게 만들어서 Mock 객체를 형성하는 것이 바람직하다.

     


    Reference

    https://en.wikipedia.org/wiki/Mock_object

     

    Mock object - Wikipedia

    In object-oriented programming, mock objects are simulated objects that mimic the behavior of real objects in controlled ways, most often as part of a software testing initiative. A programmer typically creates a mock object to test the behavior of some ot

    en.wikipedia.org

    https://stackoverflow.com/questions/3622455/what-is-the-purpose-of-mock-objects

     

    What is the purpose of mock objects?

    I am new to unit testing, and I continously hear the words 'mock objects' thrown around a lot. In layman's terms, can someone explain what mock objects are, and what they are typically used for when

    stackoverflow.com

     

    '테스트' 카테고리의 다른 글

    Mockito  (0) 2021.10.19

    댓글

Designed by Tistory.