2008-11-08 72 views
2

目前,我正在深入探索測試技術,儘管我不確定我是否仍住在unittest-land中,或者已將它留在集成測試的土地上。給我兩個組件A和B,A使用B,那麼我們對B有一個「向上契約」,對於A我們有一個「向下契約」。基本上這意味着:如果A正確使用B並且B行爲正確,那麼兩個合同都將得到滿足,並且事情將正常工作。嘲笑...和驗證者?

我認爲mock是一種保證給定測試用例所需的向上契約的子集的方法。例如,數據庫連接可能具有向上協定來檢索數據記錄,前提是它們已被插入。數據庫連接模擬保證返回某些記錄,而不需要將它們插入到數據庫中。

但是,我目前想知道是否有辦法驗證向下契約。以數據庫連接爲例,向下契約可能是:您必須連接到數據庫並確保連接存在並運行,並輸入正確的SQL查詢。

有沒有人做過這樣的事情?這是否值得爲更復雜的合同工作? (例如,數據庫連接可能需要一個SQL解析器爲了徹底驗證調用數據庫層)

問候,tetha

回答

1

這真的是difference between mocks and stubs - mock驗證確切(或至少可以這樣做 - 你可以使用mocks作爲大多數框架的存根)。本質上,模擬允許你做協議測試,而不僅僅是「如果你打電話給我,我會給你Y」。我使用的每個模擬框架都允許您輕鬆驗證諸如「所有這些調用已完成」和「這些調用按特定順序發生」等事情。

的多個協議,你的組件之間執行,越脆的測試將是 - 有時這是完全適當的(例如,「你必須驗證您的身份進行任何其他操作之前」),但它很容易與測試結束每次更改實施時都必須更改,即使以合理的方式。

1

有誰做到這一點?

是的,我有時使用模擬來驗證「向下合同」。

E.g.如果在登錄時使用了正確的 憑證,則可以使用數據庫模擬來檢查。 特別是,如果你有其他子系統的接口, 然後你可以模擬它們,讓樣品檢查使用 違規。

E.g.如果子系統需要初始化 調用或某種註冊,那麼您的子系統界面模型也可以強制執行此操作。


是否值得工作?

這取決於你想有多深你的測試是,讓我給你不同的「深度」的一些例子:

  1. 如果您想檢查調用的正確順序的接口,然後一個簡單的狀態機可能就足夠了。
  2. 如果您想驗證界面語言的正確用法(您的示例中的SQL),您必須使用解析器。
  3. 如果您想驗證它是否與真實子系統一起工作,請進行集成測試(無法使用模型完成)。

結論:

如果合適的話,它應該做的事。但是,您不能指望模型發現接口的每個錯誤用法。例如。如果兩個併發事務導致死鎖,數據庫模型幾乎無法檢測到。