測試方法
白盒測試的測試方法中運用最為廣泛的是基本路徑測試法。
簡介
基本路徑測試法是在程式控制流圖的基礎上,通過分析控制構造的環路複雜性,導出基本可執行路徑集合,從而設計測試用例的方法。
設計出的測試用例要保證在測試中程式的每個可執行語句至少執行一次。
在程式控制流圖的基礎上,通過分析控制構造的環路複雜性,導出基本可執行路徑集合,從而設計測試用例。包括以下4個步驟和一個工具方法:
1.程式的控制流圖:描述程式控制流的一種圖示方法。
2.程式圈複雜度:McCabe複雜性度量。從程式的環路複雜性可導出程式基本路徑集合中的獨立路徑條數,這是確定程式中每個可執行語句至少執行一次所必須的測試用例數目的上界。
3. 導出測試用例:根據圈複雜度和程式結構設計用例數據輸入和預期結果。
4. 準備測試用例:確保基本路徑集中的每一條路徑的執行。
工具方法
圖形矩陣:是在基本路徑測試中起輔助作用的軟體工具,利用它可以實現自動地確定一個基本路徑集。
程式的控制流圖:描述程式控制流的一種圖示方法。
圓圈稱為控制流圖的一個結點,表示一個或多個無分支的語句或源程式語句
流圖只有二種圖形符號:
圖中的每一個圓稱為流圖的結點,代表一條或多條語句。
流圖中的箭頭稱為邊或連線,代表控制流
任何過程設計都要被翻譯成控制流圖。
如何根據程式流程圖畫出控制流程圖?
在將程式流程圖簡化成控制流圖時,應注意:
在選擇或多分支結構中,分支的匯聚處應有一個匯聚結點。
邊和結點圈定的區域叫做區域,當對區域計數時,圖形外的區域也應記為一個區域。
步驟
基本路徑測試法的步驟:
第一步:畫出控制流圖
流程圖用來描述程式控制結構。可將流程圖映射到一個相應的流圖(假設流程圖的菱形決定框中不包含複合條件)。在流圖中,每一個圓,稱為流圖的結點,代表一個或多個語句。一個處理方框序列和一個菱形決測框可被映射為一個結點,流圖中的箭頭,稱為邊或連線,代表控制流,類似於流程圖中的箭頭。一條邊必須終止於一個結點,即使該結點並不代表任何語句(例如:if-else-then結構)。由邊和結點限定的範圍稱為區域。計算區域時應包括圖外部的範圍。
第二步:計算圈複雜度
圈複雜度是一種為程式邏輯複雜性提供定量測度的軟體度量,將該度量用於計算程式的基本的獨立路徑數目,為確保所有語句至少執行一次的測試數量的上界。獨立路徑必須包含一條在定義之前不曾用到的邊。
有以下三種方法計算圈複雜度:
流圖中區域的數量對應於環型的複雜性;
給定流圖G的圈複雜度V(G),定義為V(G)=E-N+2,E是流圖中邊的數量,N是流圖中結點的數量;
給定流圖G的圈複雜度V(G),定義為V(G)=P+1,P是流圖G中判定結點的數量。
第三步:導出測試用例根據上面的計算方法,可得出四個獨立的路徑。(一條獨立路徑是指,和其他的獨立路徑相比,至少引入一個新處理語句或一個新判斷的程式通路。V(G)值正好等於該程式的獨立路徑的條數。)
路徑1:4-14
路徑2:4-6-7-14
路徑3:4-6-8-10-13-4-14
路徑4:4-6-8-11-13-4-14
根據上面的獨立路徑,去設計輸入數據,使程式分別執行到上面四條路徑。
要求
1.保證一個模組中的所有獨立路徑至少被使用一次;
2.對所有邏輯值均需測試 true 和 false;
3.在上下邊界及可操作範圍內運行所有循環;
4.檢查內部數據結構以確保其有效性。
目的
通過檢查軟體內部的邏輯結構,對軟體中的邏輯路徑進行復蓋測試;在程式不同地方設立檢查點,檢查程式的狀態,以確定實際運行狀態與預期狀態是否一致。
優缺點
優點
·迫使測試人員去仔細思考軟體的實現
·可以檢測代碼中的每條分支和路徑
·揭示隱藏在代碼中的錯誤
·對代碼的測試比較徹底
·最最佳化
缺點
·昂貴
·無法檢測代碼中遺漏的路徑和數據敏感性錯誤
·不驗證規格的正確性
局限
但即使每條路徑都測試了仍然可能有錯誤。可能出現的情況如下:
窮舉路徑測試決不能查出程式違反了設計規範,即程式本身是個錯誤的程式。
窮舉路徑測試不可能查出程式中因遺漏路徑而出錯。
窮舉路徑測試可能發現不了一些與數據相關的錯誤。
工具挑選
白盒測試主要用在具有高可靠性要求的軟體領域,例如:軍工軟體、航天航空軟體、工業控制軟體等等。白盒測試工具在選購時應當主要是對開發語言的支持、代碼復蓋的深度、嵌入式軟體的測試和測試的可視化等。
語言支持
白盒測試工具是對原始碼進行的測試,測試的主要內容包括詞法分析與語法分析、靜態錯誤分析、動態檢測等。但是對於不同的開發語言,測試工具實現的方式和內容差別是較大的。測試工具主要支持的開發語言包括:標準C、C++、Visual C++、Java和Visual J++等。
復蓋深度
從復蓋源程式語句的詳盡程度分析,邏輯復蓋標準包括以下不同的復蓋標準:語句復蓋、判定復蓋、條件復蓋、條件判定組合復蓋、多條件復蓋和修正判定條件復蓋。
1.語句復蓋 為了暴露程式中的錯誤,程式中的每條語句至少應該執行一次。因此語句復蓋(Statement Coverage)的含義是:選擇足夠多的測試數據,使被測程式中每條語句至少執行一次。語句復蓋是很弱的邏輯復蓋。
2.判定復蓋比語句復蓋稍強的復蓋標準是判定復蓋(Decision Coverage)。判定復蓋的含義是:設計足夠的測試用例,使得程式中的每個判定至少都獲得一次“真值”或“假值”,或者說使得程式中的每一個取“真”分支和取“假”分支至少經歷一次,因此判定復蓋又稱為分支復蓋。
3.條件復蓋在設計程式中,一個判定語句是由多個條件組合而成的複合判定。為了更徹底地實現邏輯復蓋,可以採用條件復蓋(Condition Coverage)的標準。條件復蓋的含義是:構造一組測試用例,使得每一判定語句中每個邏輯條件的可能值至少滿足一次。
4.多條件復蓋。多條件復蓋也稱條件組合復蓋,它的含義是:設計足夠的測試用例,使得每個判定中條件的各種可能組合都至少出現一次。顯然滿足多條件復蓋的測試用例是一定滿足判定復蓋、條件復蓋和條件判定組合復蓋的。
5.修正條件判定復蓋。修正條件判定復蓋是由歐美的航空/航天製造廠商和使用單位聯合制定的“航空運輸和裝備系統軟體認證標準”,在國外的國防、航空航天領域套用廣泛。這個復蓋度量需要足夠的測試用例來確定各個條件能夠影響到包含的判定的結果。它要求滿足兩個條件:首先,每一個程式模組的入口和出口點都要考慮至少要被調用一次,每個程式的判定到所有可能的結果值要至少轉換一次;其次,程式的判定被分解為通過邏輯操作符(and、or)連線的布爾條件,每個條件對於判定的結果值是獨立的。
不同的測試工具對於代碼的復蓋能力也是不同的,通常能夠支持修正條件判定復蓋的測試工具價格是極其昂貴的。
嵌入式測試
對於嵌入式軟體的測試,我們還需要一方面進一步考慮測試工具對於嵌入式作業系統的支持能力,例如DOS、Vxworks、Neculeus、Linux和Windows CE等;另一方面還需要考慮測試工具對於硬體平台的支持能力,包括是否支持所有64/32/16位CPU 和 MCU,是否可以支持 PCI/VME/CPCI 匯流排。
可視化
白盒測試是工作量巨大並且枯燥的工作,可視化的設計對於測試來說是十分重要的。在選購白盒測試工具時,應當考慮該款測試工具的可視化是否良好,例如:測試過程中是否可以顯示復蓋率的函式分布圖和上升趨勢圖,是否使用不同的顏色區分已執行和未執行的代碼段顯示分配記憶體情況實時圖表等,這些對於測試效率和測試質量的提高是具有很大的作用的。