ch52白盒測試課件_第1頁
ch52白盒測試課件_第2頁
ch52白盒測試課件_第3頁
ch52白盒測試課件_第4頁
ch52白盒測試課件_第5頁
已閱讀5頁,還剩233頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

概覽在本章中,我們將學(xué)習(xí):結(jié)構(gòu)性白盒測試概述

程序結(jié)構(gòu)分析

邏輯覆蓋

結(jié)構(gòu)性測試案例

概覽在本章中,我們將學(xué)習(xí):1課程目錄結(jié)構(gòu)測試概述

程序結(jié)構(gòu)分析

邏輯覆蓋

結(jié)構(gòu)測試案例分析結(jié)構(gòu)測試工具課程目錄結(jié)構(gòu)測試概述2結(jié)構(gòu)性測試(1)程序?qū)崿F(xiàn)是已知的,是測試人員能夠根據(jù)功能實際實現(xiàn)的方式來標(biāo)識測試用例,又稱“白盒測試”、“透明盒測試”。結(jié)構(gòu)性測試(1)程序?qū)崿F(xiàn)是已知的,是測試人員能夠根據(jù)功能實際3結(jié)構(gòu)性測試(2)規(guī)格說明規(guī)格說明程序程序測試用例(方法A)測試用例(方法B)方法A覆蓋的區(qū)域比方法B覆蓋的區(qū)域大,但兩種方法的覆蓋區(qū)域只能在程序?qū)崿F(xiàn)部分有兩種維恩圖來表示功能性測試:結(jié)構(gòu)性測試(2)規(guī)格說明規(guī)格說明程序程序測試用例測試用例方法4功能性測試與結(jié)構(gòu)性測試比較單獨使用都有其局限性;最好的方法:結(jié)合兩種方法。功能性測試結(jié)構(gòu)性測試只利用規(guī)格說明標(biāo)識測試用例只利用程序源代碼標(biāo)識測試用例如果程序?qū)崿F(xiàn)了未描述的行為,功能測試無法意識到。如果已描述的行為未能實現(xiàn),結(jié)構(gòu)性測試無法意識到。冗余度大,可能會有漏洞具有覆蓋率指標(biāo)功能性測試與結(jié)構(gòu)性測試比較單獨使用都有其局限性;功能性測試結(jié)5結(jié)構(gòu)測試定義

把測試對象看做一個透明的盒子白盒測試是根據(jù)被測程序的內(nèi)部結(jié)構(gòu)設(shè)計測試用例并完成測試的一種測試方法白盒測試或邏輯驅(qū)動測試基于一個應(yīng)用代碼的內(nèi)部邏輯知識,測試覆蓋全部代碼、分支、路徑和條件結(jié)構(gòu)測試定義把測試對象看做一個透明的盒子6結(jié)構(gòu)測試特點可以構(gòu)成測試數(shù)據(jù)使特定程序部分得到測試有一定的充分性度量手段可獲得較多工具支持通常只用于單元測試結(jié)構(gòu)測試特點可以構(gòu)成測試數(shù)據(jù)使特定程序部分得到測試7結(jié)構(gòu)測試的方法靜態(tài)測試方法:程序結(jié)構(gòu)分析代碼走查代碼審查控制流分析數(shù)據(jù)流分析信息流分析動態(tài)測試方法:邏輯覆蓋語句覆蓋分支覆蓋條件覆蓋分支-條件覆蓋路徑覆蓋結(jié)構(gòu)測試的方法靜態(tài)測試方法:動態(tài)測試方法:8代碼覆蓋率采用白盒法進行測試時,考慮的是測試用例對程序內(nèi)部邏輯的覆蓋程度最徹底的白盒法是覆蓋程序中的每一條路徑,但這往往無法實現(xiàn)采用其它一些標(biāo)準(zhǔn)來量度覆蓋的程度,并希望覆蓋程度盡可能高些代碼覆蓋率采用白盒法進行測試時,考慮的是測試用例對程序內(nèi)部邏9課程目錄結(jié)構(gòu)測試概述程序結(jié)構(gòu)分析

邏輯覆蓋

結(jié)構(gòu)測試案例分析結(jié)構(gòu)測試工具使用課程目錄結(jié)構(gòu)測試概述10靜態(tài)測試靜態(tài)測試包括代碼審查和代碼走查,此方法是軟件測試的有效手段靜態(tài)測試靜態(tài)測試包括代碼審查和代碼走查,此方法是軟件測試的有11靜態(tài)測試技術(shù)特點是指無須執(zhí)行被測代碼,而是借助專用的軟件測試工具評審軟件文檔或程序,度量程序靜態(tài)復(fù)雜度,檢查軟件是否符合編程標(biāo)準(zhǔn),借以發(fā)現(xiàn)編寫的程序的不足之處,減少錯誤出現(xiàn)的概率。靜態(tài)測試在主機上完成,不需目標(biāo)系統(tǒng)支持,測試的主要內(nèi)容有編程標(biāo)準(zhǔn)驗證、數(shù)據(jù)流分析技術(shù)、質(zhì)量度量信息、代碼結(jié)構(gòu)可視化顯示、測試外殼的創(chuàng)建。由此看出,靜態(tài)測試只是對代碼進行掃描分析,檢測它的語法規(guī)則復(fù)雜度等是否符合要求,主要是為軟件的質(zhì)量保證提供依據(jù),以提高軟件的可靠性和易維護性靜態(tài)測試可以手工、自動;靜態(tài)測試技術(shù)特點是指無須執(zhí)行被測代碼,而是借助專用的軟件測試12靜態(tài)測試技術(shù)特點靜態(tài)測試不必動態(tài)地執(zhí)行程序,也就不必要進行測試用例設(shè)計和結(jié)果判讀等工作;靜態(tài)測試可以由人工進行,充分發(fā)揮人的邏輯思維優(yōu)勢。靜態(tài)測試試是不需要特別條件,容易開展。靜態(tài)測試技術(shù)特點靜態(tài)測試不必動態(tài)地執(zhí)行程序,也就不必要進行測13桌面檢查桌面檢查由程序員閱讀自己所編的程序。存在一下問題:心理上的原因,沒有發(fā)現(xiàn)錯誤的欲望;人存在思維定勢;如果對功能理解錯誤,不容易糾正;相當(dāng)于調(diào)試程序。桌面檢查桌面檢查由程序員閱讀自己所編的程序。14代碼走查與代碼審查CodeInspection&Walkthrough:是由若干程序員與測試員組成一個小組,集體閱讀并討論程序或者用“腦”執(zhí)行并檢查程序的過程。分兩步走:預(yù)先做準(zhǔn)備工作;舉行會議并討論;代碼走查與代碼審查CodeInspection&Wal15代碼走查與代碼審查的優(yōu)點避免了桌面檢查的問題;一旦發(fā)現(xiàn)錯誤,就可以定位錯誤的位置和性質(zhì),調(diào)試所需要化的代價低;一次能夠揭示一批錯誤,而不是一個錯誤;避免了動態(tài)調(diào)試的一些問題;代碼走查與代碼審查的優(yōu)點避免了桌面檢查的問題;16代碼走查與代碼審查的優(yōu)勢能夠有效地發(fā)現(xiàn)30%~70%的邏輯設(shè)計和編碼錯誤;IBM統(tǒng)計使用代碼審查的方法,錯誤的檢測效率高達全部查處錯誤的80%Myers的研究發(fā)現(xiàn)代碼審查和代碼走查平均查處全部錯誤的38%。研究表明:使用代碼走查與代碼審查發(fā)現(xiàn)某類錯誤比用計算機測試更有效,而對另一類錯誤情況正好相反。代碼走查與代碼審查與計算機測試是相互補充的,缺少任何一種方法都會使錯誤的檢測率損失。代碼走查與代碼審查的優(yōu)勢能夠有效地發(fā)現(xiàn)30%~70%的邏輯設(shè)17代碼審查代碼審查測試內(nèi)容包括:檢查代碼和設(shè)計的一致性;檢查代碼對標(biāo)準(zhǔn)的遵循、可讀性;檢查代碼的邏輯表達的正確性;檢查代碼結(jié)構(gòu)的合理性;代碼審查是由一組程序和錯誤檢查技術(shù)組成,并且以代碼審查組的方式進行。代碼審查代碼審查測試內(nèi)容包括:18代碼審查組代碼審查組由4個人組成,1個組長,組長的條件:稱職的程序員;但不是被測程序的編寫者;不需要對所檢查的程序很熟悉;要有較強的組織協(xié)調(diào)能力和語言能力;組長的職責(zé):分配資料;安排計劃;主持會議;紀(jì)錄并保存被發(fā)現(xiàn)的錯誤;代碼審查組代碼審查組由4個人組成,1個組長,組長的條件:19代碼審查組其余成員:資深的程序員程序編寫者;專職測試人員;代碼審查組其余成員:20代碼審查過程準(zhǔn)備:組長將程序目錄和設(shè)計說明書分發(fā)給小組成員。成員熟悉材料;被測試程序的設(shè)計和編碼人員想審查組詳細說明所準(zhǔn)備的材料;特別是代碼的功能和功能間的關(guān)系;程序閱讀:審查組人員仔細閱讀代碼和相關(guān)資料,對照代碼審查單標(biāo)出明顯的缺陷及錯誤。代碼審查過程準(zhǔn)備:21代碼審查過程跟蹤及報告:會后將發(fā)現(xiàn)的錯誤登記報表并交給程序開發(fā)人員;如果發(fā)現(xiàn)錯誤較多或發(fā)現(xiàn)重大錯誤,在改正后,組長要再次組織審查會議;審查會議要限制在1.5小時~2小時以內(nèi)。審查過程所需要的主要技術(shù)是代碼審查單,通常將程序設(shè)計及編碼中可能發(fā)生的各類錯誤分類,對沒一類盡可能多地列舉出典型錯誤。發(fā)現(xiàn)新的錯誤及時補充道代碼審查表中。代碼審查過程跟蹤及報告:22代碼審查單的示例數(shù)據(jù)引用錯誤是否引用了未賦值或未初始化的變量?所有的數(shù)組引用,其下標(biāo)值是否在各自的相應(yīng)的維數(shù)定義界內(nèi)?所有的數(shù)組引用,下標(biāo)是否整數(shù)值?所有引用的指針或變量是否已經(jīng)分配了內(nèi)存?在檢索操作或用下標(biāo)引用數(shù)組時,是否存在“差1”錯誤?代碼審查單的示例數(shù)據(jù)引用錯誤23代碼審查單的示例數(shù)據(jù)說明錯誤所有變量是否都顯式地說明了?是否每個變量都賦與正常的長度、類型和存儲分類?變量的初始化和她的存儲類是否無矛盾?計算錯誤:是否使用過非一致數(shù)據(jù)類型的變量進行運算?是否存在混合運算?賦值語句的目標(biāo)變量是否比其右邊的表達式???代碼審查單的示例數(shù)據(jù)說明錯誤24代碼審查單的示例代碼審查還包括編程風(fēng)格、標(biāo)準(zhǔn)、規(guī)范的符合性方面的內(nèi)容。在錯誤登記表中應(yīng)標(biāo)明所查處的錯誤類型、錯誤類別、錯誤的嚴(yán)重程度、錯誤的原因等。代碼審查單的示例代碼審查還包括編程風(fēng)格、標(biāo)準(zhǔn)、規(guī)范的符合性方25Myers將錯誤分為8類:數(shù)據(jù)引用錯誤;數(shù)據(jù)說明錯誤;計算錯誤;比較錯誤;控制流錯誤;界面錯誤;輸入/輸出錯誤;其他錯誤;Myers將錯誤分為8類:26有效地閱讀程序仔細閱讀需求、設(shè)計等文檔,了解軟件的整體物理意義、應(yīng)用背景、在大系統(tǒng)中的地位。閱讀結(jié)構(gòu)化代碼:追蹤通過每個子程序的主要邏輯行,然后開始跟蹤第二條路徑,相當(dāng)于深度優(yōu)先;按排列順序跟蹤代碼,相當(dāng)于廣度優(yōu)先;有效地閱讀程序仔細閱讀需求、設(shè)計等文檔,了解軟件的整體物理意27代碼走查代碼走查就是在項目實施的過程中,在每一個模塊單元編程結(jié)束,程序員對自己編寫的代碼測試完畢后,由另外一位程序員(一般情況下為同一項目組)對該程序員的代碼和運行程序進行代碼走查和運行功能的檢查。

代碼走查代碼走查就是在項目實施的過程中,在每一個模塊單元編程28代碼走查的目的規(guī)范代碼的編寫;提高代碼的穩(wěn)定性與效率;增進其他程序員對本模塊的了解;提高程序員的編程水平;代碼走查的目的29檢查內(nèi)容

程序代碼是否符合公司和項目組的編程規(guī)范,程序的注釋是否便于理解,命名是否清晰、合理、明確;運行代碼如果有界面,其界面規(guī)格是否符合項目組制定的統(tǒng)一界面風(fēng)格;對用戶的提示信息是否簡單,清晰,準(zhǔn)確;代碼走查人員必須能夠看懂代碼及代碼編寫人的思路。檢查內(nèi)容程序代碼是否符合公司和項目組的編程規(guī)范,程序的注釋30程序所判斷的路徑是不是永遠也走不到的路徑;循環(huán)中的死循環(huán);需要預(yù)先預(yù)留空間的數(shù)據(jù)容器

(如:一般的數(shù)組在初始化時就已經(jīng)分配了足夠的空間,即使用不了,它所占用的空間也不能用做它用);一些需要關(guān)閉的對象

(如:文件處理中的流,數(shù)據(jù)庫處理中的連接);對象編程中的類,方法和變量的保護屬性

(public,protected,private);程序中的無用代碼最好刪除;程序所判斷的路徑是不是永遠也走不到的路徑;31進入系統(tǒng)實現(xiàn)階段項目經(jīng)理指定模塊編程人員及代碼走查人員編程人員模塊實現(xiàn)編程人員模塊實現(xiàn)編程人員單元測試編程人員測試完成后,書寫《代碼走查申請單》,提交項目經(jīng)理。A進入系統(tǒng)實現(xiàn)階段項目經(jīng)理指定模塊編程人員及代碼走查人員編程人32項目經(jīng)理或其委派人員書寫單元測試報告項目經(jīng)理委派代碼走查人員開始代碼走查,編程人員予以配合。代碼走查完畢后,代碼走查人員書寫《代碼走查報告單》,提交項目經(jīng)理。項目經(jīng)理檢查項目經(jīng)理對代碼走查中發(fā)現(xiàn)的問題安排編程人員予以改正進入下一階段A項目經(jīng)理或其委派人員書寫單元測試報告項目經(jīng)理委派代碼走查人員33代碼走查步驟本模塊編寫人在本模塊的功能測試完成并優(yōu)化代碼后,向項目經(jīng)理提供本模塊所涉及到的所有代碼的清單,填寫《代碼走查申請單》,并向項目經(jīng)理申請做本模塊的代碼走查;項目經(jīng)理指派人員進行某模塊的代碼走查,走查過程中遇到問題時應(yīng)該和編寫人協(xié)商解決,走查結(jié)束后,代碼走查人員應(yīng)進一步對本模塊進行功能測試,完成后提交項目經(jīng)理并說明走查的情況,填寫《代碼走查報告單》;項目經(jīng)理對代碼走查和模塊功能做20%的抽查;提交單元測試報告,向測試組申請功能測試或系統(tǒng)測試。代碼走查步驟本模塊編寫人在本模塊的功能測試完成并優(yōu)化代碼后,34代碼走查報告單項目名稱:XXXXXX模塊名稱:XXXXXX走查人:XXX提交日期:XXXXXX

代碼列表:[編號:應(yīng)該和“代碼走查申請單”中的對應(yīng)部分的編號相一致;走查項的通過可以用打勾來表示,如果有未通過項則需說明原因]走查項說明:ü

項1------代碼是否符合編碼規(guī)范ü

項2------代碼是否符合項目規(guī)定的界面風(fēng)格ü

項3------代碼中出現(xiàn)的提示信息是否明了ü

項4------走查人是否清楚編寫人的思路ü

項5------此部分代碼測試運行是否通過

代碼走查報告單

35代碼走查報告單編號項1項2項3項4項5未通過項及原因

代碼走查報告單編號項1項2項3項4項5未通過項及原因

36控制流分析

非結(jié)構(gòu)化程序會給測試、排錯、和程序的維護帶來許多困難要求寫出的程序結(jié)構(gòu)良好檢查程序的控制結(jié)構(gòu)成為十分有意義的工作控制流分析非結(jié)構(gòu)化程序會給測試、排錯、和程序的維護帶來許多37程序流程圖1325程序流程圖132538控制流圖12435abcdef控制流圖12435abcdef39控制流圖節(jié)點標(biāo)有編號的圓圈

程序流程圖中矩形框所表示的處理

菱形表示的兩個甚至多個出口判斷

多條流線相交的匯合點

控制流圖節(jié)點40控制流圖控制流線或弧箭頭

與程序流程圖中的流線一致,表明了控制的順序

控制流線通常標(biāo)有名字控制流圖控制流線或弧41控制流圖矩陣

acbdef1234512345控制流圖矩陣acbdef123451234542控制流圖矩陣便于機器表示和處理控制流圖

連接弧的節(jié)點的號碼決定了矩陣中元素的位置注意控制流的方向(行--〉列)兩個節(jié)點沒有弧線,所對應(yīng)的位置也就沒有元素控制流圖矩陣便于機器表示和處理控制流圖43程序結(jié)構(gòu)的基本要求寫出的程序不應(yīng)包含:轉(zhuǎn)向并不存在的標(biāo)號

沒有用的語句標(biāo)號

從程序入口進入后無法達到的語句

不能達到停機語句的語句

目前對這四種情況的檢測主要通過編譯器和程序分析工具來實現(xiàn)??梢岳每刂屏鲌D分析出來,是否存在以上情況。例如:1-》2-》3、4-》4-》5(結(jié)束)程序結(jié)構(gòu)的基本要求寫出的程序不應(yīng)包含:44數(shù)據(jù)流分析

查找引用未定義變量等程序錯誤

查找對以前未曾使用的變量再次賦值等數(shù)據(jù)流異常的情況

常見的錯誤表現(xiàn)形式錯拼名字名字混淆語句丟失數(shù)據(jù)流分析查找引用未定義變量等程序錯誤45數(shù)據(jù)流如果程序中某一語句執(zhí)行時能改變某程序變量V的值,則稱V被該語句定義如果一語句的執(zhí)行引用了內(nèi)存中變量V的值,則稱V被該語句引用例如:X=Y+Z;---------X被定義,Y和Z被引用ifY>Zthenreturn;----Y和Z被引用數(shù)據(jù)流如果程序中某一語句執(zhí)行時能改變某程序變量V的值,則稱V46控制流圖與數(shù)據(jù)流表1234106758911節(jié)點被定義變量被引用變量1X,Y,Z2XW,X3X,Y4Y,Z5YV,Y6ZV,Z7VX8WY9ZV10ZZ11ZZ的值被送給外部環(huán)境例如:假定某個變量的值在使用以前被錯誤的改寫了(對輸出沒有任何作用),這個語句就會被發(fā)現(xiàn)控制流圖與數(shù)據(jù)流表1234106758911節(jié)點被定義變量被47信息流分析通過對輸入數(shù)據(jù)、輸出數(shù)據(jù)、語句之間的關(guān)系的分析來檢查程序錯誤信息流分析用來分析,是否存在無用的語句。整除算法例子輸入:in_m是被除數(shù),in_n是除數(shù)輸出:out_q是商,out_r是余數(shù)信息流分析通過對輸入數(shù)據(jù)、輸出數(shù)據(jù)、語句之間的關(guān)系的分析來檢48整除算法例子out_q=0;out_r=in_m;While(out_r>=in_n){out_q++;out_r=out_r–in_n;}整除算法例子out_q=0;49信息流關(guān)系圖√√√√√√√in_min_n12345√√√√√√√√out_qout_r12345√√√√out_qout_rin_mIn_n(1)輸入變量影響語句(2)語句影響到輸出變量(3)輸入影響到輸出信息流關(guān)系圖√√√√√√√in_min_n12345√√√√50信息流分析能夠列出對輸入變量的所有可能的引用在程序的任何指定點檢查其執(zhí)行可能影響某一輸出變量值的語句輸入輸出關(guān)系提供一種檢查,看每個輸出值是否由相關(guān)的輸入值,而不是其他值導(dǎo)出信息流分析能夠列出對輸入變量的所有可能的引用51課程目錄白盒測試概述程序結(jié)構(gòu)分析

邏輯覆蓋

結(jié)構(gòu)測試案例分析結(jié)構(gòu)測試工具使用課程目錄白盒測試概述52覆蓋準(zhǔn)則

測試到什么地步可以結(jié)束測試?覆蓋準(zhǔn)則覆蓋準(zhǔn)則測試到什么地步可以結(jié)束測試?53被測小程序

if(A>1&&B==0)X=X/A;if(A==2||X>1)X=X+1;被測小程序if(A>1&&B==0)54被測程序段流程圖A>1&&B==0aA==2||X>1X=X/AFTbcX=X+1TeFd被測程序段流程圖A>1&&B==0aA==255邏輯覆蓋測試方法

語句覆蓋

分支覆蓋

條件覆蓋

分支-條件覆蓋

路徑覆蓋

邏輯覆蓋測試方法語句覆蓋56語句覆蓋

原理:如果語句中有錯誤,僅靠觀察不執(zhí)行可能發(fā)現(xiàn)不了在測試時,首先設(shè)計若干個測試用例,然后運行被測程序,使程序中的每個可執(zhí)行語句至少執(zhí)行一次若干個->盡量少

語句覆蓋、程序段覆蓋、程序塊覆蓋語句覆蓋原理:如果語句中有錯誤,僅靠觀察不執(zhí)行可能發(fā)現(xiàn)不了57語句覆蓋率語句覆蓋率已執(zhí)行的可執(zhí)行語句占程序中可執(zhí)行語句總數(shù)的百分比復(fù)雜的程序不可能達到語句的完全覆蓋語句覆蓋率越高越好語句覆蓋率語句覆蓋率58語句覆蓋測試用例達到語句覆蓋100%的測試用例(路徑ace)A=2B=0X=3未達到語句覆蓋100%的測試用例(路徑abe)A=2B=1X=3語句覆蓋測試用例達到語句覆蓋100%的測試用例(路徑ace59語句覆蓋的優(yōu)點檢查所有語句結(jié)構(gòu)簡單的代碼的測試效果較好容易實現(xiàn)自動測試代碼覆蓋率高

如果是程序塊覆蓋,則不涉及程序塊中的源代碼

語句覆蓋的優(yōu)點檢查所有語句60語句覆蓋不能檢查出的錯誤條件語句錯誤“A>1&&B==0”->“A>0&&B==0”邏輯運算(&&、||)錯誤“A>1&&B==0”->“A>1||B==0”“U=A<1||B>2”->“U=A<1”語句覆蓋不能檢查出的錯誤條件語句錯誤61語句覆蓋不能檢查出的錯誤循環(huán)語句錯誤循環(huán)次數(shù)錯誤跳出循環(huán)條件錯誤語句覆蓋不能檢查出的錯誤循環(huán)語句錯誤62語句覆蓋不能檢查出的錯誤循環(huán)語句例子for(i=0;i<10;i++){statement;}While(x>3){statement;}for(i=0;i<=10;i++){statement;}While(x>3&&x<7){statement;}語句覆蓋不能檢查出的錯誤循環(huán)語句例子63語句覆蓋率的問題能達到很高的語句覆蓋率語句覆蓋率看似很高,卻有嚴(yán)重缺陷

if(x!=1){statements;……;}else{statement;}}99句}1句測試用例x=2語句覆蓋率99%50%的分支沒有達到語句覆蓋率的問題能達到很高的語句覆蓋率}99句}1句測試用例64分支覆蓋設(shè)計若干測試用例,運行被測程序,使得程序中每個判斷的真假分支至少經(jīng)歷一次又稱判定覆蓋while語句、switch語句、異常處理、跳轉(zhuǎn)語句等等同樣可以使用分支覆蓋來測試分支覆蓋率已取過“真”和“假”兩個值的判定占程序中所有條件判定個數(shù)的百分比分支覆蓋設(shè)計若干測試用例,運行被測程序,使得程序中每個判斷的65分支覆蓋測試用例

路徑aceA=2B=0X=3

路徑abdA=1B=0X=1路徑acdA=3B=0X=3

路徑abeA=2B=1X=2或分支覆蓋測試用例路徑ace路徑acd或66分支覆蓋的利弊分支覆蓋要比語句覆蓋查錯能力強一些:執(zhí)行了分支覆蓋,實際也就執(zhí)行了語句覆蓋分支覆蓋與語句覆蓋存在同樣的缺點不能查出條件語句錯誤不能查出邏輯運算錯誤不能查出循環(huán)次數(shù)錯誤不能查出循環(huán)條件錯誤分支覆蓋的利弊分支覆蓋要比語句覆蓋查錯能力強一些:執(zhí)行了分支67條件覆蓋設(shè)計若干測試用例,執(zhí)行被測程序以后,要使每個判斷中的每個條件的可能取值至少滿足一次條件覆蓋設(shè)計若干測試用例,執(zhí)行被測程序以后,要使每個判斷中的68條件覆蓋分析第1個判斷應(yīng)考慮

A>1,記為T1A<=1,即記為F1B==0,記為T2B!=0,記為F2第2個判斷應(yīng)考慮

A==2,記為T3A!=2,記為F3X>1,記為T4X<=1,記為F4條件覆蓋分析第1個判斷應(yīng)考慮69條件覆蓋測試用例用例編號ABX路徑覆蓋條件1203aceT1,T2,T3,T42101abdF1,T2,F3,F43211abeT1,F2,T3,F4似乎執(zhí)行了條件覆蓋必然實現(xiàn)了分支覆蓋?條件覆蓋測試用例用例編號ABX路徑覆蓋條件1203aceT170條件覆蓋測試用例用例編號ABX路徑覆蓋條件1103abeF1,T2,F3,T42211abeT1,F2,T3,F4執(zhí)行條件覆蓋并不能實現(xiàn)分支覆蓋條件覆蓋測試用例用例編號ABX路徑覆蓋條件1103abeF171條件覆蓋的利弊能夠檢查所有的條件錯誤不能實現(xiàn)對每個分支的檢查用例數(shù)量的增加a&&b&&(c||(d&&e))((a||b)&&(c||d))&&e條件覆蓋的利弊能夠檢查所有的條件錯誤72分支-條件覆蓋設(shè)計足夠的測試用例,使得判斷中每個條件的所有可能至少出現(xiàn)一次,并且每個判斷本身的判定結(jié)果也至少出現(xiàn)一次分支-條件覆蓋設(shè)計足夠的測試用例,使得判斷中每個條件的所有可73分支-條件覆蓋分析(1)A>1,B==0,記為T1,T2(2)A>1,B!=0,記為T1,F2(3)A<=1,B==0,記為F1,T2(4)A<=1,B!=0,記為F1,F2(5)A==2,X>1,記為T3,T4(6)A==2,X<=1,記為T3,F4(7)A!=2,X>1,記為F3,T4(8)A!=2,X<=1,記為F3,F4分支-條件覆蓋分析(1)A>1,B==0,記為T74分支-條件覆蓋測試用例用例編號ABX覆蓋組合號路徑覆蓋條件1203(1)(5)aceT1,T2,T3,T42211(2)(6)abeT1,F2,T3,F43103(3)(7)abeF1,T2,F3,T44111(4)(8)abdF1,F2,F3,F4覆蓋了3條路徑,漏掉了路徑acd分支-條件覆蓋測試用例用例編號ABX覆蓋組合號路徑覆蓋條件175分支-條件覆蓋的利弊既考慮了每一個條件,又考慮了每一個分支,發(fā)現(xiàn)錯誤能力強于分支覆蓋和條件覆蓋并不能全面覆蓋所有路徑用例數(shù)量的增加分支-條件覆蓋的利弊既考慮了每一個條件,又考慮了每一個分支,76路徑覆蓋設(shè)計足夠多的測試用例,要求覆蓋程序中所有可能的路徑路徑ace記為L1abd記為L2abe記為L3acd記為L4路徑覆蓋設(shè)計足夠多的測試用例,要求覆蓋程序中所有可能的路徑77路徑覆蓋測試用例用例編號ABX覆蓋路徑1203ace(L1)2101abd(L2)3211abe(L3)4301acd(L4)路徑覆蓋測試用例用例編號ABX覆蓋路徑1203ace(L1)78基本路徑測試方法路徑測試就是從一個程序的入口開始,執(zhí)行所經(jīng)歷的各個語句的完整過程。從廣義的角度講,任何有關(guān)路徑分析的測試都可以被稱為路徑測試。完成路徑測試的理想情況是做到路徑覆蓋,但對于復(fù)雜性大的程序要做到所有路徑覆蓋(測試所有可執(zhí)行路徑)是不可能的。在不能做到所有路徑覆蓋的前提下,如果某一程序的每一個獨立路徑都被測試過,那么可以認為程序中的每個語句都已經(jīng)檢驗過了,即達到了語句覆蓋。這種測試方法就是通常所說的基本路徑測試方法。

基本路徑測試方法路徑測試就是從一個程序的入口開始,執(zhí)行所經(jīng)歷79基本路徑測試方法(續(xù))基本路徑測試方法是在控制流圖的基礎(chǔ)上,通過分析控制結(jié)構(gòu)的環(huán)形復(fù)雜度,導(dǎo)出執(zhí)行路徑的基本集,再從該基本集設(shè)計測試用例?;韭窂綔y試方法包括以下4個步驟:(1)畫出程序的控制流圖。(2)計算程序的環(huán)形復(fù)雜度,導(dǎo)出程序基本路徑集中的獨立路徑條數(shù),這是確定程序中每個可執(zhí)行語句至少執(zhí)行一次所必須的測試用例數(shù)目的上界。(3)導(dǎo)出基本路徑集,確定程序的獨立路徑。(4)根據(jù)(3)中的獨立路徑,設(shè)計測試用例的輸入數(shù)據(jù)和預(yù)期輸出?;韭窂綔y試方法(續(xù))基本路徑測試方法是在控制流圖的基礎(chǔ)上,80環(huán)形復(fù)雜度環(huán)形復(fù)雜度也稱為圈復(fù)雜度,它是一種為程序邏輯復(fù)雜度提供定量尺度的軟件度量。環(huán)形復(fù)雜度的應(yīng)用——可以將環(huán)形復(fù)雜度用于基本路徑方法,它可以提供:程序基本集的獨立路徑數(shù)量;確保所有語句至少執(zhí)行一次的測試數(shù)量的上界。獨立路徑是指程序中至少引入了一個新的處理語句集合或一個新條件的程序通路。采用流圖的術(shù)語,即獨立路徑必須至少包含一條在本次定義路徑之前不曾用過的邊。測試可以被設(shè)計為基本路徑集的執(zhí)行過程,但基本路徑集通常并不唯一。

環(huán)形復(fù)雜度環(huán)形復(fù)雜度也稱為圈復(fù)雜度,它是一種為程序邏輯復(fù)雜度81計算環(huán)形復(fù)雜度的方法環(huán)形復(fù)雜度以圖論為基礎(chǔ),為我們提供了非常有用的軟件度量。可用如下三種方法之一來計算環(huán)形復(fù)雜度:控制流圖中區(qū)域的數(shù)量對應(yīng)于環(huán)形復(fù)雜度。給定控制流圖G的環(huán)形復(fù)雜度—V(G),定義為V(G)=E-N+2

其中,E是控制流圖中邊的數(shù)量,N是控制流圖中的節(jié)點數(shù)量。給定控制流圖G的環(huán)形復(fù)雜度—V(G),也可定義為V(G)=P+1

其中,P是控制流圖G中判定節(jié)點的數(shù)量。判定節(jié)點是輸出邊至少2條以上的節(jié)點。計算環(huán)形復(fù)雜度的方法環(huán)形復(fù)雜度以圖論為基礎(chǔ),為我們提供了非常82基本路徑測試方法(續(xù))voidSort(intiRecordNum,intiType)1{2intx=0;3inty=0;4while(iRecordNum-->0)5{6 If(iType==0)7 x=y+2;8else9 If(iType==1)10x=y+10;11else12x=y+20;13}14}基本路徑測試方法(續(xù))voidSort(inti83基本路徑測試方法(續(xù))畫出控制流圖:如右圖所示計算環(huán)形復(fù)雜度:

10(條邊)-8(個節(jié)點)+2=4導(dǎo)出獨立路徑(用語句編號表示)路徑1:4→14路徑2:4→6→7→14路徑3:4→6→9→10→13→4→14路徑4:4→6→9→12→13→4→14467910121314基本路徑測試方法(續(xù))畫出控制流圖:46791012131484路徑覆蓋的利弊實現(xiàn)了所有路徑的測試,發(fā)現(xiàn)錯誤能力強某些條件錯誤可能無法發(fā)現(xiàn)路徑數(shù)龐大,不可能覆蓋所有路徑用例數(shù)量的增加路徑覆蓋的利弊實現(xiàn)了所有路徑的測試,發(fā)現(xiàn)錯誤能力強85循環(huán)測試路徑覆蓋0次循環(huán)檢查跳出循環(huán)

1次循環(huán)檢查循環(huán)初始值

2次循環(huán)檢查多次循環(huán)

m次循環(huán)檢查某次循環(huán)

最大次數(shù)循環(huán)、比最大次數(shù)多一次、少一次循環(huán)檢查循環(huán)次數(shù)邊界

循環(huán)測試路徑覆蓋0次循環(huán)86簡化循環(huán)路徑循環(huán)使路徑數(shù)量急劇增長簡化無論循環(huán)的形式和實際執(zhí)行循環(huán)體的次數(shù)多少,只考慮循環(huán)一次和0次兩種情況進入循環(huán)體一次跳出循環(huán)體簡化循環(huán)路徑循環(huán)使路徑數(shù)量急劇增長87循環(huán)程序流程圖CBCB(1)(2)循環(huán)程序流程圖CBCB(1)(2)88簡化循環(huán)路徑圖(1)和(2)都可簡化為(3)CB簡化循環(huán)路徑圖(1)和(2)都可簡化為(3)CB89最少測試用例數(shù)計算對于具體的程序,至少要設(shè)計多少測試用例?估算最少測試用例數(shù)幫助執(zhí)行測試有助于估算測試的時間最少測試用例數(shù)計算對于具體的程序,至少要設(shè)計多少測試用例?90結(jié)構(gòu)化程序與N-S圖結(jié)構(gòu)化程序是由3種基本控制結(jié)構(gòu)組成順序型選擇型(條件分支)重復(fù)型(循環(huán))測試時考慮的結(jié)構(gòu)順序型選擇型(條件分支)結(jié)構(gòu)化程序與N-S圖結(jié)構(gòu)化程序是由3種基本控制結(jié)構(gòu)組成91程序結(jié)構(gòu)與測試用例數(shù)并行串行程序結(jié)構(gòu)與測試用例數(shù)并行串行92程序結(jié)構(gòu)與測試用例數(shù)當(dāng)程序中判定多于一個時,形成的分支結(jié)構(gòu)可以分為兩類:嵌套型分支結(jié)構(gòu)和連鎖型分支結(jié)構(gòu)對于嵌套型分支結(jié)構(gòu),若有n個判定語句,需要n+1個測試用例對于連鎖型分支結(jié)構(gòu),若有n個判定語句,需要有2n個測試用例,覆蓋它的2n條路徑程序結(jié)構(gòu)與測試用例數(shù)當(dāng)程序中判定多于一個時,形成的分支結(jié)構(gòu)可93最少測試用例數(shù)計算實例計算最少測試用例數(shù)最少測試用例數(shù)計算實例計算最少測試用例數(shù)94最少測試用例數(shù)計算實例最少測試用例數(shù)計算實例95最少測試用例數(shù)計算實例最少測試用例數(shù)計算實例96測試覆蓋準(zhǔn)則Foster的ESTCA覆蓋準(zhǔn)則錯誤敏感測試用例分析(ErrorSensitiveTestCasesAnalysis)問題測試覆蓋準(zhǔn)則Foster的ESTCA覆蓋準(zhǔn)則97ESTCA覆蓋準(zhǔn)則對于分支A(>,=,<,>=,<=)B,測試時應(yīng)選擇A<B,A=B,A>B的情況分別測試一次對于分支A(>,<)C,A是變量,C是常量當(dāng)A>C時,選擇A=C+小正數(shù)當(dāng)A<C時,選擇A=C-小正數(shù)對于測試用例取值,在每個測試用例中盡量不同的值或符號ESTCA覆蓋準(zhǔn)則對于分支A(>,=,<,>=,<98覆蓋率要求對單元測試來說,語句覆蓋和分支覆蓋是最基本的要求由于程序中錯誤(異常)處理工作的重要性以及其結(jié)構(gòu)相對簡單,要求錯誤處理要做到路徑覆蓋對質(zhì)量要求高的軟件單元,可根據(jù)情況提出條件覆蓋、分支-條件覆蓋以及路徑覆蓋要求覆蓋率要求對單元測試來說,語句覆蓋和分支覆蓋是最基本的要求99課程目錄結(jié)構(gòu)測試概述程序結(jié)構(gòu)分析

邏輯覆蓋

結(jié)構(gòu)測試案例分析結(jié)構(gòu)測試工具使用課程目錄結(jié)構(gòu)測試概述100結(jié)構(gòu)測試案例求最小值

求數(shù)組中的最小值

k=i;for(j=i+1;j<=n;j++){if(A[j]<A[k])k=j;}結(jié)構(gòu)測試案例求最小值101程序流程圖

k=i;j=i+1j<=n?A[j]<A[k]?k=jj++acbdef程序流程圖k=i;j=i+1j<=n?A[j102最少測試用例數(shù)3最少測試用例數(shù)3103測試用例(最少)用例編號輸入輸出循環(huán)inA[i]A[i+1]路徑k10111ac1211212abefc1311221abdfc2測試用例(最少)用例編號輸入輸出循環(huán)inA[i]A[i+1]104疑問測試用例是否足夠?循環(huán)測試是否足夠?在結(jié)構(gòu)復(fù)雜,測試用例數(shù)非常多的情況下,這些測試用例已經(jīng)可以滿足測試,但并不具有充分性如何達到充分性?

測試2次循環(huán)疑問測試用例是否足夠?循環(huán)測試是否足夠?105測試用例(充分)用例編號輸入輸出循環(huán)inA[i]A[i+1]A[i+2]路徑k10111ac1211212abefc1311221abdfc24213123abefbefc15213213abdfbefc26213231abefbdfc37213321abdfbdfc3測試用例(充分)用例編號輸入輸出循環(huán)inA[i]A[i+1]106課程目錄結(jié)構(gòu)測試概述程序結(jié)構(gòu)分析

邏輯覆蓋

結(jié)構(gòu)測試案例分析結(jié)構(gòu)測試工具使用課程目錄結(jié)構(gòu)測試概述107目前的白盒測試工具DevPartner(Compuware)(C++、VC++、、java)IBMRationalPurify(C,C++)NUnit()JUnit(java)CppUnit(C++)目前的白盒測試工具DevPartner(Compuware)108Devpartner的使用Compuware的DevPartner家族可以幫助您快速提高Microsoft、Java及64位應(yīng)用程序的質(zhì)量和性能。分為(C/VC/)和java兩個系列DevPartner可以精確報告程序使用內(nèi)存的情況,識別效率低下的慢速代碼,并將性能瓶頸確定到問題所在的源代碼行。DevPartner還可以讓您跟蹤多個服務(wù)器之間的事務(wù),讓您獲得大量的信息,并且對性能問題進行深入的分析。Devpartner的使用Compuware的DevPa109Devpartner的使用

DevPartner8.0ProfessionalEditionDevpartner的使用DevPartner8.0P110Devpartner的使用

DevPartner8.0ProfessionalEditionDevpartner的使用DevPartner8.0P111NUnit的使用NUnit是一個單元測試框架,專門針對于.NET來寫的.其實在前面有JUnit(Java),CPPUnit(C++),他們都是xUnit的一員.最初,它是從JUnit而來.現(xiàn)在的版本是2.2.

NUnit最初是由JamesW.Newkirk,AlexeiA.Vorontsov和PhilipA.Craig,后來開發(fā)團隊逐漸龐大起來.在開發(fā)過程中,KentBeck和ErichGamma2位牛人也提供了許多幫助.NUnit是xUnit家族種的第4個主打產(chǎn)品,完全由C#語言來編寫,并且編寫時充分利用了許多.NET的特性,比如反射,客戶屬性等等.NUnit的使用NUnit是一個單元測試框架,專門針對于.N112NUnit的使用NUnit的使用113本課總結(jié)結(jié)構(gòu)性測試包含程序結(jié)構(gòu)分析和代碼覆蓋測試衡量結(jié)構(gòu)性測試的優(yōu)劣的標(biāo)準(zhǔn)是代碼覆蓋率使用工具將提高結(jié)構(gòu)性測試的質(zhì)量和加快測試的時間本課總結(jié)結(jié)構(gòu)性測試包含程序結(jié)構(gòu)分析和代碼覆蓋測試114課后習(xí)題第一題:總結(jié)各種白盒測試方法的應(yīng)用場景及其優(yōu)缺點。第二題:使用邏輯覆蓋測試方法測試以下程序段:VoidDo(intX,intA,intB){if(A>1)&&(B==0))X=X/A;if(A==2)||(X>1)X=X+1;}課后習(xí)題第一題:115課后習(xí)題第三題:計算下列程序片段的環(huán)形復(fù)雜度,使用邏輯覆蓋測試方法測試。VoidDoWork(intx,inty,intz){intk=0,j=0;if((x>3)&&(z<10)){k=x*y-1;j=sqrt(k);}if((x==4)||(y>5))j=x*y+10;j=j%3;}課后習(xí)題第三題:116Thanks!Thanks!117謝謝!供婁浪頹藍辣襖駒靴鋸瀾互慌仲寫繹衰斡染圾明將呆則孰盆瘸砒腥悉漠塹脊髓灰質(zhì)炎(講課2019)脊髓灰質(zhì)炎(講課2019)謝謝!供婁浪頹藍辣襖駒靴鋸瀾互慌仲寫繹衰斡染圾明將呆則孰盆瘸118供婁浪頹藍辣襖駒靴鋸瀾互慌仲寫繹衰斡染圾明將呆則孰盆瘸砒腥悉漠塹脊髓灰質(zhì)炎(講課2019)脊髓灰質(zhì)炎(講課2019)供婁浪頹藍辣襖駒靴鋸瀾互慌仲寫繹衰斡染圾明將呆則孰盆瘸砒腥悉119概覽在本章中,我們將學(xué)習(xí):結(jié)構(gòu)性白盒測試概述

程序結(jié)構(gòu)分析

邏輯覆蓋

結(jié)構(gòu)性測試案例

概覽在本章中,我們將學(xué)習(xí):120課程目錄結(jié)構(gòu)測試概述

程序結(jié)構(gòu)分析

邏輯覆蓋

結(jié)構(gòu)測試案例分析結(jié)構(gòu)測試工具課程目錄結(jié)構(gòu)測試概述121結(jié)構(gòu)性測試(1)程序?qū)崿F(xiàn)是已知的,是測試人員能夠根據(jù)功能實際實現(xiàn)的方式來標(biāo)識測試用例,又稱“白盒測試”、“透明盒測試”。結(jié)構(gòu)性測試(1)程序?qū)崿F(xiàn)是已知的,是測試人員能夠根據(jù)功能實際122結(jié)構(gòu)性測試(2)規(guī)格說明規(guī)格說明程序程序測試用例(方法A)測試用例(方法B)方法A覆蓋的區(qū)域比方法B覆蓋的區(qū)域大,但兩種方法的覆蓋區(qū)域只能在程序?qū)崿F(xiàn)部分有兩種維恩圖來表示功能性測試:結(jié)構(gòu)性測試(2)規(guī)格說明規(guī)格說明程序程序測試用例測試用例方法123功能性測試與結(jié)構(gòu)性測試比較單獨使用都有其局限性;最好的方法:結(jié)合兩種方法。功能性測試結(jié)構(gòu)性測試只利用規(guī)格說明標(biāo)識測試用例只利用程序源代碼標(biāo)識測試用例如果程序?qū)崿F(xiàn)了未描述的行為,功能測試無法意識到。如果已描述的行為未能實現(xiàn),結(jié)構(gòu)性測試無法意識到。冗余度大,可能會有漏洞具有覆蓋率指標(biāo)功能性測試與結(jié)構(gòu)性測試比較單獨使用都有其局限性;功能性測試結(jié)124結(jié)構(gòu)測試定義

把測試對象看做一個透明的盒子白盒測試是根據(jù)被測程序的內(nèi)部結(jié)構(gòu)設(shè)計測試用例并完成測試的一種測試方法白盒測試或邏輯驅(qū)動測試基于一個應(yīng)用代碼的內(nèi)部邏輯知識,測試覆蓋全部代碼、分支、路徑和條件結(jié)構(gòu)測試定義把測試對象看做一個透明的盒子125結(jié)構(gòu)測試特點可以構(gòu)成測試數(shù)據(jù)使特定程序部分得到測試有一定的充分性度量手段可獲得較多工具支持通常只用于單元測試結(jié)構(gòu)測試特點可以構(gòu)成測試數(shù)據(jù)使特定程序部分得到測試126結(jié)構(gòu)測試的方法靜態(tài)測試方法:程序結(jié)構(gòu)分析代碼走查代碼審查控制流分析數(shù)據(jù)流分析信息流分析動態(tài)測試方法:邏輯覆蓋語句覆蓋分支覆蓋條件覆蓋分支-條件覆蓋路徑覆蓋結(jié)構(gòu)測試的方法靜態(tài)測試方法:動態(tài)測試方法:127代碼覆蓋率采用白盒法進行測試時,考慮的是測試用例對程序內(nèi)部邏輯的覆蓋程度最徹底的白盒法是覆蓋程序中的每一條路徑,但這往往無法實現(xiàn)采用其它一些標(biāo)準(zhǔn)來量度覆蓋的程度,并希望覆蓋程度盡可能高些代碼覆蓋率采用白盒法進行測試時,考慮的是測試用例對程序內(nèi)部邏128課程目錄結(jié)構(gòu)測試概述程序結(jié)構(gòu)分析

邏輯覆蓋

結(jié)構(gòu)測試案例分析結(jié)構(gòu)測試工具使用課程目錄結(jié)構(gòu)測試概述129靜態(tài)測試靜態(tài)測試包括代碼審查和代碼走查,此方法是軟件測試的有效手段靜態(tài)測試靜態(tài)測試包括代碼審查和代碼走查,此方法是軟件測試的有130靜態(tài)測試技術(shù)特點是指無須執(zhí)行被測代碼,而是借助專用的軟件測試工具評審軟件文檔或程序,度量程序靜態(tài)復(fù)雜度,檢查軟件是否符合編程標(biāo)準(zhǔn),借以發(fā)現(xiàn)編寫的程序的不足之處,減少錯誤出現(xiàn)的概率。靜態(tài)測試在主機上完成,不需目標(biāo)系統(tǒng)支持,測試的主要內(nèi)容有編程標(biāo)準(zhǔn)驗證、數(shù)據(jù)流分析技術(shù)、質(zhì)量度量信息、代碼結(jié)構(gòu)可視化顯示、測試外殼的創(chuàng)建。由此看出,靜態(tài)測試只是對代碼進行掃描分析,檢測它的語法規(guī)則復(fù)雜度等是否符合要求,主要是為軟件的質(zhì)量保證提供依據(jù),以提高軟件的可靠性和易維護性靜態(tài)測試可以手工、自動;靜態(tài)測試技術(shù)特點是指無須執(zhí)行被測代碼,而是借助專用的軟件測試131靜態(tài)測試技術(shù)特點靜態(tài)測試不必動態(tài)地執(zhí)行程序,也就不必要進行測試用例設(shè)計和結(jié)果判讀等工作;靜態(tài)測試可以由人工進行,充分發(fā)揮人的邏輯思維優(yōu)勢。靜態(tài)測試試是不需要特別條件,容易開展。靜態(tài)測試技術(shù)特點靜態(tài)測試不必動態(tài)地執(zhí)行程序,也就不必要進行測132桌面檢查桌面檢查由程序員閱讀自己所編的程序。存在一下問題:心理上的原因,沒有發(fā)現(xiàn)錯誤的欲望;人存在思維定勢;如果對功能理解錯誤,不容易糾正;相當(dāng)于調(diào)試程序。桌面檢查桌面檢查由程序員閱讀自己所編的程序。133代碼走查與代碼審查CodeInspection&Walkthrough:是由若干程序員與測試員組成一個小組,集體閱讀并討論程序或者用“腦”執(zhí)行并檢查程序的過程。分兩步走:預(yù)先做準(zhǔn)備工作;舉行會議并討論;代碼走查與代碼審查CodeInspection&Wal134代碼走查與代碼審查的優(yōu)點避免了桌面檢查的問題;一旦發(fā)現(xiàn)錯誤,就可以定位錯誤的位置和性質(zhì),調(diào)試所需要化的代價低;一次能夠揭示一批錯誤,而不是一個錯誤;避免了動態(tài)調(diào)試的一些問題;代碼走查與代碼審查的優(yōu)點避免了桌面檢查的問題;135代碼走查與代碼審查的優(yōu)勢能夠有效地發(fā)現(xiàn)30%~70%的邏輯設(shè)計和編碼錯誤;IBM統(tǒng)計使用代碼審查的方法,錯誤的檢測效率高達全部查處錯誤的80%Myers的研究發(fā)現(xiàn)代碼審查和代碼走查平均查處全部錯誤的38%。研究表明:使用代碼走查與代碼審查發(fā)現(xiàn)某類錯誤比用計算機測試更有效,而對另一類錯誤情況正好相反。代碼走查與代碼審查與計算機測試是相互補充的,缺少任何一種方法都會使錯誤的檢測率損失。代碼走查與代碼審查的優(yōu)勢能夠有效地發(fā)現(xiàn)30%~70%的邏輯設(shè)136代碼審查代碼審查測試內(nèi)容包括:檢查代碼和設(shè)計的一致性;檢查代碼對標(biāo)準(zhǔn)的遵循、可讀性;檢查代碼的邏輯表達的正確性;檢查代碼結(jié)構(gòu)的合理性;代碼審查是由一組程序和錯誤檢查技術(shù)組成,并且以代碼審查組的方式進行。代碼審查代碼審查測試內(nèi)容包括:137代碼審查組代碼審查組由4個人組成,1個組長,組長的條件:稱職的程序員;但不是被測程序的編寫者;不需要對所檢查的程序很熟悉;要有較強的組織協(xié)調(diào)能力和語言能力;組長的職責(zé):分配資料;安排計劃;主持會議;紀(jì)錄并保存被發(fā)現(xiàn)的錯誤;代碼審查組代碼審查組由4個人組成,1個組長,組長的條件:138代碼審查組其余成員:資深的程序員程序編寫者;專職測試人員;代碼審查組其余成員:139代碼審查過程準(zhǔn)備:組長將程序目錄和設(shè)計說明書分發(fā)給小組成員。成員熟悉材料;被測試程序的設(shè)計和編碼人員想審查組詳細說明所準(zhǔn)備的材料;特別是代碼的功能和功能間的關(guān)系;程序閱讀:審查組人員仔細閱讀代碼和相關(guān)資料,對照代碼審查單標(biāo)出明顯的缺陷及錯誤。代碼審查過程準(zhǔn)備:140代碼審查過程跟蹤及報告:會后將發(fā)現(xiàn)的錯誤登記報表并交給程序開發(fā)人員;如果發(fā)現(xiàn)錯誤較多或發(fā)現(xiàn)重大錯誤,在改正后,組長要再次組織審查會議;審查會議要限制在1.5小時~2小時以內(nèi)。審查過程所需要的主要技術(shù)是代碼審查單,通常將程序設(shè)計及編碼中可能發(fā)生的各類錯誤分類,對沒一類盡可能多地列舉出典型錯誤。發(fā)現(xiàn)新的錯誤及時補充道代碼審查表中。代碼審查過程跟蹤及報告:141代碼審查單的示例數(shù)據(jù)引用錯誤是否引用了未賦值或未初始化的變量?所有的數(shù)組引用,其下標(biāo)值是否在各自的相應(yīng)的維數(shù)定義界內(nèi)?所有的數(shù)組引用,下標(biāo)是否整數(shù)值?所有引用的指針或變量是否已經(jīng)分配了內(nèi)存?在檢索操作或用下標(biāo)引用數(shù)組時,是否存在“差1”錯誤?代碼審查單的示例數(shù)據(jù)引用錯誤142代碼審查單的示例數(shù)據(jù)說明錯誤所有變量是否都顯式地說明了?是否每個變量都賦與正常的長度、類型和存儲分類?變量的初始化和她的存儲類是否無矛盾?計算錯誤:是否使用過非一致數(shù)據(jù)類型的變量進行運算?是否存在混合運算?賦值語句的目標(biāo)變量是否比其右邊的表達式???代碼審查單的示例數(shù)據(jù)說明錯誤143代碼審查單的示例代碼審查還包括編程風(fēng)格、標(biāo)準(zhǔn)、規(guī)范的符合性方面的內(nèi)容。在錯誤登記表中應(yīng)標(biāo)明所查處的錯誤類型、錯誤類別、錯誤的嚴(yán)重程度、錯誤的原因等。代碼審查單的示例代碼審查還包括編程風(fēng)格、標(biāo)準(zhǔn)、規(guī)范的符合性方144Myers將錯誤分為8類:數(shù)據(jù)引用錯誤;數(shù)據(jù)說明錯誤;計算錯誤;比較錯誤;控制流錯誤;界面錯誤;輸入/輸出錯誤;其他錯誤;Myers將錯誤分為8類:145有效地閱讀程序仔細閱讀需求、設(shè)計等文檔,了解軟件的整體物理意義、應(yīng)用背景、在大系統(tǒng)中的地位。閱讀結(jié)構(gòu)化代碼:追蹤通過每個子程序的主要邏輯行,然后開始跟蹤第二條路徑,相當(dāng)于深度優(yōu)先;按排列順序跟蹤代碼,相當(dāng)于廣度優(yōu)先;有效地閱讀程序仔細閱讀需求、設(shè)計等文檔,了解軟件的整體物理意146代碼走查代碼走查就是在項目實施的過程中,在每一個模塊單元編程結(jié)束,程序員對自己編寫的代碼測試完畢后,由另外一位程序員(一般情況下為同一項目組)對該程序員的代碼和運行程序進行代碼走查和運行功能的檢查。

代碼走查代碼走查就是在項目實施的過程中,在每一個模塊單元編程147代碼走查的目的規(guī)范代碼的編寫;提高代碼的穩(wěn)定性與效率;增進其他程序員對本模塊的了解;提高程序員的編程水平;代碼走查的目的148檢查內(nèi)容

程序代碼是否符合公司和項目組的編程規(guī)范,程序的注釋是否便于理解,命名是否清晰、合理、明確;運行代碼如果有界面,其界面規(guī)格是否符合項目組制定的統(tǒng)一界面風(fēng)格;對用戶的提示信息是否簡單,清晰,準(zhǔn)確;代碼走查人員必須能夠看懂代碼及代碼編寫人的思路。檢查內(nèi)容程序代碼是否符合公司和項目組的編程規(guī)范,程序的注釋149程序所判斷的路徑是不是永遠也走不到的路徑;循環(huán)中的死循環(huán);需要預(yù)先預(yù)留空間的數(shù)據(jù)容器

(如:一般的數(shù)組在初始化時就已經(jīng)分配了足夠的空間,即使用不了,它所占用的空間也不能用做它用);一些需要關(guān)閉的對象

(如:文件處理中的流,數(shù)據(jù)庫處理中的連接);對象編程中的類,方法和變量的保護屬性

(public,protected,private);程序中的無用代碼最好刪除;程序所判斷的路徑是不是永遠也走不到的路徑;150進入系統(tǒng)實現(xiàn)階段項目經(jīng)理指定模塊編程人員及代碼走查人員編程人員模塊實現(xiàn)編程人員模塊實現(xiàn)編程人員單元測試編程人員測試完成后,書寫《代碼走查申請單》,提交項目經(jīng)理。A進入系統(tǒng)實現(xiàn)階段項目經(jīng)理指定模塊編程人員及代碼走查人員編程人151項目經(jīng)理或其委派人員書寫單元測試報告項目經(jīng)理委派代碼走查人員開始代碼走查,編程人員予以配合。代碼走查完畢后,代碼走查人員書寫《代碼走查報告單》,提交項目經(jīng)理。項目經(jīng)理檢查項目經(jīng)理對代碼走查中發(fā)現(xiàn)的問題安排編程人員予以改正進入下一階段A項目經(jīng)理或其委派人員書寫單元測試報告項目經(jīng)理委派代碼走查人員152代碼走查步驟本模塊編寫人在本模塊的功能測試完成并優(yōu)化代碼后,向項目經(jīng)理提供本模塊所涉及到的所有代碼的清單,填寫《代碼走查申請單》,并向項目經(jīng)理申請做本模塊的代碼走查;項目經(jīng)理指派人員進行某模塊的代碼走查,走查過程中遇到問題時應(yīng)該和編寫人協(xié)商解決,走查結(jié)束后,代碼走查人員應(yīng)進一步對本模塊進行功能測試,完成后提交項目經(jīng)理并說明走查的情況,填寫《代碼走查報告單》;項目經(jīng)理對代碼走查和模塊功能做20%的抽查;提交單元測試報告,向測試組申請功能測試或系統(tǒng)測試。代碼走查步驟本模塊編寫人在本模塊的功能測試完成并優(yōu)化代碼后,153代碼走查報告單項目名稱:XXXXXX模塊名稱:XXXXXX走查人:XXX提交日期:XXXXXX

代碼列表:[編號:應(yīng)該和“代碼走查申請單”中的對應(yīng)部分的編號相一致;走查項的通過可以用打勾來表示,如果有未通過項則需說明原因]走查項說明:ü

項1------代碼是否符合編碼規(guī)范ü

項2------代碼是否符合項目規(guī)定的界面風(fēng)格ü

項3------代碼中出現(xiàn)的提示信息是否明了ü

項4------走查人是否清楚編寫人的思路ü

項5------此部分代碼測試運行是否通過

代碼走查報告單

154代碼走查報告單編號項1項2項3項4項5未通過項及原因

代碼走查報告單編號項1項2項3項4項5未通過項及原因

155控制流分析

非結(jié)構(gòu)化程序會給測試、排錯、和程序的維護帶來許多困難要求寫出的程序結(jié)構(gòu)良好檢查程序的控制結(jié)構(gòu)成為十分有意義的工作控制流分析非結(jié)構(gòu)化程序會給測試、排錯、和程序的維護帶來許多156程序流程圖1325程序流程圖1325157控制流圖12435abcdef控制流圖12435abcdef158控制流圖節(jié)點標(biāo)有編號的圓圈

程序流程圖中矩形框所表示的處理

菱形表示的兩個甚至多個出口判斷

多條流線相交的匯合點

控制流圖節(jié)點159控制流圖控制流線或弧箭頭

與程序流程圖中的流線一致,表明了控制的順序

控制流線通常標(biāo)有名字控制流圖控制流線或弧160控制流圖矩陣

acbdef1234512345控制流圖矩陣acbdef1234512345161控制流圖矩陣便于機器表示和處理控制流圖

連接弧的節(jié)點的號碼決定了矩陣中元素的位置注意控制流的方向(行--〉列)兩個節(jié)點沒有弧線,所對應(yīng)的位置也就沒有元素控制流圖矩陣便于機器表示和處理控制流圖162程序結(jié)構(gòu)的基本要求寫出的程序不應(yīng)包含:轉(zhuǎn)向并不存在的標(biāo)號

沒有用的語句標(biāo)號

從程序入口進入后無法達到的語句

不能達到停機語句的語句

目前對這四種情況的檢測主要通過編譯器和程序分析工具來實現(xiàn)??梢岳每刂屏鲌D分析出來,是否存在以上情況。例如:1-》2-》3、4-》4-》5(結(jié)束)程序結(jié)構(gòu)的基本要求寫出的程序不應(yīng)包含:163數(shù)據(jù)流分析

查找引用未定義變量等程序錯誤

查找對以前未曾使用的變量再次賦值等數(shù)據(jù)流異常的情況

常見的錯誤表現(xiàn)形式錯拼名字名字混淆語句丟失數(shù)據(jù)流分析查找引用未定義變量等程序錯誤164數(shù)據(jù)流如果程序中某一語句執(zhí)行時能改變某程序變量V的值,則稱V被該語句定義如果一語句的執(zhí)行引用了內(nèi)存中變量V的值,則稱V被該語句引用例如:X=Y+Z;---------X被定義,Y和Z被引用ifY>Zthenreturn;----Y和Z被引用數(shù)據(jù)流如果程序中某一語句執(zhí)行時能改變某程序變量V的值,則稱V165控制流圖與數(shù)據(jù)流表1234106758911節(jié)點被定義變量被引用變量1X,Y,Z2XW,X3X,Y4Y,Z5YV,Y6ZV,Z7VX8WY9ZV10ZZ11ZZ的值被送給外部環(huán)境例如:假定某個變量的值在使用以前被錯誤的改寫了(對輸出沒有任何作用),這個語句就會被發(fā)現(xiàn)控制流圖與數(shù)據(jù)流表1234106758911節(jié)點被定義變量被166信息流分析通過對輸入數(shù)據(jù)、輸出數(shù)據(jù)、語句之間的關(guān)系的分析來檢查程序錯誤信息流分析用來分析,是否存在無用的語句。整除算法例子輸入:in_m是被除數(shù),in_n是除數(shù)輸出:out_q是商,out_r是余數(shù)信息流分析通過對輸入數(shù)據(jù)、輸出數(shù)據(jù)、語句之間的關(guān)系的分析來檢167整除算法例子out_q=0;out_r=in_m;While(out_r>=in_n){out_q++;out_r=out_r–in_n;}整除算法例子out_q=0;168信息流關(guān)系圖√√√√√√√in_min_n12345√√√√√√√√out_qout_r12345√√√√out_qout_rin_mIn_n(1)輸入變量影響語句(2)語句影響到輸出變量(3)輸入影響到輸出信息流關(guān)系圖√√√√√√√in_min_n12345√√√√169信息流分析能夠列出對輸入變量的所有可能的引用在程序的任何指定點檢查其執(zhí)行可能影響某一輸出變量值的語句輸入輸出關(guān)系提供一種檢查,看每個輸出值是否由相關(guān)的輸入值,而不是其他值導(dǎo)出信息流分析能夠列出對輸入變量的所有可能的引用170課程目錄白盒測試概述程序結(jié)構(gòu)分析

邏輯覆蓋

結(jié)構(gòu)測試案例分析結(jié)構(gòu)測試工具使用課程目錄白盒測試概述171覆蓋準(zhǔn)則

測試到什么地步可以結(jié)束測試?覆蓋準(zhǔn)則覆蓋準(zhǔn)則測試到什么地步可以結(jié)束測試?172被測小程序

if(A>1&&B==0)X=X/A;if(A==2||X>1)X=X+1;被測小程序if(A>1&&B==0)173被測程序段流程圖A>1&&B==0aA==2||X>1X=X/AFTbcX=X+1TeFd被測程序段流程圖A>1&&B==0aA==2174邏輯覆蓋測試方法

語句覆蓋

分支覆蓋

條件覆蓋

分支-條件覆蓋

路徑覆蓋

邏輯覆蓋測試方法語句覆蓋175語句覆蓋

原理:如果語句中有錯誤,僅靠觀察不執(zhí)行可能發(fā)現(xiàn)不了在測試時,首先設(shè)計若干個測試用例,然后運行被測程序,使程序中的每個可執(zhí)行語句至少執(zhí)行一次若干個->盡量少

語句覆蓋、程序段覆蓋、程序塊覆蓋語句覆蓋原理:如果語句中有錯誤,僅靠觀察不執(zhí)行可能發(fā)現(xiàn)不了176語句覆蓋率語句覆蓋率已執(zhí)行的可執(zhí)行語句占程序中可執(zhí)行語句總數(shù)的百分比復(fù)雜的程序不可能達到語句的完全覆蓋語句覆蓋率越高越好語句覆蓋率語句覆蓋率177語句覆蓋測試用例達到語句覆蓋100%的測試用例(路徑ace)A=2B=0X=3未達到語句覆蓋100%的測試用例(路徑abe)A=2B=1X=3語句覆蓋測試用例達到語句覆蓋100%的測試用例(路徑ace178語句覆蓋的優(yōu)點檢查所有語句結(jié)構(gòu)簡單的代碼的測試效果較好容易實現(xiàn)自動測試代碼覆蓋率高

如果是程序塊覆蓋,則不涉及程序塊中的源代碼

語句覆蓋的優(yōu)點檢查所有語句179語句覆蓋不能檢查出的錯誤條件語句錯誤“A>1&&B==0”->“A>0&&B==0”邏輯運算(&&、||)錯誤“A>1&&B==0”->“A>1||B==0”“U=A<1||B>2”->“U=A<1”語句覆蓋不能檢查出的錯誤條件語句錯誤180語句覆蓋不能檢查出的錯誤循環(huán)語句錯誤循環(huán)次數(shù)錯誤跳出循環(huán)條件錯誤語句覆蓋不能檢查出的錯誤循環(huán)語句錯誤181語句覆蓋不能檢查出的錯誤循環(huán)語句例子for(i=0;i<10;i++){statement;}While(x>3){statement;}for(i=0;i<=10;i++){statement;}While(x>3&&x<7){statement;}語句覆蓋不能檢查出的錯誤循環(huán)語句例子182語句覆蓋率的問題能達到很高的語句覆蓋率語句覆蓋率看似很高,卻有嚴(yán)重缺陷

if(x!=1){statements;……;}else{statement;}}99句}1句測試用例x=2語句覆蓋率99%50%的分支沒有達到語句覆蓋率的問題能達到很高的語句覆蓋率}99句}1句測試用例183分支覆蓋設(shè)計若干測試用例,運行被測程序,使得程序中每個判斷的真假分支至少經(jīng)歷一次又稱判定覆蓋while語句、switch語句、異常處理、跳轉(zhuǎn)語句等等同樣可以使用分支覆蓋來測試分支覆蓋率已取過“真”和“假”兩個值的判定占程序中所有條件判定個數(shù)的百分比分支覆蓋設(shè)計若干測試用例,運行被測程序,使得程序中每個判斷的184分支覆蓋測試用例

路徑aceA=2B=0X=3

路徑abdA=1B=0X=1路徑acdA=3B=0X=3

路徑abeA=2B=1X=2或分支覆蓋測試用例路徑ace路徑acd或185分支覆蓋的利弊分支覆蓋要比語句覆蓋查錯能力強一些:執(zhí)行了分支覆蓋,實際也就執(zhí)行了語句覆蓋分支覆蓋與語句覆蓋存在同樣的缺點不能查出條件語句錯誤不能查出邏輯運算錯誤不能查出循環(huán)次數(shù)錯誤不能查出循環(huán)條件錯誤分支覆蓋的利弊分支覆蓋要比語句覆蓋查錯能力強一些:執(zhí)行了分支186條件覆蓋設(shè)計若干測試用例,執(zhí)行被測程序以后,要使每個判斷中的每個條件的可能取值至少滿足一次條件覆蓋設(shè)計若干測試用例,執(zhí)行被測程序以后,要使每個判斷中的187條件覆蓋分析第1個判斷應(yīng)考慮

A>1,記為T1A<=1,即記為F1B==0,記為T2B!=0,記為F2第2個判斷應(yīng)考慮

A==2,記為T3A!=2,記為F3X>1,記為T4X<=1,記為F4條件覆蓋分析第1個判斷應(yīng)考慮188條件覆蓋測試用例用例編號ABX路徑覆蓋條件1203aceT1,T2,T3,T42101abdF1,T2,F3,F43211abeT1,F2,T3,F4似乎執(zhí)行了條件覆蓋必然實現(xiàn)了分支覆蓋?條件覆蓋測試用例用例編號ABX路徑覆蓋條件1203aceT1189條件覆蓋測試用例用例編號ABX路徑覆蓋條件1103abeF1,T2,F3,T42211abeT1,F2,T3,F4執(zhí)行條件覆蓋并不能實現(xiàn)分支覆蓋條件覆蓋測試用例用例編號ABX路徑覆蓋條件1103abeF1190條件覆蓋的利弊能夠檢查所有的條件錯誤不能實現(xiàn)對每個分支的檢查用例數(shù)量的增加a&&b&&(c||(d&&e))((a||b)&&(c||d))&&e條件覆蓋的利弊能夠檢查所有的條件錯誤191分支-條件覆蓋設(shè)計足夠的測試用例,使得判斷中每個條件的所有可能至少出現(xiàn)一次,并且每個判斷本身的判定結(jié)果也至少出現(xiàn)一次分支-條件覆蓋設(shè)計足夠的測試用例,使得判斷中每個條件的所有可192分支-條件覆蓋分析(1)A>1,B==0,記為T1,T2(2)A>1,B!=0,記為T1,F2(3)A<=1,B==0,記為F1,T2(4)A<=1,B!=0,記為F1,F2(5)A==2,X>1,記為T3,T4(6)A==2,X<=1,記為T3,F4(7)A!=2,X>1,記為F3,T4(8)A!=2,X<=1,記為F3,F4分支-條件覆蓋分析(1)A>1,B==0,記為T193分支-條件覆蓋測試用例用例編號ABX覆蓋組合號路徑覆蓋條件1203(1)(5)aceT1,T2,T3,T42211(2)(6)abeT1,F2,T3,F43103(3)(7)abeF1,T2,F3,T44111(4)(8)abdF1,F2,F3,F4覆蓋了3條路徑,漏掉了路徑acd分支-條件覆蓋測試用例用例編號ABX覆蓋組合號路徑覆蓋條件1194分支-條件覆蓋的利弊既考慮了每一個條件,又考慮了每一個分支,發(fā)現(xiàn)錯誤能力強于分支覆蓋和條件覆蓋并不能全面覆蓋所有路徑用例數(shù)量的增加分支-條件覆蓋的利弊既考慮了每一個條件,又考慮了每一個分支,195路徑覆蓋設(shè)計足夠多的測試用例,要求覆蓋程序中所有可能的路徑路徑ace記為L1abd記為L2abe記為L3acd記為L4路徑覆蓋設(shè)計足夠多的測試用例,要求覆蓋程序中所有可能的路徑196路徑覆蓋測試用例用例編號ABX覆蓋路徑1203ace(L1)2101abd(L2)3211abe(L3)4301acd(L4)路徑覆蓋測試用例用例編號ABX覆蓋路徑1203ace(L1)197基本路徑測試方法路徑測試就是從一個程序的入口開始,執(zhí)行所經(jīng)歷的各個語句的完整過程。從廣義的角度講,任何有關(guān)路徑分析的測試都可以被稱為路徑測試。完成路徑測試的理想情況是做到路徑覆蓋,但對于復(fù)雜性大的程序要做到所有路徑覆蓋(測試所有可執(zhí)行路徑)是不可能的。在不能做到所有路徑覆蓋的前提下,如果某一程序的每一個獨立路徑都被測試過,那么可以認為程序中的每個語句都已經(jīng)檢驗過了,即達到了語句覆蓋。這種測試方法就是通常所說的基本路徑測試方法。

基本路徑測試方法路徑測試就是從一個程序的入口開始,執(zhí)行所經(jīng)歷198基本路徑測試方法(續(xù))基本路徑測試方法是在控制流圖的基礎(chǔ)上,通過分析控制結(jié)構(gòu)的環(huán)形復(fù)雜度,導(dǎo)出執(zhí)行路徑的基本集,再從該基本集設(shè)計測試用例?;韭窂綔y試方法包括以下4個步驟:(1)畫出程

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論