當前位置:首頁 > 百科知識 > 工控 > 正文

白盒測試

白盒測試[1] 又稱結構測試、透明盒測試、邏輯驅動測試或基于代碼的測試。白盒測試是一種測試用例設計方法,盒子指的是被測試的軟件,白盒指的是盒子是可視的,你清楚盒子內部的東西以及里面是如何運作的。"白盒"法全面了解程序內部邏輯結構、對所有邏輯路徑進行測試。"白盒"法是窮舉路徑測試。在使用這一方案時,測試者必須檢查程序的內部結構,從檢查程序的邏輯著手,得出測試數(shù)據(jù)。貫穿程序的獨立路徑數(shù)是天文數(shù)字。 采用什么方法對軟件進行測試呢?常用的軟件測試方法有兩大類:靜態(tài)測試方法和動態(tài)測試方法。其中軟件的靜態(tài)測試不要求在計算機上實際執(zhí)行所測程序,主要以一些人工的模擬技術對軟件進行分析和測試;而軟件的動態(tài)測試是通過輸入一組預先按照一定的測試準則構造的實例數(shù)據(jù)來動態(tài)運行程序,而達到發(fā)現(xiàn)程序錯誤的過程。在動態(tài)分析技術中,最重要的技術是路徑和分支測試。下面要介紹的六種覆蓋測試方法屬于動態(tài)分析方法。

  測試方法

  白盒測試的測試方法有代碼檢查法、靜態(tài)結構分析法、靜態(tài)質量度量法、邏輯覆蓋法、基本路徑測試法、域測試、符號測試、路徑覆蓋和程序變異。

  白盒測試法的覆蓋標準有邏輯覆蓋、循環(huán)覆蓋和基本路徑測試。其中邏輯覆蓋包括語句覆蓋、判定覆蓋、條件覆蓋、判定/條件覆蓋、條件組合覆蓋和路徑覆蓋。六種覆蓋標準發(fā)現(xiàn)錯誤的能力呈由弱到強的變化:

  1.語句覆蓋每條語句至少執(zhí)行一次。

  2.判定覆蓋每個判定的每個分支至少執(zhí)行一次。

  3.條件覆蓋每個判定的每個條件應取到各種可能的值。

  4.判定/條件覆蓋同時滿足判定覆蓋條件覆蓋。

  5.條件組合覆蓋每個判定中各條件的每一種組合至少出現(xiàn)一次。

  6.路徑覆蓋使程序中每一條可能的路徑至少執(zhí)行一次。

  要求

  1.保證一個模塊中的所有獨立路徑至少被使用一次。

  2.對所有邏輯值均需測試true和false。

  3.在上下邊界及可操作范圍內運行所有循環(huán)。

  4.檢查內部數(shù)據(jù)結構以確保其有效性。

  目的

  通過檢查軟件內部的邏輯結構,對軟件中的邏輯路徑進行覆蓋測試;在程序不同地方設立檢查點,檢查程序的狀態(tài),以確定實際運行狀態(tài)與預期狀態(tài)是否一致。

  特點

  依據(jù)軟件設計說明書進行測試、對程序內部細節(jié)的嚴密檢驗、針對特定條件設計測試用例、對軟件的邏輯路徑進行覆蓋測試。

  實施步驟

  1.測試計劃階段:根據(jù)需求說明書,制定測試進度。

  2.測試設計階段:依據(jù)程序設計說明書,按照一定規(guī)范化的方法進行軟件結構劃分和設計測試用例。

  3.測試執(zhí)行階段:輸入測試用例,得到測試結果。

  4.測試總結階段:對比測試的結果和代碼的預期結果,分析錯誤原因,找到并解決錯誤。

  優(yōu)缺點

  優(yōu)點

  1.迫使測試人員去仔細思考軟件的實現(xiàn)

  2.可以檢測代碼中的每條分支和路徑

  3.揭示隱藏在代碼中的錯誤

  4.對代碼的測試比較徹底

  5.最優(yōu)化

  缺點

  1.昂貴

  2.無法檢測代碼中遺漏的路徑和數(shù)據(jù)敏感性錯誤

  3.不驗證規(guī)格的正確性

  局限編輯

  但即使每條路徑都測試了仍然可能有錯誤??赡艹霈F(xiàn)的情況如下:

  窮舉路徑測試決不能查出程序違反了設計規(guī)范,即程序本身是個錯誤的程序。

  窮舉路徑測試不可能查出程序中因遺漏路徑而出錯。

  窮舉路徑測試可能發(fā)現(xiàn)不了一些與數(shù)據(jù)相關的錯誤。

  工具挑選

  白盒測試

  白盒測試

  白盒測試主要用在具有高可靠性要求的軟件領域,例如:軍工軟件、航天航空軟件、工業(yè)控制軟件等等。白盒測試工具在選購時應當主要是對開發(fā)語言的支持、代碼覆蓋的深度、嵌入式軟件的測試和測試的可視化等。

  語言支持

  白盒測試工具是對源代碼進行的測試,測試的主要內容包括詞法分析與語法分析、靜態(tài)錯誤分析、動態(tài)檢測等。但是對于不同的開發(fā)語言,測試工具實現(xiàn)的方式和內容差別是較大的。測試工具主要支持的開發(fā)語言包括:標準C、C++、VisualC++、Java和VisualJ++等。

  覆蓋深度

  從覆蓋源程序語句的詳盡程度分析,邏輯覆蓋標準包括以下不同的覆蓋標準:語句覆蓋、判定覆蓋、條件覆蓋、條件判定組合覆蓋、多條件覆蓋和修正判定條件覆蓋。

  1.語句覆蓋為了暴露程序中的錯誤,程序中的每條語句至少應該執(zhí)行一次。因此語句覆蓋(StatementCoverage)的含義是:選擇足夠多的測試數(shù)據(jù),使被測程序中每條語句至少執(zhí)行一次。語句覆蓋是很弱的邏輯覆蓋。

  2.判定覆蓋比語句覆蓋稍強的覆蓋標準是判定覆蓋(DecisionCoverage)。判定覆蓋的含義是:設計足夠的測試用例,使得程序中的每個判定至少都獲得一次“真值”或“假值”,或者說使得程序中的每一個取“真”分支和取“假”分支至少經(jīng)歷一次,因此判定覆蓋又稱為分支覆蓋。

  3.條件覆蓋在設計程序中,一個判定語句是由多個條件組合而成的復合判定。為了更徹底地實現(xiàn)邏輯覆蓋,可以采用條件覆蓋(ConditionCoverage)的標準。條件覆蓋的含義是:構造一組測試用例,使得每一判定語句中每個邏輯條件的可能值至少滿足一次。

  4.多條件覆蓋。多條件覆蓋也稱條件組合覆蓋,它的含義是:設計足夠的測試用例,使得每個判定中條件的各種可能組合都至少出現(xiàn)一次。顯然滿足多條件覆蓋的測試用例是一定滿足判定覆蓋、條件覆蓋和條件判定組合覆蓋的。

  5.修正條件判定覆蓋。修正條件判定覆蓋是由歐美的航空/航天制造廠商和使用單位聯(lián)合制定的“航空運輸和裝備系統(tǒng)軟件認證標準”,在國外的國防、航空航天領域應用廣泛。這個覆蓋度量需要足夠的測試用例來確定各個條件能夠影響到包含的判定的結果。它要求滿足兩個條件:首先,每一個程序模塊的入口和出口點都要考慮至少要被調用一次,每個程序的判定到所有可能的結果值要至少轉換一次;其次,程序的判定被分解為通過邏輯操作符(and、or)連接的布爾條件,每個條件對于判定的結果值是獨立的。

  不同的測試工具對于代碼的覆蓋能力也是不同的,通常能夠支持修正條件判定覆蓋的測試工具價格是極其昂貴的。

  嵌入式測試

  對于嵌入式軟件的測試,我們還需要一方面進一步考慮測試工具對于嵌入式操作系統(tǒng)的支持能力,例如DOS、Vxworks、Neculeus、Linux和WindowsCE等;另一方面還需要考慮測試工具對于硬件平臺的支持能力,包括是否支持所有64/32/16位CPUMCU,是否可以支持PCI/VME/CPCI總線。

  可視化

  白盒測試是工作量巨大并且枯燥的工作,可視化的設計對于測試來說是十分重要的。在選購白盒測試工具時,應當考慮該款測試工具的可視化是否良好,例如:測試過程中是否可以顯示覆蓋率的函數(shù)分布圖和上升趨勢圖,是否使用不同的顏色區(qū)分已執(zhí)行和未執(zhí)行的代碼段顯示分配內存情況實時圖表等,這些對于測試效率和測試質量的提高是具有很大的作用的。

  測試方法

  白盒測試的測試方法中運用最為廣泛的是基本路徑測試法。

  基本路徑測試法是在程序控制流圖的基礎上,通過分析控制構造的環(huán)路復雜性,導出基本可執(zhí)行路徑集合,從而設計測試用例的方法。設計出的測試用例要保證在測試中程序的每個可執(zhí)行語句至少執(zhí)行一次。

  在程序控制流圖的基礎上,通過分析控制構造的環(huán)路復雜性,導出基本可執(zhí)行路徑集合,從而設計測試用例。包括以下4個步驟和一個工具方法:

  1.程序的控制流圖:描述程序控制流的一種圖示方法。

  2.程序圈復雜度:McCabe復雜性度量。從程序的環(huán)路復雜性可導出程序基本路徑集合中的獨立路徑條數(shù),這是確定程序中每個可執(zhí)行語句至少執(zhí)行一次所必須的測試用例數(shù)目的上界。

  3.導出測試用例:根據(jù)圈復雜度和程序結構設計用例數(shù)據(jù)輸入和預期結果。

  4.準備測試用例:確?;韭窂郊械拿恳粭l路徑的執(zhí)行。

  工具方法

  1.圖形矩陣:是在基本路徑測試中起輔助作用的軟件工具,利用它可以實現(xiàn)自動地確定一個基本路徑集。

  2.程序的控制流圖:描述程序控制流的一種圖示方法。

  3.圓圈稱為控制流圖的一個結點,表示一個或多個無分支的語句或源程序語句。

  流圖只有二種圖形符號:

  1.圖中的每一個圓稱為流圖的結點,代表一條或多條語句。

  2.流圖中的箭頭稱為邊或連接,代表控制流,任何過程設計都要被翻譯成控制流圖。

  在將程序流程圖簡化成控制流圖時,應注意:

  1.在選擇或多分支結構中,分支的匯聚處應有一個匯聚結點。

  2.邊和結點圈定的區(qū)域叫做區(qū)域,當對區(qū)域計數(shù)時,圖形外的區(qū)域也應記為一個區(qū)域。

  步驟

  基本路徑測試法的步驟:

  第一步:畫出控制流圖

  流程圖用來描述程序控制結構??蓪⒘鞒虉D映射到一個相應的流圖(假設流程圖的菱形決定框中不包含復合條件)。在流圖中,每一個圓,稱為流圖的結點,代表一個或多個語句。一個處理方框序列和一個菱形決測框可被映射為一個結點,流圖中的箭頭,稱為邊或連接,代表控制流,類似于流程圖中的箭頭。一條邊必須終止于一個結點,即使該結點并不代表任何語句(例如:if-else-then結構)。由邊和結點限定的范圍稱為區(qū)域。計算區(qū)域時應包括圖外部的范圍。

  第二步:計算圈復雜度

  圈復雜度是一種為程序邏輯復雜性提供定量測度的軟件度量,將該度量用于計算程序的基本的獨立路徑數(shù)目,為確保所有語句至少執(zhí)行一次的測試數(shù)量的上界。獨立路徑必須包含一條在定義之前不曾用到的邊。

  有以下三種方法計算圈復雜度:

  流圖中區(qū)域的數(shù)量對應于環(huán)型的復雜性;

  給定流圖G的圈復雜度V(G),定義為V(G)=E-N+2,E是流圖中邊的數(shù)量,N是流圖中結點的數(shù)量;

  給定流圖G的圈復雜度V(G),定義為V(G)=P+1,P是流圖G中判定結點的數(shù)量。

  第三步:導出測試用例根據(jù)上面的計算方法,可得出四個獨立的路徑。(一條獨立路徑是指,和其他的獨立路徑相比,至少引入一個新處理語句或一個新判斷的程序通路。V(G)值正好等于該程序的獨立路徑的條數(shù)。)

  路徑1:4-14

  路徑2:4-6-7-14

  路徑3:4-6-8-10-13-4-14

  路徑4:4-6-8-11-13-4-14

  根據(jù)上面的獨立路徑,去設計輸入數(shù)據(jù),使程序分別執(zhí)行到上面四條路徑。

  相關區(qū)別

  黑盒測試概述

  黑盒測試也稱功能測試或數(shù)據(jù)驅動測試,它是在已知產品所應具有的功能,通過測試來檢測每個功能是否都能正常使用,在測試時,把程序看作一個不能打開的黑盒子,在完全不考慮程序內部結構和內部特性的情況下,測試者在程序接口進行測試,它只檢查程序功能是否按照需求規(guī)格說明書的規(guī)定正常使用,程序是否能適當?shù)亟邮蛰斎霐?shù)據(jù)而產生正確的輸出信息,并且保持外部信息(如數(shù)據(jù)庫或文件)的完整性。黑盒測試方法主要有等價類劃分、邊值分析、因—果圖、錯誤推測等,主要用于軟件確認測試。“黑盒”法著眼于程序外部結構、不考慮內部邏輯結構、針對軟件界面和軟件功能進行測試。“黑盒”法是窮舉輸入測試,只有把所有可能的輸入都作為測試情況使用,才能以這種方法查出程序中所有的錯誤。實際上測試情況有無窮多個,人們不僅要測試所有合法的輸入,而且還要對那些不合法但是可能的輸入進行測試。

  白盒測試也稱結構測試或邏輯驅動測試,它是知道產品內部工作過程,可通過測試來檢測產品內部動作是否按照規(guī)格說明書的規(guī)定正常進行,按照程序內部的結構測試程序,檢驗程序中的每條通路是否都有能按預定要求正確工作,而不顧它的功能,白盒測試的主要方法有邏輯驅動、基路測試等,主要用于軟件驗證。

  “白盒”法全面了解程序內部邏輯結構、對所有邏輯路徑進行測試。“白盒”法是窮舉路徑測試。軟件人員使用白盒測試方法,主要想對程序模塊進行如下的檢查:

  1.對程序模塊的所有獨立的執(zhí)行路徑至少測試一次;

  2.對所有的邏輯判定,取“真”與取“假”的兩種情況都至少測試一次;

  3.在循環(huán)的邊界和運行界限內執(zhí)行循環(huán)體;

  4.測試內部數(shù)據(jù)結構的有效性,等。

  具體包含的邏輯覆蓋有:–語句覆蓋–判定覆蓋–條件覆蓋–判定-條件覆蓋–條件組合覆蓋–路徑覆蓋。

  區(qū)別

  白盒測試技術(WhiteBoxTesting):深入到代碼一級的測試,使用這種技術發(fā)現(xiàn)問題最早,效果也是最好的。該技術主要的特征是測試對象進入了代碼內部,根據(jù)開發(fā)人員對代碼和對程序的熟悉程度,對有需要的部分進行在軟件編碼階段,開發(fā)人員根據(jù)自己對代碼的理解和接觸所進行的軟件測試叫做白盒測試。這一階段測試以軟件開發(fā)人員為主,在JAVA平臺使用Xunit系列工具進行測試,Xunit測試工具是類一級的測試工具對每一個類和該類的方法進行測試。

  黑盒測試技術(BlackBoxTesting):黑盒測試的內容主要有以下幾個方面,但是主要還是功能部分。主要是覆蓋全部的功能,可以結合兼容,性能測試等方面進行,根據(jù)軟件需求,設計文檔,模擬客戶場景隨系統(tǒng)進行實際的測試,這種測試技術是使用最多的測試技術涵蓋了測試的方方面面,可以考慮以下方面:

  1.正確性(Correctness):計算結果,命名等方面。

  2.可用性(Usability):是否可以滿足軟件的需求說明。

  3.邊界條件(BoundaryCondition):輸入部分的邊界值,就是使用一般書中說的等價類劃分,試試最大最小和非法數(shù)據(jù)等等。

  4.性能(Performance):正常使用的時間內系統(tǒng)完成一個任務需要的時間,多人同時使用的時候響應時間在可以接受范圍內。J2EE技術實現(xiàn)的系統(tǒng)在性能方面更是需要照顧的,一般原則是3秒以下接受,3-5秒可以接受,5秒以上就影響易用性了。如果在測試過程中發(fā)現(xiàn)性能問題,修復起來是非常艱難的,因為這常常意味著程序的算法不好,結構不好,或者設計有問題。因此在產品開發(fā)的開始階段,就要考慮到軟件的性能問題

  5.壓力測試(Stress):多用戶情況可以考慮使用壓力測試工具,建議將壓力和性能測試結合起來進行。如果有負載平衡的話還要在服務器端打開監(jiān)測工具,查看服務器CPU使用率,內存占用情況,如果有必要可以模擬大量數(shù)據(jù)輸入,對硬盤的影響等等信息。如果有必要的話必須進行性能優(yōu)化(軟硬件都可以)。這里的壓力測試針對的是某幾項功能。

  6.錯誤恢復(ErrorRecovery):錯誤處理,頁面數(shù)據(jù)驗證,包括突然間斷電,輸入臟數(shù)據(jù)等。

  7.安全性測試(Security):這個領域正在研究中,防火墻、補丁包、殺毒軟件等的就不必說了,不過可以考慮。破壞性測試時任意看了一些資料后得知,這里面涉及到的知識、內容可以寫本書了,不是一兩句可以說清的,特別是一些商務網(wǎng)站,或者跟錢有關,或者和公司秘密有關的web更是需要這方面的測試,在外國有一種專門干這一行的人叫安全顧問,可以審核代碼,提出安全建議,出現(xiàn)緊急事件時的處理辦法等,在國內沒有聽說哪里有專門搞安全技術測試的內容。

  8.兼容性(Compatibility):不同瀏覽器,不同應用程序版本在實現(xiàn)功能時的表現(xiàn)不同的上網(wǎng)方式,如果你測試的是一個公共網(wǎng)站的話。

  三步法

  1.根據(jù)代碼的功能,人工設計測試用例進行基本功能測試;

  2.統(tǒng)計白盒覆蓋率,為未覆蓋的白盒單位設計測試用例,實現(xiàn)完整的白盒覆蓋,比較理想的覆蓋率是實現(xiàn)100%語句、條件、分支、路徑覆蓋;

  3.自動生成大量的測試用例,捕捉"程序員未處理某些特殊輸入"形成的錯誤。

  第1步的測試用例通常是現(xiàn)成的,因為詳細設計文檔會規(guī)定程序的基本功能,沒有文檔的,程序員在編程時也要想清楚程序的功能,這些基本功能就是基本測試用例;

  第2步是在第1步的基礎上,檢查未覆蓋的白盒單位,由于未覆蓋的邏輯單位通常對應未測試的等價類,因此第2步可以找出第1步所遺漏的測試用例;

  第3步用自動動態(tài)測試彌補第2步的固有缺陷。

  "三步法"盡量避免重復工作,白盒方法和黑盒方法相結合,人工方法和自動方法相補充,如果第2步的覆蓋率比較理想,那么基本上可以保證找出所有等價類。在開發(fā)過程允許的限度內,"三步法"已接近極限,當?shù)闷?quot;徹底測試"四個字。


內容來自百科網(wǎng)