單元測試 (白盒測試)
1模組介面:
內部檢查:傳輸參數的數目、屬性、單位、次序是否匹配;全程變數的定義是否一致;只做輸入的變元有無被修改,等等
內部檢查:開啟、結束、關閉檔案的操作;檔案和屬性;I\O錯誤處理;輸出拼字,等等
2局部資料結構:
資料說明;初始化與預設值的設定;變數名拼字;資料類型的相容性;上\下溢出及地址異常,等等。
3重要的執行通路:
由於窮盡測試的不可能,故通常針對最常見的錯誤設計測試方案。
較常見的錯誤有: 計算次序問題; 不同類型混合運算; 初值設定錯誤; 精度問題; 運算式錯誤 迴圈終止條件錯誤;
4出錯處理通路:
預見出現錯誤的條件,設定處理。
較常見的問題有:
輸出的錯誤資訊難以理解,
不能確定錯誤位置
描述的錯誤與實際錯誤不符
處理之前系統已經幹預
處理不正確
5邊界條件——單元測試中最後,也可能是最重要的任務,因為軟體常在其邊界失效。
單元測試的主要手段:
1代碼審查
走讀 walk_through:
例如 Lucent Technologies 的測試策略,是由三人一組(包括author,reader,和recorder),逐行檢查原始碼。 預演由人扮演computer,類比執行情況
優點:一次審查科發現多個錯誤,不必改一個測一個。
2製作測試軟體:
Stub(存根)和Driver(驅動)軟體的編寫,屬額外開支。模組高內聚可簡化這一過程。
設計測試方案
任務:
1預定要測試的功能
2設計輸入的測試資料
3列出預期結果
主要技術:
1邏輯覆蓋(Logical coverage)——適用於白盒測試 覆蓋程度由弱到強依次為:
(1)語句覆蓋(Statement coverage):每個語句至少執行依次。
(2)判定覆蓋(Branch coverage):再(1)的基礎上,每個判定的每個分支至少執行依次。
(3)條件覆蓋(Condition coverage):在(1)的基礎上,使每個判定運算式的每個條件都取到各種可能的結果。
(4)判定/條件覆蓋:即判定覆蓋∩條件覆蓋
(5)條件組合覆蓋:每個判定運算式中條件的各種肯能組合都至少出現依次。
(6)點覆蓋=語句覆蓋
(7)邊覆蓋=判定覆蓋
(8)路徑覆蓋(Path coverage):每條可能的路徑都至少執行依次,若圖中有環,則每個環至少經過依次。
(9)路徑覆蓋/條件組合覆蓋
2等價劃分(Equivalence Partitioning)——適用於黑箱測試
是一種很常用的測試方法。其對測試資料的選擇是基於對程式功能的分析,按照程式輸入要求和輸出要求,選擇若干資料進行測試功能的過程。
(1)劃分經驗
當規定了輸入範圍時:無效類【 有效類 】無效類 當規定了一組輸入值,且對不同值做不同處理時。
例:教工分房方案中,按教授、副教授、講師、助教分別計分=》有效類4個;無效類1個(4個有效類之外)
當規定了輸入的規則時:例:PASCAL 語言規定,每個語言以“;”結束=》有效類1個;無效類若干(以“,”結束、以“:”結束、以空格結束等等)
當輸入為整型時:有效類可分為Z+、0、Z- 三種
當處理表格時:有效類可分為空白表、含一項的表、含多項的表等
(2)設計步驟
設計一個新方案以儘可能多地覆蓋尚未被覆蓋的有效等價類別;重複這一步驟直到所有有效類都被覆蓋為止。
設計一個新方案以覆蓋一個且僅一個尚未被覆蓋的無效等價類別;重複這一步驟直到所有無效類都背覆蓋為止。(通常程式執行一個錯誤後即不繼續檢查其他錯誤)
3邊界值分析(Boundary Value Analysis)
注意: (1)程式最容易在邊界發生錯誤; (2)通常與等價劃分結合進行。
4錯誤推測(Failure Prediction)
思路: (1)列出可能有的錯誤; (2)列出容易發生錯誤的特殊情況。
以此為基礎設計測試方案
根據:經驗、直覺
5實用策略(Practical Strategies) 黑盒設計+白盒補充
(1)在任何情況下都應首先實用邊界值分析的方法;
(2)必要時用等價劃分法補充;
(3)必要時再用錯誤推測法補充;
(4)對照程式邏輯,檢查測試方案。可根據對程式可靠性的要求採用不同的邏輯覆蓋標準,必要時補充一些測試方案。
註:即使用上述綜合策略設計測試方案,仍不能保證發現一切錯誤。例如Lucent公司經過包括逐行檢查原始碼在內的多方面測試之後,其軟體能達標啟動並執行成功率為 80%,可想而知,沒有經過測試的軟體運行成功率更低。