自我初始化的假物件

2009 年 8 月 4 日

使用 測試替身 的經典案例之一是呼叫遠端服務時。遠端服務通常很慢,而且經常不可靠,因此使用替身是讓測試更快速且更穩定的好方法。

查詢遠端服務時,您需要找到一種方法將預期的資料載入替身中。執行此操作的方法之一是使用我稱為自我初始化假物件的方法。基本計畫很簡單。您第一次呼叫假物件時,它會將呼叫傳遞給實際的遠端服務,並在傳回資料時取得資料並儲存副本。後續呼叫只會傳回副本。在某種意義上,這就像快取,但重要的差異在於沒有嘗試處理快取失效,這很方便,因為這是 兩件難事 之一。

我稱之為假物件,因為這似乎最符合各種測試替身的定義。另一個合理的替代方案是存根,但此處的區別在於,建立固定裝置時需要設定存根,而假物件是自主的。

自我初始化假物件的有趣之處在於,您如何處理遠端服務變更其回應的情況。

有一次我看到這種方法是用於由另一個應用程式控制的資料庫。在這種情況下,資料確實會經常變更。這對測試沒有幫助,因為自動化測試依賴於對相同問題取得相同的答案。但通常測試並不在乎資料是否是最新的,因此儲存舊值就能正常運作。

最近與我的同事 Josh Price 聊天時,我又遇到了這個問題。在他的案例中,遠端資料理論上是靜態的,但偶爾會變更,這表示他正在開發的系統需要變更,通常是為了處理格式化問題。在這個案例中,他有一個特殊測試套件,可以讓所有自我初始化的假資料呼叫遠端服務,並檢查它們傳回的值是否與儲存的值相同。

在這個案例中,他們建置管線的早期階段會針對假資料執行,最後(最慢)的階段會針對服務本身執行。一個有趣的問是,遠端服務需要一些不重要的參數,這些參數會隨著呼叫而變更,但不會變更結果。當假資料從儲存體中檢視這些值時,會將這些參數從 URL 中移除。

(感謝 Josh Price、Darren Cotterill 和 Gerard Meszaros 提供這篇文章的協助。)