簡體   English   中英

單元測試操作順序

[英]Unit Testing Order of Operations

假設我們要做牛排。

Public class Restaurant{
    public void MakeSteak(Steak rawSteak) {
      this.KitchenServices.AddSeasoning(rawSteak);
      this.KitchenServices.Grill(rawSteak);
    }
}

在單元測試中,我可以確保給定一份生牛排,然后將其調味並燒烤:

public void MakeSteakTest() {
  var rawSteak = new Steak();
  this.restaurant.MakeSteak(rawSteak);
  this.KitchenServices.Verify(x => x.AddSeasoning(rawSteak) , Times.Once);
  this.KitchenServices.Verify(x => x.Grill(rawSteak) , Times.Once);
}

我的問題是,我們應該進行測試以確保牛排在燒烤后沒有調味嗎? 如果是,如何?

一般來說 ,你應該測試結果 ,而不是在執行單元測試。 如果更改了MakeSteak ,以使操作按照不同的順序進行,系統中會發生什么? 那是可觀察的東西嗎? 由於您唯一的輸入是Steak對象,如果在AddSeasoning之前AddSeasoning Grill ,是否有某種驗證會失敗? 就是你應該測試的東西。

一種方法是將每個操作表示為對牛排進行操作的命令對象,例如

interface ISteakOp {
    void DoTo(Steak s);
}

class AddSeasoningOp : ISteakOp { ... }
class GrillOp : ISteakOp { ... }

然后返回一系列操作:

public List<ISteakOp> MakeSteakOps() {
    return new List<ISteakOp> {
        new AddSeasoningOp(),
        new GrillOp()
    };
}

那么您的測試可以斷言在進行任何調味之前都會進行任何燒烤操作:

var ops = MakeSteakOps();
var grillIndex = ops.IndexOf(o => o is GrillOp);
if (grillIndex != -1) {
    var seasonIndex = ops.IndexOf(o = o is AddSeasoningOp);
    Assert.That(seasonIndex == -1 || seasonIndex < grillIndex);
}

我的問題是,我們應該進行測試以確保牛排在燒烤后沒有調味嗎?

第一:它對最終用戶/利益相關者可見的行為有影響嗎?他們在乎嗎?

如果是,如何?

然后:

  • 如何能夠檢測到對行為的影響? 在測試中使用相同的方法。
  • 用戶期望的行為是什么? 在測試中使用該期望值。

這聽起來可能太“簡單” /“過於簡單”,但是我非常認真。 那就是適當的行為測試的定義。

暫無
暫無

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

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