《代碼大全》第8章介紹了防護式編程,這是一種提升軟件質量技術的有益輔助手段,其核心思想是:程序不該該傳入錯誤數據而被破壞。第22章介紹了開發者測試,測試是最多見的改善質量的活動,有些測試須要開發人員進行,例如單元測試、組件測試和集成測試。程序員
1)檢查全部來源於外部的數據(輸入參數)編程
一、對數據進行合法性校驗,例如確保數字在可接受的範圍內,確保字符串不超長,過濾注入的SQL命令、HTML或XML代碼等。數組
二、在輸入數據時將其轉換爲恰當的類型單元測試
2)處理錯誤輸入數據測試
一、返回中立值,繼續執行操做並簡單地返回一個沒有危害的數值,例如數值能夠返回0,字符串返回空等。編碼
二、換用下一個正確的數據,繼續讀下去直到又找到一條正確記錄爲止。spa
三、返回與前次相同的數據。設計
四、換用最接近的合法值。日誌
五、把警告信息記錄到日誌文件中,再用電子郵件提醒你。對象
六、返回一個錯誤碼,例如用語言內建的異常機制拋出一個異常。
七、把錯誤處理集中在一個全局的子程序或對象中。
八、當錯誤發生時顯示出錯消息。
九、用最穩當的方式在局部處理錯誤。
十、關閉程序。
1)測試方法
一、對每一項相關的需求進行測試,以確保需求都已經實現。
二、對每個相關的設計關注點進行測試,以確保設計已經被實現。
三、用基礎測試和數據流測試對代碼進行完全的考驗。
四、使用一個檢查表,其中記錄着你在本項目迄今爲止所犯的,以及過去所犯的錯誤類型。
2)測試先行
一、假如你首先編寫測試用例,那麼你將更早發現缺陷,也更容易修正它們。
二、首先編寫測試用例,將迫使你在開始寫代碼以前至少思考一下需求和設計。
三、更早地把需求上的問題暴露出來,對於一個糟糕的需求來講,很難寫出測試用例。
3)基礎測試
思想就是測試程序中的每一條語句至少一次,例如if語句須要根據其表達式的複雜程序來修改測試,以確保這個語句徹底通過了測試。確保覆蓋率最簡單的方法就是算一算有多少條經過程序的路徑,而後據此開發出能經過程序裏每條路徑的最少數據的測試用例。下面是基礎測試用例的數量計算方法:
一、對經過子程序的直路,開始的時候記1。
二、遇到下面的每一個關鍵字或等價物時,加1:if、while、repeat、for、and以及or。
三、遇到每個case語句就加1,沒法case語句沒有缺省狀況,則再加1。
4)數據流測試
所有代碼至少有一半是數據聲明和初始化,數據的狀態有3種:
一、已定義,數據已經初始化,但尚未使用。
二、已使用,數據已經用於計算或其它用途。
三、已銷燬,數據曾經定義過,但如今經過某種途徑取消了它的定義。
對變量進行某種操做以前或以後的狀態有:
一、已進入,控制流已經進入一個子程序,但尚未使用該變量。
二、已退出,對變量產生影響以後,控制流當即退出子程序。
正常的數據狀態的組合是變量已定義,已經一次或屢次使用,而且可能已經銷燬。下面是搭配形式:
已定義-已定義,已定義-已退出,已定義-已銷燬,已進入-已銷燬
已進入-已使用,已銷燬-已銷燬,已銷燬-已使用,已使用-已定義
編寫數據流測試用例的關鍵是要對全部可能的定義-使用路徑進行測試。測試每個變量的每個定義,對每個變量測試全部在某處定義而在另外一處使用的組合。
5)測試錦囊
一、猜想錯誤,基於直覺或過去的經驗,猜想程序會在哪裏出錯。
二、邊界值分析,測試邊界值條件,例如小於、等於或大於。
三、幾類壞數據,包括數據太少、太多、無效、長度錯誤、未初始化等。
6)錯誤的分類
一、大多數錯誤的影響範圍是至關有限的。
二、許多錯誤發生在構建的範疇以外,例如頻繁變更且相互矛盾的需求,以及溝通和協調的失效。
三、筆誤是一個常見的問題根源。
四、程序員錯誤理解了這條設計。
五、大多數錯誤很容易修正。
7)預期錯誤的範圍
一、業界的經驗,在已發行的軟件中平均1000行代碼發現1~25個錯誤。
二、微軟的經驗,大約每1000行代碼有10~20個缺陷,而對於已發佈產品則大約是每1000行代碼0.5個缺陷。
三、淨室開發技術,可得到低至每1000行代碼3個缺陷,每1000行代碼0.1個缺陷的錯誤率。
四、團隊軟件開發過程的開發小組,可達到大約每1000行代碼0.06個缺陷。
8)保留測試記錄
一、缺陷的描述,包括報告日期、報告人、標題、編號以及修正日期等。
二、問題的完整描述。
三、復現錯誤所須要的步驟。
四、繞過該問題的建議。
五、相關的缺陷。
六、問題的嚴重程序,例如致命的、嚴重的或代表的。
七、缺陷根源:需求、設計、編碼仍是測試。
八、對編碼缺陷的分類:錯誤賦值、錯誤數組下標、子程序調用錯誤等。
九、修正錯誤所改變的類和子程序。
十、缺陷所影響的代碼行數。
十一、查找該錯誤所花的小時數。
十二、修正錯誤所花費的小時數。