簡體   English   中英

如何在單元測試中確定哪個是 SUT,哪個是協作者?

[英]How to determine which is a SUT and which is a collaborator in unit testing?

我正在讀一本書,下面是一些代碼:

[Fact]
public void Purchase_succeeds_when_enough_inventory()
{
    // Arrange
    var store = new Store();
    store.AddInventory(Product.Shampoo, 10);
    var customer = new Customer();

    // Act
    bool success = customer.Purchase(store, Product.Shampoo, 5);

    // Assert
    Assert.True(success);
    Assert.Equal(5, store.GetInventory(Product.Shampoo));
}

[Fact]
public void Purchase_fails_when_not_enough_inventory()
{
    // Arrange
    var store = new Store();
    store.AddInventory(Product.Shampoo, 10);
    var customer = new Customer();

    // Act
    bool success = customer.Purchase(store, Product.Shampoo, 15);

    // Assert
    Assert.False(success);
    Assert.Equal(10, store.GetInventory(Product.Shampoo));
}

作者說CustomerSUTStore合作者

我這里有點迷糊,assert階段也測試了Store,那Store不也是一個SUT嗎?

SUT代表System Under Test ,這實際上意味着您執行操作的object

在斷言階段,您正在檢查您的假設,其中有actual值和expected值。 您正在根據預期驗證實際情況。


在上面提到的代碼中, Assert.Equal首先接收期望值,然后是實際值。 而這里的實際價值來自商店。 這很好,因為 Purchase 方法調用表明庫存應該減少,因為已經進行了購買

快樂之路:
- 給定一個有 10 件物品的庫存
- 當我購買 5 件商品時
- 然后將保留 5 個項目

不開心的路:
- 給定一個有 10 件物品的庫存
- 當我嘗試購買 15 件商品時
- 然后我的購買將失敗,庫存保持原樣。

為了更好地強調意圖,您可以像這樣重寫測試:

[Fact]
public void Purchase_succeeds_when_enough_inventory()
{
    // Arrange
    const int initialItemCount = 10;
    const int intededPurchaseCount = 5;

    var store = new Store();
    var product = Product.Shampoo;
    store.AddInventory(product, initialItemCount);
    var customer = new Customer();

    // Act
    bool isSuccess = customer.Purchase(store, product, intededPurchaseCount );

    // Assert
    Assert.True(isSuccess);
    var expectedInventoryCount = initialItemCount - intededPurchaseCount;
    Assert.Equal(expectedInventoryCount, store.GetInventory(product));
}

[Fact]
public void Purchase_fails_when_not_enough_inventory()
{
    // Arrange
    const int initialItemCount = 10;
    const int intededPurchaseCount = 15;

    var store = new Store();
    var product = Product.Shampoo;
    store.AddInventory(product, initialItemCount);
    var customer = new Customer();

    // Act
    bool isSuccess = customer.Purchase(store, product, intededPurchaseCount);

    // Assert
    Assert.False(isSuccess);
    Assert.Equal(initialItemCount, store.GetInventory(product));
}

正如 Peter Csala 所指出的, SUT代表被測系統。 如果您將系統一詞解釋為“事物的安排”,我可以看到這會令人困惑。 在這樣的解釋下,我可以看到商店也可以被視為更廣泛系統的一部分。

然而,這不是 SUT 一詞通常被解釋的方式。 通常,該術語表示您直接與之交互的單位。 在面向對象編程中,這通常是您調用方法的 object。

我通常根據它們在測試中扮演的角色來命名測試變量。 因此,我通常將 SUT 變量命名為sut

另外,既然我們已經完成了, 我發現沒有必要在空行已經使結構清晰時使用注釋來表示排列、動作和斷言階段

以下更接近我編寫測試的方式。

[Fact]
public void Purchase_succeeds_when_enough_inventory()
{
    var store = new Store();
    store.AddInventory(Product.Shampoo, 10);
    var sut = new Customer();

    bool success = sut.Purchase(store, Product.Shampoo, 5);

    Assert.True(success);
    Assert.Equal(5, store.GetInventory(Product.Shampoo));
}

[Fact]
public void Purchase_fails_when_not_enough_inventory()
{
    var store = new Store();
    store.AddInventory(Product.Shampoo, 10);
    var sut = new Customer();

    bool success = sut.Purchase(store, Product.Shampoo, 15);

    Assert.False(success);
    Assert.Equal(10, store.GetInventory(Product.Shampoo));
}

這清楚地表明哪個 object 是 SUT。 它是名為sut的變量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM