페이크, 스텁 및 모의는 무엇입니까?

원래 몇 주 전에 이 게시물on my blog의 확장 버전을 게시했습니다. "Unit Testing 101"이라는 제목으로 게시한 시리즈의 일부입니다.

가짜가 무엇인지 아십니까? 스텁과 모의는 같은 것입니까? 그들 사이의 차이점이 무엇인지 봅시다.

가짜



가짜를 이해하는 가장 좋은 비유는 비행 시뮬레이터입니다. 비행 시뮬레이터를 사용하여 교사는 비행 및 환경 조건을 재현하여 제어된 시나리오에서 파일럿 학생을 훈련하고 테스트할 수 있습니다.

가짜는 비행 시뮬레이터와 같습니다. 가짜는 테스트에서 외부 종속성을 대체하는 클래스 또는 구성 요소입니다. 가짜를 사용하면 값을 반환하거나 예외를 발생시키거나 메서드 호출을 기록하여 주변의 코드를 테스트할 수 있습니다. 가짜는 제어된 시나리오에서 코드를 테스트하기 위한 조건을 만듭니다.


가짜는 "테스트"시뮬레이터와 같습니다. 사진 제공: Jan Huber on Unsplash

목 대 스텁



가짜가 무엇인지 알았으니 가짜의 두 가지 유형인 모의와 스텁을 살펴보겠습니다.

가짜는 테스트 "시뮬레이터"의 광범위한 범주를 나타냅니다. Mock과 Stub은 가짜의 두 가지 유형입니다.

스텁은 테스트 중인 코드에 대한 값 또는 예외를 제공하고 모의는 메서드가 올바른 매개 변수로 호출되었음을 확인하는 데 사용됩니다.

주문 서비스 예



목과 스텁의 차이점을 더 잘 이해하기 위해 예를 들어 보겠습니다. OrderService 클래스로 온라인 주문을 처리해 보겠습니다.

이 항목OrderService은 항목에 사용 가능한 재고가 있는지 확인한 다음 신용 카드에 청구합니다. 온라인 지불 처리 소프트웨어를 사용하여 지불을 받고 항목의 재고를 찾기 위해 마이크로 서비스에 API 요청을 한다고 상상해 보십시오. IPaymentGatewayIStockService 두 인터페이스를 사용하여 두 종속성을 나타냅니다. 이 같은,

public class OrderService 
{
    private readonly IPaymentGateway _paymentGateway;
    private readonly IStockService _stockService;

    public OrderService(IPaymentGateway paymentGateway, IStockService stockService)
    {
        _paymentGateway = paymentGateway;
        _stockService = stockService;
    }

    public OrderResult PlaceOrder(Order order)
    {
        if (!_stockService.IsStockAvailable(order))
        {
            throw new OutOfStockException();
        }

        _paymentGateway.ProcessPayment(order);

        return new PlaceOrderResult(order);
    }
}

OrderService 클래스를 테스트하려면 두 가지를 확인해야 합니다. 구매한 항목에 재고가 없으면 예외가 발생합니다. 그리고 구매한 상품의 재고가 충분하면 결제를 해야 합니다.

재고가 있는 항목의 시나리오에 대한 테스트를 작성해 봅시다.

인벤토리 가짜



먼저 모든 주문에 사용할 수 있는 재고를 반환하는 가짜가 필요합니다. 그것을 부르자 : AlwaysAvailableStockService . 다음과 같습니다.

public class AlwaysAvailableStockService : IStockService
{
    public bool IsStockAvailable(Order order)
    {
        return true;
    }
}


그 이름에서 알 수 있듯이 우리가 전달하는 주문에 관계없이 항상 재고를 반환합니다.

지불 게이트웨이에 대한 가짜



둘째, OrderService는 신용카드로 청구하는 경우 작동합니다. 그러나 테스트를 실행할 때마다 실제 신용 카드에 요금을 청구하고 싶지는 않습니다. 그것은 비쌀 것입니다!

지불 게이트웨이가 호출되었는지 여부를 기록하기 위해 가짜를 사용합시다. 이것을 가짜라고 하자: FakePaymentGateway . 다음과 같습니다.

public class FakePaymentGateway : IPaymentGateway
{
    public bool WasCalled;

    public void ProcessPayment(Order order)
    {
        WasCalled = true;
    }
}


메서드WasCalled가 호출될 때 true로 설정한 공용 필드ProcessPayment()가 있습니다.

이제 AlwaysAvailableStockServiceFakePaymentGateway가 준비되었으므로 실제 테스트를 작성해 보겠습니다.

[TestClass]
public class OrderServiceTests
{
    [TestMethod]
    public void PlaceOrder_ItemInStock_CallsPaymentGateway()
    {
        var paymentGateway = new FakePaymentGateway();
        var stockService = new AlwaysAvailableStockService();
        var service = new OrderService(paymentGateway, stockService);

        var order = new Order();
        service.PlaceOrder(order);

        Assert.IsTrue(paymentGateway.WasCalled);
    }
}

AlwaysAvailableStockService 가짜는 테스트에 대한 간접 입력 값을 제공하기 위해 존재합니다. 스텁입니다. 그리고 FakePaymentGatewayOrderService가 신용 카드를 청구하기 위해 전화를 걸었다고 주장하는 데 사용됩니다. 모의입니다. 실제로 MockPaymentGateway라고 부를 수 있습니다.

짜잔! 이것이 스텁과 모의의 차이점입니다. 다시 말하지만 가짜는 테스트 "시뮬레이터"와 같습니다. 스텁은 값을 제공하고 모의는 어설션에 사용됩니다. 다음에 테스트에서 외부 종속성을 사용하여 스텁 또는 모의가 필요한지 물어보십시오. 그것들은 같은 것이 아닙니다.

단위 테스트를 처음 사용하거나 자세히 알아보려면 my blog에서 "단위 테스트 101"시리즈를 계속 시청하십시오.

좋은 웹페이지 즐겨찾기