原創(chuàng)|行業(yè)資訊|編輯:龔雪|2014-03-19 10:01:46.000|閱讀 554 次
概述:單元測試在整個(gè)軟件測試工程中非常重要,本文總結(jié)了單元測試需要注意的一些事項(xiàng)。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
19. 使用顯式斷言
應(yīng)該總是優(yōu)先使用 assertEquals(a, b) 而不是 assertTrue(a == b), 因?yàn)榍罢邥o出為何導(dǎo)致測試失敗的更有意義的信息. 在事先不確定輸入值的情況下, 這條規(guī)則尤為重要, 比如之前使用隨機(jī)參數(shù)值組合的例子.
20. 提供反向測試
反向測試是指刻意編寫問題代碼, 來驗(yàn)證魯棒性和能否正確的處理錯(cuò)誤.
假設(shè)如下方法的參數(shù)如果傳進(jìn)去的是負(fù)數(shù), 會立馬拋出異常:
void setLength(double length) throws IllegalArgumentExcepti
可以用下面的方法來測試這個(gè)特例是否被正確處理:
try {
set Length(-1.0);
fail(); // If we get here, something went wrong
}
catch (IllegalArgumentException exception) {
// If we get here, all is fine
}
21. 代碼設(shè)計(jì)時(shí)謹(jǐn)記測試
編寫和維護(hù)單元測試的代價(jià)是很高的, 減少代碼中的公有接口和循環(huán)復(fù)雜度是降低成本, 使高覆蓋率測試代碼更易于編寫和維護(hù)的有效方法.
一些建議:
使類成員常量化, 在構(gòu)造函數(shù)中進(jìn)行初始化. 減少 setter 方法的數(shù)量.
限制過度使用繼承和公有虛函數(shù).
通過使用友元類 (C++) 或包作用域 (JAVA) 來減少公有接口.
避免不必要的邏輯分支.
在邏輯分支中編寫盡可能少的代碼.
在公有和私有接口中盡量多用異常和斷言驗(yàn)證參數(shù)參數(shù)的有效性.
限制使用快捷函數(shù). 對于黑箱而言, 所有方法都必須一視同仁的進(jìn)行測試. 考慮以下簡短的例子:
public void scale(double x0, double y0, double scaleFactor)
{
// scaling logic
}
public void scale(double x0, double y0)
{
scale(x0, y0, 1.0);
}
刪除后者可以簡化測試, 但用戶代碼的工作量也將略微增加.
22. 不要訪問預(yù)定的外部資源
單元測試代碼不應(yīng)該假定外部的執(zhí)行環(huán)境, 以便在任何時(shí)候/任何地方都能執(zhí)行. 為了向測試提供必需的資源, 這些資源應(yīng)該由測試本身提供.
比如一個(gè)解析某類型文件的類, 可以把文件內(nèi)容嵌入到測試代碼里, 在測試的時(shí)候?qū)懭氲脚R時(shí)文件, 測試結(jié)束再刪除, 而不是從預(yù)定的地址直接讀取.
23. 權(quán)衡測試成本
不寫單元測試的代價(jià)很高, 但是寫單元測試的代價(jià)同樣很高. 要在這兩者之間做適當(dāng)?shù)臋?quán)衡, 如果用執(zhí)行覆蓋率來衡量, 業(yè)界標(biāo)準(zhǔn)通常在 80% 左右.
很典型的, 讀寫外部資源的錯(cuò)誤處理和異常處理就很難達(dá)到百分百的執(zhí)行覆蓋率. 模擬數(shù)據(jù)庫在事務(wù)處理到一半時(shí)發(fā)生故障并不是辦不到, 但相對于進(jìn)行大范圍的代碼審查, 代價(jià)可能太大了.
24. 合理安排測試優(yōu)先次序
單元測試是典型的自底向上過程, 如果沒有足夠的資源測試一個(gè)系統(tǒng)的所有模塊, 就應(yīng)該先把重點(diǎn)放在較底層的模塊.
25. 為測試失敗做好準(zhǔn)備
考慮下面的這個(gè)例子:
Handle handle = manager.getHandle();
assertNotNull(handle);
String handleName = handle.getName();
assertEquals(handleName, "handle-01");
如果第一個(gè)斷言失敗, 緊接其后的語句會導(dǎo)致代碼崩潰, 剩下的測試都將不被執(zhí)行. 任何時(shí)候都要為測試失敗做好準(zhǔn)備, 避免單個(gè)失敗的測試項(xiàng)中斷整個(gè)測試套件的執(zhí)行. 上面的例子可以重寫成:
Handle handle = manager.getHandle();
assertNotNull(handle);
if (handle == null) return;
String handleName = handle.getName();
assertEquals(handleName, "handle-01");
26. 寫測試用例重現(xiàn)BUG
每上報(bào)一個(gè) bug, 都要寫一個(gè)測試用例來重現(xiàn)這個(gè) bug (即無法通過測試), 并用它作為成功修正代碼的標(biāo)準(zhǔn).
27. 了解局限
單元測試永遠(yuǎn)無法證明代碼的正確性
一個(gè)跑失敗的測試可能表明代碼有錯(cuò)誤, 但一個(gè)跑成功的測試什么也證明不了.
單元測試最有效的應(yīng)用場合是驗(yàn)證和,以及回歸測試: 當(dāng)新功能增加和代碼進(jìn)行重構(gòu)的同時(shí),會不會影響到舊功能的正確性.
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn