生活随笔
收集整理的這篇文章主要介紹了
针对状态的间接测试
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
定義? 基于狀態的測試(也稱狀態驗證),是指在方法執行之后,通過檢查被測系統及其協作者(依賴項)的狀態來檢測該方法是否正確工作。
讓我們來看一個基于狀態測試的簡單例子,它使用LogAnalyzer類,然而,我們不能簡單地調用一個方法就完成測試。代碼清單2.3給出了該類的代碼。
代碼清單2.3? 通過調用IsValidLogFileName來測試屬性的值
public?class?LogAnalyzer ?{ ?????private?bool?wasLastFileNameValid; ??????public?bool?WasLastFileNameValid ?????{ ?????????get?{?return?wasLastFileNameValid;?} ?????????set?{?wasLastFileNameValid?=?value;?} ?????} ??????public?bool?IsValidLogFileName(string?fileName) ?????{ ?????????if?(!fileName.ToLower().EndsWith(".slf")) ?????????{ ?????????????wasLastFileNameValid?=?false; ?????????????return?false; ?????????} ??????????//存儲狀態的結果用于以后驗證 ?????????wasLastFileNameValid?=?true; ?????????return?true; ?????} ?} ? 從代碼中可以看出,LogAnalyzer記住了驗證檢查的最終結果。因為邏輯上取決于先有其他方法被調用,所以我們要測試此功能,不能只是簡單地寫一個測試,用它來取得一個方法的返回值,我們必須使用其他手段來檢測邏輯是否有問題。
首先,必須確定要測試的邏輯。是在新的屬性wasLastFileNameValid中嗎?不是的,是在IsValidLogFileName方法中,所以我們的測試名稱必須以這個方法開頭。代碼清單2.4給出了一個簡單測試,看其結果是否已記住。
代碼清單2.4? 通過調用方法并檢查其屬性值來測試一個類
[Test] ?public?void?IsValidLogFileName_ValidName_RemembersTrue() ?{ ?????LogAnalyzer?log?=?new?LogAnalyzer(); ??????log.IsValidLogFileName("somefile.slf"); ????? ?????Assert.IsTrue(log.WasLastFileNameValid); ?} ? 請注意,我們是在被測代碼以外的地方做斷言來測試IsValidLogFileName方法功能的。
代碼清單2.5給出了另一個例子(我們將在第3章中再次用到)。在該例子中,查看一個內置的內存計算器功能。(參考本書的范例代碼Calculator.cs和CalculatorTests.cs。)
代碼清單2.5? Add()方法和Sum()方法
public?class?Calculator ?{ ?????private?int?sum?=?0; ?????public?void?Add(int?number) ?????{ ?????????sum?+=?number; ?????} ?????public?int?Sum() ?????{ ?????????int?temp?=?sum;?sum?=?0; ?????????return?temp; ?????} ?} ? Calculator類的工作原理類似于大家了解并喜歡的袖珍計算器。輸入一個數字,然后按+,輸入另外一個數字,然后再按+,諸如此類。輸入結束時,按=即可得到當前的總和。
從哪里開始測試Sum()方法呢?應該堅持從最簡單的測試開始,比如測試Sum()默認返回0。代碼清單2.6給出了以上做法。
代碼清單2.6? 針對Calculator的Sum()方法的最簡單測試
[Test] ?public?void?Sum_NoAddCalls_DefaultsToZero() ?{ ?????Calculator?calc?=?new?Calculator(); ??????int?lastSum?=?calc.Sum(); ??????Assert.AreEqual(0,lastSum); ?} ? 我們不能在調用Add()方法之前寫其他測試,所以我們下一個測試必須調用Add()并對Sum()返回的數值作斷言。代碼清單2.7給出了附有新測試方法的測試類。
代碼清單2.7? 兩個測試,其中第二個調用了Add()方法
[SetUp] ?public?void?Setup() ?{ ?????calc?=?new?Calculator(); ?} ??[Test] ?public?void?Sum_NoAddCalls_DefaultsToZero() ?{ ?????int?lastSum?=?calc.Sum(); ?????Assert.AreEqual(0,lastSum); ?} ??[Test] ?public?void?Add_CalledOnce_SavesNumberForSum() ?{ ?????calc.Add(1); ?????int?lastSum?=?calc.Sum(); ?????Assert.AreEqual(1,lastSum); ?} ? 請注意,這里的測試在[SetUp]相關的方法中初始化Calculator對象。這是個不錯的想法,因為這樣可以節省寫測試的時間,使得代碼更 少,而且確保用同樣的方法來初始化Calculator。同樣,也有更好的測試維護性,如果改變Calculator的構造函數,只需在一個地方改變初始 化代碼,而無需在每個測試中都更改new調用。
到目前為止,一切都很好。但是如果被測方法依賴于外部資源又會怎樣呢?比如依賴于文件系統、數據庫、Web服務或者任何我們很難控制的其他東西。這正是我們開始新建測試樁對象(stub)、偽對象(fake)和模擬對象(mock)的時候,我們將在接下來幾章中討論到。
轉載于:https://www.cnblogs.com/shihao/archive/2012/04/19/2456811.html
總結
以上是生活随笔為你收集整理的针对状态的间接测试的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。