[英]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));
}
作者說Customer是SUT , Store是合作者
我這里有點迷糊,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.