"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 모의 대 스텁: 주요 차이점 이해

모의 대 스텁: 주요 차이점 이해

2024-11-07에 게시됨
검색:966

Mock vs Stub: Understanding the Key Differences
소프트웨어 테스팅에서 모의 ​​대 스텁은 종속성을 시뮬레이션하는 데 사용되는 두 가지 인기 있는 테스트 더블 유형입니다. 테스트 중에 실제 종속성을 제어된 대체 항목으로 대체하여 구성 요소의 동작을 격리하는 데 도움이 됩니다. 모의와 스텁은 모두 비슷한 목적으로 사용되지만 테스트 시나리오 유형에 따라 다르게 사용됩니다.
이 문서에서는 모의 객체와 스텁의 주요 차이점, 사용 사례, 테스트 전략에서 각각을 사용하는 시기에 대해 자세히 설명합니다.

테스트 더블이란 무엇입니까?
테스트 더블은 테스트 중에 실제 종속성을 대신하는 데 사용되는 개체나 구성 요소에 대한 일반적인 용어입니다. 목표는 테스트 중인 구성 요소를 격리하고 테스트 결과에 영향을 미칠 수 있는 외부 요인을 제거하는 것입니다. 모의 및 스텁은 단위 및 통합 테스트에 자주 사용되는 두 가지 유형의 테스트 더블입니다.

스텁이란 무엇입니까?
스텁은 테스트 중인 구성 요소가 호출할 때 미리 정의된 데이터를 반환하는 테스트 더블입니다. 일반적으로 테스트 중인 구성 요소에 종속성 입력이 필요할 때 사용되지만 종속성의 실제 동작은 테스트 결과와 관련이 없습니다. 스텁은 제어된 응답을 제공하므로 구성 요소 내부 논리에만 집중할 수 있습니다.

스텁의 예:
결제 처리 기능을 테스트한다고 가정해 보겠습니다. 실제 지불 게이트웨이를 호출하는 대신 항상 "결제 성공" 응답을 반환하는 스텁을 사용하여 함수의 논리를 독립적으로 테스트할 수 있습니다.

const paymentGatewayStub = {
  processPayment: () => "payment successful"
};

function processOrder(paymentService) {
  const result = paymentService.processPayment();
  return result === "payment successful" ? "Order Complete" : "Order Failed";
}

// Test
console.log(processOrder(paymentGatewayStub));  // Output: "Order Complete"

이 경우 스텁은 외부 서비스가 항상 예상 출력을 반환하도록 보장하므로 내부 논리를 더 쉽게 테스트할 수 있습니다.

Mock이 무엇인가요?
모의는 가짜 데이터를 제공할 뿐만 아니라 구성 요소 간의 상호 작용을 확인하는 테스트 더블입니다. Mock은 올바른 매개변수를 사용하여 올바른 메서드가 호출되고 실행 중에 원하는 이벤트 시퀀스가 ​​발생하도록 보장합니다. 일반적으로 구성 요소의 동작이나 상호 작용이 테스트에 중요한 경우에 사용됩니다.
모의 예:
동일한 결제 예시를 사용하여 주문 처리 중에 processPayment() 메서드가 정확히 한 번 호출되는지 확인하고 싶다고 가정해 보겠습니다.

const paymentGatewayMock = {
  processPayment: jest.fn().mockReturnValue("payment successful")
};

function processOrder(paymentService) {
  paymentService.processPayment();  
}

// Test
processOrder(paymentGatewayMock);
expect(paymentGatewayMock.processPayment).toHaveBeenCalledTimes(1);

이 경우 모의 객체는 메서드가 호출되었는지 확인하여 상호 작용을 확인하고 구성 요소가 실행 중에 올바르게 동작하는지 확인합니다.
Mock과 Stub의 주요 차이점
Aspect 모의 스텁
목적 구성 요소 간의 상호 작용을 확인합니다. 사전 정의된 응답을 제공합니다.
동작 메소드 호출 및 매개변수의 유효성을 검사합니다. 정적 데이터만 반환합니다.
사용 시나리오 상호 작용이 중요할 때 사용됩니다. 데이터 출력이 충분할 때 사용됩니다.
복잡성 구현이 더 복잡함 생성이 더 간단함
예 테스트 메서드 호출 확인 고정된 응답으로 로직 테스트

스텁을 사용해야 하는 경우
• 단순 논리 테스트: 종속성의 출력만 제어해야 하는 경우 스텁을 사용합니다.
• 데이터 기반 테스트: 구성 요소가 특정 데이터에 대해 어떻게 작동하는지 테스트하는 데 중점을 두고 있다면 스텁이 더 적합합니다.
• 사용 사례 예: 데이터베이스의 사용자 데이터가 필요한 로그인 기능을 테스트하는 경우 실제 데이터베이스를 호출하지 않고 스텁을 사용하여 더미 사용자를 반환합니다.
모의를 사용해야 하는 경우
• 상호 작용 기반 테스트: 올바른 매개변수를 사용하여 올바른 메서드가 호출되는지 확인하는 데 중점을 두고 있다면 모의 테스트를 사용하세요.
• 복잡한 상호 작용 테스트: 모의는 여러 서비스 또는 API와 상호 작용하는 구성 요소에 이상적입니다.
• 사용 사례 예: 이메일 전송 서비스를 테스트하는 경우 모의 객체를 사용하여 sendEmail() 함수가 예상 수신자 및 메시지와 함께 호출되었는지 확인하세요.
Mock과 Stubs를 함께 사용할 수 있나요?
예. 어떤 경우에는 상호 작용 검증과 제어된 응답을 모두 달성하기 위해 동일한 테스트 내에서 모의와 스텁을 함께 사용합니다. 예를 들어 스텁을 사용하여 특정 데이터를 반환하고 모의를 사용하여 특정 서비스가 호출되었는지 확인할 수 있습니다.
Mock과 Stubs의 장점과 단점
스텁의 장점:
• 간단하고 구현이 용이함
• 구성요소 로직을 별도로 테스트하는 데 유용합니다.
스텁의 단점:
• 메소드 호출이나 매개변수를 검증할 수 없습니다
• 정적 응답으로 제한됨
모의의 장점:
• 동작, 상호 작용 및 순서를 확인합니다.
• 여러 종속성이 있는 복잡한 시나리오에 유용합니다
모의의 단점:
• 더 많은 설정이 필요하고 테스트를 읽기가 더 어려워질 수 있습니다
• 주의 깊게 사용하지 않으면 취약한 테스트로 이어질 수 있습니다.
모의 vs 스텁: 어느 것을 사용해야 할까요?
• 테스트가 종속성 출력에 의존하고 해당 출력을 제어하려면 스텁을 사용하십시오.
• 메소드가 호출되었는지 확인하거나 구성 요소 간의 상호 작용을 검증해야 하는 경우 모의 객체를 사용하세요.
• 단위 테스트의 경우 내부 로직 테스트에 중점을 두기 때문에 스텁이 더 일반적으로 사용됩니다.
• 통합 테스트의 경우 시스템의 다양한 부분이 어떻게 상호 작용하는지 확인할 때 모의 테스트가 더 유용합니다.

결론
모의 객체와 스텁은 모두 테스트 전략에서 필수적인 역할을 하지만 각각 다른 목적을 가지고 있습니다. 스텁은 종속성이 반환하는 데이터를 제어하는 ​​반면, 모의는 구성 요소 간에 올바른 상호 작용이 발생하는지 확인합니다. 각각의 사용 시기와 방법을 이해하면 테스트 품질이 향상되어 보다 안정적인 소프트웨어를 얻을 수 있습니다. 모의 테스트와 스텁을 올바르게 적용함으로써 팀은 버그를 줄이고 개발 속도를 높이며 단위 테스트와 통합 테스트 모두에 대해 더 나은 테스트 전략을 수립할 수 있습니다.

릴리스 선언문 이 글은 https://dev.to/keploy/mock-vs-stub-understanding-the-key-differences-1e36?1에서 복제됩니다. 침해 내용이 있는 경우, [email protected]으로 연락하여 삭제하시기 바랍니다.
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3