軟件測試技術(shù)-第二章-白盒測試課件_第1頁
軟件測試技術(shù)-第二章-白盒測試課件_第2頁
軟件測試技術(shù)-第二章-白盒測試課件_第3頁
軟件測試技術(shù)-第二章-白盒測試課件_第4頁
軟件測試技術(shù)-第二章-白盒測試課件_第5頁
已閱讀5頁,還剩225頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

軟件測試技術(shù)

第2章白盒測試1/116軟件測試技術(shù)

第2章白盒測試1/116靜態(tài)白盒測試主要包括代碼檢查和靜態(tài)結(jié)構(gòu)分析兩種方法。動態(tài)白盒測試主要包括程序插樁、邏輯覆蓋測試、基本路徑測試、循環(huán)結(jié)構(gòu)測試等。動態(tài)白盒測試方法是白盒測試中發(fā)現(xiàn)軟件缺陷的主要手段。其中,邏輯覆蓋測試和基本路徑測試方法是實(shí)際工作中最常用到的兩種動態(tài)白盒測試技術(shù),2.1對于白盒測試的基本認(rèn)識2/116靜態(tài)白盒測試主要包括代碼檢查和靜態(tài)結(jié)構(gòu)分析兩種方法。2.1對白盒測試簡介白盒測試一般用來分析程序的內(nèi)部結(jié)構(gòu),因此有時也被稱為基于程序的測試。白盒測試的前提條件是已知程序的內(nèi)部工作過程,清楚其語句、變量狀態(tài)、邏輯結(jié)構(gòu)和執(zhí)行路徑等關(guān)鍵信息,因此也被稱為玻璃盒測試。白盒測試主要是根據(jù)程序內(nèi)部的邏輯結(jié)構(gòu)和相關(guān)信息,檢驗(yàn)程序中的各條通路是否都能夠按設(shè)計要求正確工作,從這一意義上來講,白盒測試又常被稱為結(jié)構(gòu)測試或邏輯驅(qū)動測試。白盒測試針對的是程序的內(nèi)部結(jié)構(gòu)和運(yùn)行過程。白盒測試重視測試覆蓋率的度量,被看做是“基于覆蓋的測試”,要求對被測程序的結(jié)構(gòu)能夠做到一定程度的覆蓋,通過不同類型的覆蓋準(zhǔn)則來判斷測試執(zhí)行的充分性。3/116白盒測試簡介白盒測試一般用來分析程序的內(nèi)部結(jié)構(gòu),因此有時也被白盒測試的基本原則保證程序模塊中的所有獨(dú)立路徑都至少被使用一次;保證程序中的所有邏輯值都能測試True和False兩種情況;在循環(huán)的邊界和運(yùn)行的界限內(nèi)執(zhí)行循環(huán)體;測試程序內(nèi)部數(shù)據(jù)結(jié)構(gòu)的有效性以及完成邊界數(shù)據(jù)取值情況下的測試。4/116白盒測試的基本原則保證程序模塊中的所有獨(dú)立路徑都至少被使用一窮舉路徑測試示例5/116窮舉路徑測試示例5/116白盒測試的缺點(diǎn)白盒測試方法試圖窮舉所有程序路徑進(jìn)行測試,這往往是不可能的。窮舉路徑測試查不出違反設(shè)計規(guī)范的錯誤,不能發(fā)現(xiàn)程序中已實(shí)現(xiàn)但不是用戶所需要的功能,不可能查出程序中因遺漏路徑而產(chǎn)生的錯誤,可能發(fā)現(xiàn)不了一些與數(shù)據(jù)相關(guān)的異常錯誤。盡管白盒測試方法深入程序內(nèi)部,針對程序細(xì)節(jié)的邏輯結(jié)構(gòu)進(jìn)行測試,對代碼的測試比較徹底,但仍然存在著一定的局限性。6/116白盒測試的缺點(diǎn)白盒測試方法試圖窮舉所有程序路徑進(jìn)行測試,這往2.2靜態(tài)測試根據(jù)測試時是否運(yùn)行源程序,白盒測試可以分為靜態(tài)測試和動態(tài)測試。靜態(tài)測試方法又主要分為代碼檢查和靜態(tài)結(jié)構(gòu)分析等。靜態(tài)測試就是不實(shí)際運(yùn)行被測試的軟件,而只是靜態(tài)地檢查程序代碼、界面或文檔中可能存在的錯誤的過程。7/1162.2靜態(tài)測試根據(jù)測試時是否運(yùn)行源程序,白盒測試可以分為靜2.2.1代碼檢查法代碼檢查法主要包括桌面檢查、走查和代碼審查。主要檢查代碼的規(guī)范性、可讀性、結(jié)構(gòu)的合理性、邏輯表達(dá)的正確性等內(nèi)容。代碼檢查比動態(tài)測試更為有效,能快速發(fā)現(xiàn)30%~70%的邏輯設(shè)計和編碼缺陷,應(yīng)當(dāng)在程序編譯和動態(tài)測試之前進(jìn)行。最不正式的最正式的臨時評審輪查

走查互為評審?fù)性u審

審查Randomreview,Pass-round,Walkthrough,Peerreview,Inspection8/1162.2.1代碼檢查法代碼檢查法主要包括桌面檢查、走查和代碼審表2-1桌面檢查、走查和代碼審查的對比項(xiàng)目桌面檢查走查代碼審查準(zhǔn)備程序的規(guī)格說明、編碼規(guī)范、錯誤列表、源代碼參加人員事先閱讀設(shè)計和源代碼,準(zhǔn)備代表性測試用例需求與設(shè)計文檔、源代碼、編碼規(guī)范、缺陷檢測表、會議計劃和流程形式無非正式會議正式會議參加人員程序編寫者本人開發(fā)組內(nèi)部人員開發(fā)、測試和相關(guān)人員主要技術(shù)方法無邏輯運(yùn)行測試用例缺陷檢測表9/116表2-1桌面檢查、走查和代碼審查的對比項(xiàng)目桌面檢查走查代表2-1桌面檢查、走查和代碼審查的對比(續(xù)表)項(xiàng)目桌面檢查走查代碼審查注意事項(xiàng)注釋與編碼規(guī)范限時、不當(dāng)場修改代碼限時、不當(dāng)場修改代碼生成文檔無靜態(tài)分析錯誤報告結(jié)果報告目標(biāo)無代碼標(biāo)準(zhǔn)規(guī)范、無邏輯錯誤代碼標(biāo)準(zhǔn)規(guī)范、無邏輯錯誤優(yōu)點(diǎn)省時便于項(xiàng)目組成員交流,共同理解軟件產(chǎn)品有計劃的對軟件產(chǎn)品進(jìn)行編碼質(zhì)量控制缺點(diǎn)不正式、依賴個人能力、效率低耗時耗時10/116表2-1桌面檢查、走查和代碼審查的對比(續(xù)表)項(xiàng)目桌面檢1)桌面檢查桌面檢查是最不正式,也是最省時的靜態(tài)測試技術(shù)。桌面檢查就是程序員對自己的代碼進(jìn)行一次自我檢查,對編碼成果進(jìn)行自我完善。由于桌面檢查沒有任何約束,依賴程序員個人的經(jīng)驗(yàn)和技術(shù)能力,因此對于大多數(shù)人而言,檢查效率很低。由編程者本人完成的桌面檢查明顯違背了軟件測試的獨(dú)立性原則。效果遠(yuǎn)遠(yuǎn)遜色于代碼走查和代碼審查。11/1161)桌面檢查桌面檢查是最不正式,也是最省時的靜態(tài)測試技術(shù)。1桌面檢查的主要內(nèi)容:變量和標(biāo)號的交叉引用表檢查。檢查變量的定義和使用以及轉(zhuǎn)向特定位置的標(biāo)號。子程序、宏、函數(shù)檢查。等價性檢查。檢查全部等價變量類型的一致性。常量檢查。設(shè)計標(biāo)準(zhǔn)檢查。檢查程序是否違反設(shè)計標(biāo)準(zhǔn)。風(fēng)格檢查。12/116桌面檢查的主要內(nèi)容:變量和標(biāo)號的交叉引用表檢查。檢查變量的定控制流檢查。選擇、激活路徑檢查。檢查每條控制流路徑是否都能被程序激活,達(dá)到語句覆蓋。規(guī)格符合性檢查。是否符合程序規(guī)格說明以及編碼規(guī)范。補(bǔ)充文檔檢查。13/116控制流檢查。13/1162)走查代碼走查的過程是非正式的,一般是在開發(fā)組內(nèi)部進(jìn)行,通過一個代碼走查小組,以會議的方式來檢查代碼。代碼走查有利于項(xiàng)目組人員共同理解項(xiàng)目所涉及的業(yè)務(wù)信息和具體代碼實(shí)現(xiàn)過程,交換代碼編寫思路,幫助開發(fā)人員找出程序錯誤和解決方法。14/1162)走查代碼走查的過程是非正式的,一般是在開發(fā)組內(nèi)部進(jìn)行,通代碼審查是一種正式的評審活動,通過正式會議的方式進(jìn)行,事先一般具有制定好的會議計劃和流程,會議中應(yīng)用預(yù)先定義好的標(biāo)準(zhǔn)和檢查技術(shù)檢查程序和文檔,發(fā)現(xiàn)軟件缺陷,會后形成正式的審查結(jié)果報告。3)代碼審查主持人作者記錄員列席人員內(nèi)審員技術(shù)專業(yè)人員用戶代表15/116代碼審查是一種正式的評審活動,通過正式會議的方式進(jìn)行,事先一代碼審查是一個軟件開發(fā)過程中必不可少的環(huán)節(jié)。谷歌前資深軟件開發(fā)工程師MarkChu-Carroll博士認(rèn)為,之所以讓Google的程序如此優(yōu)秀的一個重要原因看起來很簡單:代碼審查。在Google,沒有任何項(xiàng)目的程序源代碼可以在沒有經(jīng)過有效的代碼審查前就提交到代碼庫中。MarkChu-Carroll16/116代碼審查是一個軟件開發(fā)過程中必不可少的環(huán)節(jié)。谷歌前資深軟件開代碼審查的作用和注意事項(xiàng):因知道存在代碼審查,編碼者編寫代碼更為規(guī)范;代碼審查能傳播知識,使模塊編寫者之外的審查者也能熟悉程序的設(shè)計和架構(gòu);確保程序作者自己寫出的代碼是正確的;不應(yīng)過于匆忙的完成代碼審查;需要遵循嚴(yán)格的編碼規(guī)范。17/116代碼審查的作用和注意事項(xiàng):因知道存在代碼審查,編碼者編寫代碼2.2.2靜態(tài)結(jié)構(gòu)分析法靜態(tài)結(jié)構(gòu)分析法實(shí)際上是通過白盒測試工具輔助進(jìn)行程序檢查的一種方法。在靜態(tài)結(jié)構(gòu)分析中,測試人員通過測試工具分析程序的系統(tǒng)結(jié)構(gòu)、數(shù)據(jù)結(jié)構(gòu)、數(shù)據(jù)接口、控制邏輯等內(nèi)部結(jié)構(gòu),生成函數(shù)調(diào)用關(guān)系圖、程序控制流圖、內(nèi)部文件調(diào)用關(guān)系圖、子程序表、宏和函數(shù)參數(shù)表等各類圖表,可以清晰地呈現(xiàn)整個系統(tǒng)的組成結(jié)構(gòu),方便閱讀和理解。通過分析這些圖表,測試人員可以快速和有效地發(fā)現(xiàn)程序中潛在的錯誤。18/1162.2.2靜態(tài)結(jié)構(gòu)分析法靜態(tài)結(jié)構(gòu)分析法實(shí)際上是通過白盒測試表2-2靜態(tài)結(jié)構(gòu)分析圖表及其作用分類名稱內(nèi)容與作用圖函數(shù)調(diào)用關(guān)系圖列出所有函數(shù),用連線表示調(diào)用關(guān)系,展示系統(tǒng)的結(jié)構(gòu);發(fā)現(xiàn)系統(tǒng)是否存在結(jié)構(gòu)缺陷、區(qū)分函數(shù)的重要程度、確定測試覆蓋級別;檢查函數(shù)的調(diào)用關(guān)系是否正確;是否存在遞歸調(diào)用;函數(shù)的調(diào)用層次是否過深;檢查是否存在孤立而未被調(diào)用的函數(shù);確定函數(shù)調(diào)用頻度,重點(diǎn)檢查被頻繁調(diào)用的函數(shù)。模塊控制流圖由結(jié)點(diǎn)和邊組成,每個結(jié)點(diǎn)代表一條或多條語句,邊表示控制流;能夠直觀地反映一個模塊的內(nèi)部邏輯結(jié)構(gòu)。19表2-2靜態(tài)結(jié)構(gòu)分析圖表及其作用分類名稱內(nèi)容與作用圖函數(shù)調(diào)表2-2靜態(tài)結(jié)構(gòu)分析圖表及其作用(續(xù)表)

分類名稱內(nèi)容與作用表標(biāo)號交叉引用表列出所有模塊中用到的標(biāo)號;標(biāo)號的屬性,包括已說明、未說明、已使用、未使用;模塊以外的全局標(biāo)號、計算標(biāo)號。變量交叉引用表展示所有變量的定義和引用情況;變量的屬性,包括是否已說明、是否已使用、類型、是否屬于公共變量、全局變量等。子程序(宏、函數(shù))引用表列出所有子程序、宏和函數(shù)的屬性,包括類型、是否已定義、是否已引用、引用次數(shù)、輸入輸出參數(shù)的數(shù)量、順序和類型。等價表

列出在等價語句或等值語句中出現(xiàn)的全局變量和標(biāo)號。常數(shù)表

列出所有數(shù)字和字符常數(shù)。20/116表2-2靜態(tài)結(jié)構(gòu)分析圖表及其作用(續(xù)表)分名稱內(nèi)容與借助圖表,可以完成如下靜態(tài)錯誤分析:數(shù)據(jù)類型和單位分析。引用分析。找出變量引用錯誤,例如:變量賦值以前被引用或賦值后未被引用。表達(dá)式分析。發(fā)現(xiàn)表達(dá)式中不正確地使用括號、數(shù)據(jù)下標(biāo)越界等錯誤。接口分析。檢查模塊之間接口的一致性和模塊與外部數(shù)據(jù)庫之間接口的一致性。21借助圖表,可以完成如下靜態(tài)錯誤分析:數(shù)據(jù)類型和單位分析。212.3程序插樁定義:是在保證被測程序原有邏輯完整性的基礎(chǔ)上在程序中插入一些語句,這些語句被稱為“探針”、“探測器”或“探測點(diǎn)”,其本質(zhì)就是進(jìn)行信息采集的代碼段。測試人員常常借助程序插樁的方法來收集程序動態(tài)運(yùn)行行為,一些與運(yùn)行環(huán)境相關(guān)的程序行為只能通過程序插樁的方法來收集,靜態(tài)程序分析無法完成這樣的工作。通過程序插樁技術(shù),能夠獲取各種程序信息,是對程序進(jìn)行白盒測試的一種有效手段。222.3程序插樁定義:是在保證被測程序原有邏輯完整性的基礎(chǔ)上圖2-3計算最大公約數(shù)函數(shù)的程序插樁過程23圖2-3計算最大公約數(shù)函數(shù)的程序插樁過程23圖2-3是一個計算兩個整數(shù)的最大公約數(shù)函數(shù)的程序插樁示例,左邊是函數(shù)源程序,右邊是程序的流程圖。虛線框代表在源程序中插入的一些探針語句,用于記錄語句執(zhí)行的次數(shù),是一些計數(shù)器,可以用數(shù)組的方式實(shí)現(xiàn)。C(1)用于記錄函數(shù)被調(diào)用的次數(shù),C(2)用于記錄循環(huán)執(zhí)行的次數(shù),C(3)是函數(shù)出口計數(shù)器,C(4)~C(5)是主要程序分支上的計數(shù)器。24圖2-3是一個計算兩個整數(shù)的最大公約數(shù)函數(shù)的程序插樁示例,左插樁注意事項(xiàng):(1)需要探測哪些信息:這需要根據(jù)具體的測試目標(biāo)來決定。(2)在什么位置設(shè)置探測點(diǎn)程序的第一個可執(zhí)行語句之前,用于判斷該程序是否被執(zhí)行。有標(biāo)號的可執(zhí)行語句之前。for、while、dountil等循環(huán)語句處。if、then、else等條件分支語句處。輸入語句之后,用于檢驗(yàn)輸入數(shù)據(jù)的正確性。輸出語句之前,用于檢驗(yàn)將要輸出的數(shù)據(jù)是否正確。25/116插樁注意事項(xiàng):(1)需要探測哪些信息:這需要根據(jù)具體的測試目函數(shù)、過程等程序調(diào)用語句之后,用于判斷調(diào)用結(jié)果是否正確。Return語句之前,判斷程序是否正常返回。如果探針設(shè)置在return語句之后,那么它將無法被執(zhí)行。(3)需要設(shè)置多少個探測點(diǎn)一般情況下,在沒有分支的程序段中只需要在首尾各設(shè)置一個探測點(diǎn),用于確定程序執(zhí)行時該段程序是否被覆蓋。如果程序中有各種分支控制結(jié)構(gòu),如各種循環(huán)和條件判斷分支結(jié)構(gòu),那么為了插入最少的探測點(diǎn),需要針對程序的控制結(jié)構(gòu)進(jìn)行具體的分析。26/116函數(shù)、過程等程序調(diào)用語句之后,用于判斷調(diào)用結(jié)果是否正確。26(4)如何在程序的特定位置插入用于判斷變量特性的語句程序插樁并不是一個獨(dú)立的白盒測試方法,一般要和諸如覆蓋測試等方法結(jié)合起來使用。在實(shí)現(xiàn)程序覆蓋測試時,經(jīng)常需要獲得一些特定信息,要想獲得這些信息,就需要在被測程序中插入完成相應(yīng)工作的代碼,即運(yùn)用代碼插樁技術(shù)。需要注意的是,代碼插樁雖然不影響程序的邏輯結(jié)構(gòu)和復(fù)雜性,但是會破壞程序的時間特性。因此,在用程序插樁輔助完成一些性能監(jiān)視測試工作時,有時需要考慮插樁代碼對程序運(yùn)行效率的影響。27/116(4)如何在程序的特定位置插入用于判斷變量特性的語句27/1邏輯覆蓋測試是一種常用的動態(tài)白盒測試方法,主要包括語句覆蓋、判定覆蓋、條件覆蓋、判定-條件覆蓋、條件組合覆蓋和路徑覆蓋。邏輯覆蓋是基于程序的內(nèi)部邏輯結(jié)構(gòu)進(jìn)行的測試,要求在設(shè)計測試用例時,對被測程序的邏輯結(jié)構(gòu)有清晰的了解。2.4邏輯覆蓋測試28/116邏輯覆蓋測試是一種常用的動態(tài)白盒測試方法,主要包括語句覆蓋、源程序程序流程圖圖2-4邏輯覆蓋測試被測程序及其流程圖29源程序程序流程圖圖2-4邏輯覆蓋測試被測程序及其流程圖2在邏輯覆蓋測試中,決定程序分支走向的一個整體布爾型表達(dá)式被稱為一個判定,取值為True或False。一個判定不考慮其內(nèi)部是否包含“與”或者“或”等邏輯操作符。上述例程中包含兩個判定:“A>1andB=0”,為方便表達(dá)記為P1;“A=2orX>1”,記為P2。上述例程中只有3個變量,但是卻包含4個條件表達(dá)式:“A>1”,記為C1;“B=0”,記為C2;“A=2”,記為C3;“X>1”,記為C4。30在邏輯覆蓋測試中,決定程序分支走向的一個整體布爾型表達(dá)式被稱2.4.1語句覆蓋定義:設(shè)計若干個測試用例,使被測程序中的每一條可執(zhí)行語句至少執(zhí)行一次。注意事項(xiàng):為了盡可能減少設(shè)計、實(shí)施和維護(hù)測試用例的成本,邏輯覆蓋測試用例的數(shù)量應(yīng)當(dāng)越少越好,只要能夠滿足相應(yīng)的覆蓋標(biāo)準(zhǔn)即可。語句覆蓋是最弱的邏輯覆蓋標(biāo)準(zhǔn)。運(yùn)行測試用例(A=2,B=0,X=3),雖然能夠執(zhí)行所有語句,但是不能覆蓋所有的判定分支。因此,語句覆蓋只針對程序中顯式存在的語句,而無法測試隱藏的條件和可能的邏輯分支。312.4.1語句覆蓋定義:設(shè)計若干個測試用例,使被測程序中的2.4.2判定覆蓋判定覆蓋又稱為分支覆蓋,是指設(shè)計若干個測試用例,使被測程序中的每個判定的取真分支和取假分支至少被執(zhí)行一次,即每個判定的真假值均被滿足。32/1162.4.2判定覆蓋判定覆蓋又稱為分支覆蓋,是指設(shè)計若干個測測試用例P1P2執(zhí)行路徑A=2,B=0,X=4TTa-c-b-e-dA=3,B=1,X=1FFa-b-d表2-3判定覆蓋測試用例對于上述被測程序,設(shè)計如表2-3所示的判定覆蓋測試用例,使程序執(zhí)行路徑“a-c-b-e-d”和“a-b-d”。這樣,判定P1和P2的真假分支就都能被執(zhí)行到。33/116測試用例P1P2執(zhí)行路徑A=2,B=0,X=4TTa-c-b表2-4判定覆蓋測試用例測試用例P1P2執(zhí)行路徑A=3,B=0,X=1TFa-c-b-dA=2,B=1,X=3FTa-b-e-d設(shè)計如表2-4所示的測試用例,使程序執(zhí)行路徑“a-c-b-d”和“a-b-e-d”。這樣,判定P1和P2的真假分支也同樣都能被執(zhí)行到。34表2-4判定覆蓋測試用例測試用例P1P2執(zhí)行路徑A=3,注意程序中包含兩種類型的判定語句。一種是雙值判定語句,其取值或者是True或者是False。另一種是多值判定語句。因此,判定覆蓋更一般的含義是設(shè)計測試用例,使每一個分支獲得每一種可能的結(jié)果。判定覆蓋比語句覆蓋具有更好的測試充分性。由于可執(zhí)行語句要不就在判定的真分支,要不就在假分支上。所以,只要滿足了判定覆蓋標(biāo)準(zhǔn)的測試用例就一定滿足語句覆蓋標(biāo)準(zhǔn),反之則不然。判定覆蓋的測試充分性仍然很弱,它只是判斷整個判定表達(dá)式的最終取值結(jié)果,而不考慮表達(dá)式中每個條件的取值情況,因此必然會漏檢一些條件錯誤。判定表達(dá)式往往由多個條件組合而成,某個條件的取值結(jié)果可能會掩蓋其它條件的取值結(jié)果情況。35/116注意程序中包含兩種類型的判定語句。一種是雙值判定語句,其取值2.4.3條件覆蓋定義:條件覆蓋是指,設(shè)計足夠多的測試用例,使每個判定中的每個條件的真假取值都至少被滿足一次。上述程序中的4個條件C1~C4中每一個都有真假兩種取值可能,分別為:C1取真值(即A>1)記為T1,取假值(即A≤1)記為F1;C2取真值(即B=0)記為T2,取假值(即B≠0)記為F2;C3取真值(即A=2)記為T3,取假值(即A≠2)記為F3;C4取真值(即X>1)記為T4,取假值(即X≤1)記為F4。36/1162.4.3條件覆蓋定義:條件覆蓋是指,設(shè)計足夠多的測試用例表2-5條件覆蓋測試用例測試用例C1C2C3C4P1P2執(zhí)行路徑A=2,B=0,X=4T1T2T3T4TTa-c-b-e-dA=1,B=1,X=1F1F2F3F4FFa-b-d條件覆蓋一般比判定覆蓋要強(qiáng),因?yàn)槠涓鼮榧?xì)節(jié)地考慮了判定表達(dá)式中每個條件的取值情況。需要注意的是,雖然表2-5的測試用例也同時滿足了判定覆蓋標(biāo)準(zhǔn),但是滿足條件覆蓋標(biāo)準(zhǔn)的測試用例并不能總是保證滿足判定覆蓋標(biāo)準(zhǔn)。這是由于,條件覆蓋只考慮每個條件都取得真假兩種值,而不考慮所有的判定結(jié)果取值情況。37/116表2-5條件覆蓋測試用例測試用例C1C2C3C4P1P2表2-6條件覆蓋測試用例測試用例C1C2C3C4P1P2執(zhí)行路徑A=2,B=0,X=1T1T2T3F4TTa-c-b-e-dA=1,B=1,X=4F1F2F3T4FTa-b-e-d表2-6的測試用例滿足了條件覆蓋標(biāo)準(zhǔn),但是由于判定P2只有取真值一種情況,其False分支未被執(zhí)行,因此不滿足判定覆蓋標(biāo)準(zhǔn)。38/116表2-6條件覆蓋測試用例測試用例C1C2C3C4P1P2定義:由判定覆蓋和條件覆蓋可知,條件覆蓋不一定包含判定覆蓋,反之亦然。因此,就需要一種能將兩者結(jié)合起來的邏輯覆蓋標(biāo)準(zhǔn),這就是判定-條件覆蓋,也稱為分支-條件覆蓋或條件判定組合覆蓋?;舅枷耄涸O(shè)計足夠多的測試用例,使被測程序中每個判定的每個條件的可能取值至少被執(zhí)行一次,并且每個可能的判定結(jié)果也至少被執(zhí)行一次。2.4.4判定-條件覆蓋39定義:由判定覆蓋和條件覆蓋可知,條件覆蓋不一定包含判定覆蓋,注意:判定-條件覆蓋并不一定能夠查出邏輯表達(dá)式中的所有錯誤。從測試充分性上來看,滿足判定-條件覆蓋就一定能夠滿足條件覆蓋、判定覆蓋和語句覆蓋。40注意:判定-條件覆蓋并不一定能夠查出邏輯表達(dá)式中的所有錯誤。定義:條件組合覆蓋是指,設(shè)計足夠多的測試用例,使被測程序中每個判定的所有可能的條件取值組合至少被執(zhí)行一次。條件組合覆蓋與條件覆蓋的區(qū)別是:僅要求每個條件都能有真假兩種取值結(jié)果,而且要求這些結(jié)果的所有可能組合都至少出現(xiàn)一次。2.4.5條件組合覆蓋41定義:條件組合覆蓋是指,設(shè)計足夠多的測試用例,使被測程序中每表2-7條件取值組合情況組合編號1234條件取值組合T1,T2T1,F(xiàn)2F1,T2F1,F(xiàn)2表2-7條件取值組合情況(續(xù)表)組合編號5678條件取值組合T3,T4T3,F(xiàn)4F3,T4F3,F(xiàn)442表2-7條件取值組合情況組合編號1234條件取值組合T1注意:條件取值組合只針對同一個判定表達(dá)式內(nèi)存在多個條件的情況,將這些條件的取值進(jìn)行笛卡爾乘積組合;不同判定表達(dá)式內(nèi)的條件取值之間無需組合;對于單條件的判定表達(dá)式,只需要滿足自己的所有取值即可。根據(jù)表2-7的條件取值組合情況,可以設(shè)計表2-8所示的條件組合覆蓋測試用例。43注意:43表2-8條件組合覆蓋測試用例測試用例C1C2C3C4覆蓋條件組合P1P2執(zhí)行路徑A=2,B=0,X=4T1T2T3T41,5TTa-c-b-e-dA=2,B=1,X=1T1F2T3F42,6FTa-b-e-dA=1,B=0,X=2F1T2F3T43,7FTa-b-e-dA=1,B=1,X=1F1F2F3F44,8FFa-b-d44表2-8條件組合覆蓋測試用例測試用例C1C2C3C4覆蓋條件組合覆蓋是一種很強(qiáng)的覆蓋標(biāo)準(zhǔn),能夠有效地測試各種條件取值組合是否正確。但是,條件組合覆蓋也線性地增加了測試用例的數(shù)量,提高了測試用例設(shè)計、實(shí)施和維護(hù)的成本。即便如此,條件組合覆蓋仍然可能漏測部分程序可執(zhí)行路徑,測試還不夠充分。45條件組合覆蓋是一種很強(qiáng)的覆蓋標(biāo)準(zhǔn),能夠有效地測試各種條件取值例:被測程序中有4條可執(zhí)行路徑,分別為:路徑1:a-c-b-e-d;路徑2:a-b-d;路徑3:a-c-b-d;路徑4:a-b-e-d。而表2-8的測試用例“執(zhí)行路徑”項(xiàng)中只有3條執(zhí)行路徑,路徑“a-b-e-d”是重復(fù)的,漏測了可執(zhí)行路徑“a-c-b-d”。46例:被測程序中有4條可執(zhí)行路徑,分別為:462.4.6路徑覆蓋定義:路徑覆蓋就是設(shè)計足夠多的測試用例,使被測程序的每條可執(zhí)行路徑都至少執(zhí)行一次。例:被測程序中有4條可執(zhí)行路徑,因此表2-9所示路徑覆蓋測試用例由4條測試用例構(gòu)成。472.4.6路徑覆蓋定義:路徑覆蓋就是設(shè)計足夠多的測試用例,測試用例C1C2C3C4P1P2執(zhí)行路徑A=2,B=0,X=3T1T2T3T4TTa-c-b-e-dA=1,B=1,X=1F1F2F3F4FFa-b-dA=3,B=0,X=3T1T2F3F4TFa-c-b-dA=2,B=1,X=1T1F2T3F4FTa-b-e-d表2-9路徑覆蓋測試用例48/116測試用例C1C2C3C4P1P2執(zhí)行路徑A=2,B=0,X=路徑覆蓋測試的特點(diǎn):路徑覆蓋是經(jīng)常使用的覆蓋測試方法,相比于其它邏輯覆蓋方法,它的測試覆蓋率最大。路徑覆蓋不一定能保證條件組合覆蓋。例如上面的測試用例中,“F1,T2”和“F3,T4”兩種條件取值組合情況就未能覆蓋到。路徑覆蓋也不一定能保證條件覆蓋。由于路徑覆蓋必然經(jīng)歷所有判定的各個分支,因此路徑覆蓋能夠完全包容判定覆蓋和語句覆蓋。49/116路徑覆蓋測試的特點(diǎn):49/116注意:隨著代碼復(fù)雜度的增加,程序可執(zhí)行路徑的數(shù)量可能呈指數(shù)級增長。如果被測程序中包含循環(huán)結(jié)構(gòu),隨著循環(huán)嵌套層次和循環(huán)次數(shù)的增加,程序可執(zhí)行路徑數(shù)可能達(dá)到天文數(shù)字。這種情況下,一般通過下一小節(jié)的Z路徑覆蓋方法進(jìn)行測試。50/116注意:隨著代碼復(fù)雜度的增加,程序可執(zhí)行路徑的數(shù)量可能呈指數(shù)級小結(jié)通過以上6種邏輯覆蓋測試方法的講解我們會發(fā)現(xiàn),沒有十全十美的覆蓋測試方法,每一種方法都有其優(yōu)點(diǎn)和局限性。在實(shí)際測試用例設(shè)計過程中,需要根據(jù)實(shí)際情況將幾種邏輯覆蓋測試方法配合使用,以達(dá)到最高的覆蓋率。實(shí)際工作中,語句覆蓋、判定覆蓋和路徑覆蓋使用的最多,一般有如下要求:語句覆蓋率:100%;判定覆蓋率:85以上;路徑覆蓋率:80%以上51小結(jié)通過以上6種邏輯覆蓋測試方法的講解我們會發(fā)現(xiàn),沒有十全十基于對上述6種邏輯覆蓋方法測試充分性的分析,可以將它們之間的強(qiáng)弱關(guān)系用圖2-5表示。圖2-56種邏輯覆蓋測試的強(qiáng)弱關(guān)系52基于對上述6種邏輯覆蓋方法測試充分性的分析,可以將它們之間的2.4.7Z路徑覆蓋Z路徑覆蓋是一種簡化循環(huán)意義下的路徑覆蓋測試方法。Z路徑覆蓋舍掉了路徑覆蓋的一些次要因素,對循環(huán)機(jī)制進(jìn)行了簡化。通過限制循環(huán)的次數(shù),最大化的減少了路徑的數(shù)量,使得覆蓋這些有限的路徑成為可能。無論循環(huán)的形式和循環(huán)體實(shí)際執(zhí)行的次數(shù)如何,在Z路徑覆蓋測試中,只考慮執(zhí)行循環(huán)體一次和零次兩種情況,即只考慮執(zhí)行時進(jìn)入循環(huán)體一次和跳過循環(huán)體這兩種情況。532.4.7Z路徑覆蓋Z路徑覆蓋是一種簡化循環(huán)意義下的路徑圖2-6循環(huán)結(jié)構(gòu)簡化成選擇結(jié)構(gòu)54圖2-6循環(huán)結(jié)構(gòu)簡化成選擇結(jié)構(gòu)54圖2-6(a)和圖2-6(b)是兩種典型的循環(huán)結(jié)構(gòu)。前者先做判斷,循環(huán)體只考慮執(zhí)行一次或不執(zhí)行,其效果與圖2-6(c)是一樣的。后者先執(zhí)行循環(huán)體,也只考慮執(zhí)行一次,然后再經(jīng)判斷轉(zhuǎn)出,其效果與圖2-6(c)中只執(zhí)行選擇結(jié)構(gòu)右分支一樣。經(jīng)過Z路徑覆蓋方法對循環(huán)結(jié)構(gòu)進(jìn)行簡化后,程序中只存在順序結(jié)構(gòu)和分支結(jié)構(gòu),其所包含的路徑數(shù)一般是有限的,因此可以做到對這些路徑的覆蓋。55/116圖2-6(a)和圖2-6(b)是兩種典型的循環(huán)結(jié)構(gòu)。前者先做2.4.8路徑覆蓋最少測試用例數(shù)計算通過程序盒圖(也稱為N-S圖)對一種計算路徑覆蓋最少測試用例數(shù)的方法進(jìn)行說明。圖2-7由盒圖表示的程序基本邏輯結(jié)構(gòu)56/1162.4.8路徑覆蓋最少測試用例數(shù)計算通過程序盒圖(也稱為N圖2-7中包含了3種程序的基本邏輯結(jié)構(gòu):順序、選擇和循環(huán)。一個順序結(jié)構(gòu)無論語句多少,只有一條可執(zhí)行路徑;一個If-Then-Else型選擇結(jié)構(gòu)包含兩條可執(zhí)行路徑;一個多分支Case型選擇結(jié)構(gòu)的可執(zhí)行路徑數(shù)量由它的分支數(shù)量決定。對于循環(huán)型結(jié)構(gòu)來講,,我們只需要清楚包含選擇結(jié)構(gòu)的程序的可執(zhí)行路徑數(shù)量計算方法即可。57圖2-7中包含了3種程序的基本邏輯結(jié)構(gòu):順序、選擇和循環(huán)。5圖2-8兩個串行的選擇結(jié)構(gòu)如圖2-8所示,程序包含4條可執(zhí)行路徑,分別經(jīng)過語句(塊)AC、AD、BC和BD。因此,最少的路徑覆蓋測試用例數(shù)為4。實(shí)際上,這樣的計算結(jié)果是根據(jù)“串行分層相乘”的方法計算出來的。圖2-8的程序盒圖可以分為上下兩層,上層的P1選擇結(jié)構(gòu)包含2條路徑,下層P2選擇結(jié)構(gòu)包含2條路徑,將它們相乘就得到計算結(jié)果4。對于盒圖選擇結(jié)構(gòu)中并行的語句(塊),如A和B,C和D,將它們的數(shù)量相加就可以得到該并行層次的路徑數(shù)。58圖2-8兩個串行的選擇結(jié)構(gòu)如圖2-8所示,程序包含4條可執(zhí)圖2-9復(fù)雜結(jié)構(gòu)程序盒圖示例59圖2-9復(fù)雜結(jié)構(gòu)程序盒圖示例59圖2-9的盒圖中包含兩組串行的選擇結(jié)構(gòu):P1與P8,P2與P6,分別以分層線1和2標(biāo)識。P8所包含的嵌套選擇結(jié)構(gòu)路徑數(shù)為3,將它與P1所包含的路徑數(shù)相乘即可得到最終路徑數(shù)。P2所包含的嵌套選擇結(jié)構(gòu)路徑數(shù)為5,P6所包含的嵌套選擇結(jié)構(gòu)路徑數(shù)為3,二者相乘得到P1的右分支路徑數(shù)為5×3=15。P1的左分支是一個簡單路徑,結(jié)合右分支計算結(jié)果可知,P1所包含的嵌套選擇結(jié)構(gòu)路徑數(shù)為15+1=16。因此,結(jié)合P8路徑數(shù)計算結(jié)果可知,該程序的可執(zhí)行路徑總數(shù)為16×3=48。也就是說,最少需要48個測試用例才能保證完成該程序的路徑覆蓋測試。60圖2-9的盒圖中包含兩組串行的選擇結(jié)構(gòu):P1與P8,P2與2.5循環(huán)結(jié)構(gòu)測試在上面一個小節(jié)中,我們講解了幾種主要的邏輯覆蓋測試方法,這些方法主要是針對程序選擇結(jié)構(gòu)的測試方法。當(dāng)碰到循環(huán)結(jié)構(gòu)時,都進(jìn)行了大幅度的簡化,將循環(huán)結(jié)構(gòu)轉(zhuǎn)化為選擇結(jié)構(gòu)進(jìn)行測試。但是,當(dāng)程序中包含比較復(fù)雜的循環(huán)結(jié)構(gòu)或者循環(huán)結(jié)構(gòu)中的程序計算很容易出錯時,就需要對其進(jìn)行更為全面和深入的測試。61/1162.5循環(huán)結(jié)構(gòu)測試在上面一個小節(jié)中,我們講解了幾種主要的邏圖2-104種典型的循環(huán)結(jié)構(gòu)形式62/116圖2-104種典型的循環(huán)結(jié)構(gòu)形式62/116循環(huán)結(jié)構(gòu)一般有如圖2-10所示的4種形式:簡單循環(huán)、嵌套循環(huán)、串接循環(huán)和不規(guī)則循環(huán)。其中,不規(guī)則循環(huán)無法進(jìn)行測試,需要對循環(huán)結(jié)構(gòu)進(jìn)行重新設(shè)計,使之成為結(jié)構(gòu)化的程序后再進(jìn)行測試。63/116循環(huán)結(jié)構(gòu)一般有如圖2-10所示的4種形式:簡單循環(huán)、嵌套循環(huán)(1)簡單循環(huán)對簡單循環(huán)進(jìn)行測試時,需要考慮循環(huán)的次數(shù)以及循環(huán)邊界值和接近邊界值的情況。假定循環(huán)的最大次數(shù)為n,一般需要設(shè)計如下幾種測試用例。零次循環(huán):從循環(huán)入口直接跳到循環(huán)出口。一次循環(huán):只有一次通過循環(huán),用于查找可能的循環(huán)初始值錯誤。兩次循環(huán):兩次通過循環(huán)。m次循環(huán):m次通過循環(huán),其中m<n,也就是在n次循環(huán)中找一個中間值,用于查找在多次循環(huán)時才可能暴露的錯誤。64(1)簡單循環(huán)64n-1次循環(huán):比最大循環(huán)次數(shù)少一次的循環(huán)。n次循環(huán):用最大循環(huán)次數(shù)執(zhí)行循環(huán)。n+1次循環(huán):比最大循環(huán)次數(shù)多一次通過循環(huán)。測試中,我們還需要關(guān)注以下幾個問題:循環(huán)變量的初值是否正確。循環(huán)變量的最大值是否正確。循環(huán)變量的增量是否正確。何時退出循環(huán)。65/116n-1次循環(huán):比最大循環(huán)次數(shù)少一次的循環(huán)。65/116intSample_Loop(){

inti=1;intSum=0;while(i<=10){Sum=Sum+i;

i=i+1;}returnSum;}例:給定程序示例的測試用例如表2-10所示66intSample_Loop()例:給定程序示例的測試測試內(nèi)容測試用例備注整個跳過循環(huán)i=110次通過循環(huán)只有一次通過循環(huán)i=10

兩次通過循環(huán)i=9

m次通過循環(huán),其中m<10i=56次通過循環(huán)n-1次通過循環(huán)i=29次通過循環(huán)n次通過循環(huán)i=110次通過循環(huán)n+1次通過循環(huán)i=011次通過循環(huán)表2-10簡單循環(huán)測試用例67測試內(nèi)容測試用例備注整個跳過循環(huán)i=110次通過循環(huán)只有一(2)嵌套循環(huán)如果將簡單循環(huán)的測試方法用于測試嵌套循環(huán),隨著嵌套層數(shù)的增加,測試用例數(shù)就會呈指數(shù)級增長。針對這個問題,一般采用如下嵌套循環(huán)測試方法:從最內(nèi)層循環(huán)開始,將所有其它層的循環(huán)設(shè)置為最小值。對最內(nèi)層循環(huán)使用簡單循環(huán)測試。測試時,保持所有外層循環(huán)的循環(huán)變量是最小值。另外,對越界值和非法值增加其它測試。68/116(2)嵌套循環(huán)68/116由內(nèi)向外逐層外推,對其外面一層循環(huán)進(jìn)行測試。測試時,其它的外層循環(huán)變量取最小值,所有其它嵌套內(nèi)循環(huán)的循環(huán)變量取“典型”值。反復(fù)進(jìn)行,直到所有各層循環(huán)測試完畢。對全部各層循環(huán),同時取最小循環(huán)次數(shù)和最大循環(huán)次數(shù)進(jìn)行測試。69/116由內(nèi)向外逐層外推,對其外面一層循環(huán)進(jìn)行測試。測試時,其它的外2.6基本測試路徑定義:基本路徑測試法是在程序控制流圖的基礎(chǔ)上,通過分析控制構(gòu)造的環(huán)路復(fù)雜性,導(dǎo)出基本可執(zhí)行路徑集合,從而設(shè)計測試用例的方法。設(shè)計出的測試用例需要保證被測程序的每一條可執(zhí)行語句至少被執(zhí)行一次。70/1162.6基本測試路徑定義:基本路徑測試法是在程序控制流圖的基基本路徑測試法步驟:(1)以詳細(xì)設(shè)計或源代碼為基礎(chǔ),繪制程序控制流圖;(2)根據(jù)程序控制流圖,計算程序環(huán)路復(fù)雜度;(3)確定獨(dú)立路徑的集合;(4)生成測試用例。71/116基本路徑測試法步驟:(1)以詳細(xì)設(shè)計或源代碼為基礎(chǔ),繪制程序2.6.1程序控制流圖與環(huán)路復(fù)雜度程序控制流圖簡稱流圖,本質(zhì)上是一種“退化”了的程序流程圖,用于突出表示程序的控制結(jié)構(gòu)。流圖只呈現(xiàn)程序的控制流程,完全不表現(xiàn)具體的語句以及選擇或循環(huán)的具體條件。72/1162.6.1程序控制流圖與環(huán)路復(fù)雜度程序控制流圖簡稱流圖,本程序控制流圖的基本形式73/116程序控制流圖的基本形式73/116控制流圖是一種有向圖,由結(jié)點(diǎn)和邊構(gòu)成,其含義分別為:(1)結(jié)點(diǎn):用圓表示。一個結(jié)點(diǎn)代表一條或多條順序執(zhí)行的語句。程序流程圖中的一個順序的處理框序列和一個菱形判定框,可以映射成流圖中的一個結(jié)點(diǎn)。(2)邊:用箭頭線表示。邊代表控制流,一條邊必須終止于一個結(jié)點(diǎn),即使這個結(jié)點(diǎn)并不代表任何語句。74/116控制流圖是一種有向圖,由結(jié)點(diǎn)和邊構(gòu)成,其含義分別為:74/1當(dāng)我們將常見的程序流程圖轉(zhuǎn)化為控制流圖時,需要注意以下兩點(diǎn):在選擇或者是多分支結(jié)構(gòu)中,分支的匯聚處應(yīng)當(dāng)添加一個匯聚結(jié)點(diǎn),即使是該處并沒有實(shí)際的可執(zhí)行語句也應(yīng)如此,這樣可以使控制結(jié)構(gòu)表現(xiàn)地更為完整和清晰。由邊和結(jié)點(diǎn)圍成的面積稱為區(qū)域。當(dāng)計算區(qū)域總數(shù)時,圖形外未被圍起來的那個區(qū)域也要記為一個區(qū)域。75/116當(dāng)我們將常見的程序流程圖轉(zhuǎn)化為控制流圖時,需要注意以下兩點(diǎn):圖2-12(a)是一個程序的流程圖,可以將其轉(zhuǎn)化為圖2-12(b)所示的控制流圖。圖2-12程序流程圖轉(zhuǎn)化為控制流圖76/116圖2-12(a)是一個程序的流程圖,可以將其轉(zhuǎn)化為圖2-12根據(jù)程序控制流圖,可以定量度量程序的復(fù)雜程度,度量結(jié)果稱為程序的環(huán)路復(fù)雜度、環(huán)形復(fù)雜度或圈復(fù)雜度。流圖一般標(biāo)記為G,其環(huán)路復(fù)雜度標(biāo)記為V(G)。一般來講,一個模塊的環(huán)路復(fù)雜度V(G)≤10。計算環(huán)路復(fù)雜度有以下3種方法:(1)控制流圖中的區(qū)域數(shù)等于環(huán)路復(fù)雜度。(2)V(G)=E-N+2,其中,E是控制流圖中邊的數(shù)量,N是結(jié)點(diǎn)的數(shù)量。(3)V(G)=P+1,其中,P是控制流圖中判定結(jié)點(diǎn)的數(shù)量。77/116根據(jù)程序控制流圖,可以定量度量程序的復(fù)雜程度,度量結(jié)果稱為程例:通過上述方法計算圖2-12(b)程序的環(huán)路復(fù)雜度:有R1~R4共4個區(qū)域,環(huán)路復(fù)雜度為4。E=11,N=9,V(G)=11-9+2=4。控制流圖中“出度”大于1的結(jié)點(diǎn)即為判定結(jié)點(diǎn),也就是說,起始于判定結(jié)點(diǎn),以其作為箭頭線尾端的邊的數(shù)量一定大于1。因此,結(jié)點(diǎn)1、(2,3)和6是判定結(jié)點(diǎn),P=3。V(G)=3+1=4。78/116例:通過上述方法計算圖2-12(b)程序的環(huán)路復(fù)雜度:78/環(huán)路復(fù)雜度3種計算方法得到的結(jié)果一定是相同的,它們之間可以相互驗(yàn)證。在圖2-12(a)中,我們實(shí)際上是假設(shè)所有菱形框表示的判定內(nèi)沒有復(fù)合條件。需要特別注意的是,如果判定包含復(fù)合條件,生成控制流圖時,應(yīng)當(dāng)把復(fù)合條件分解為若干個簡單條件,每個簡單條件對應(yīng)流圖中的一個結(jié)點(diǎn)。圖2-13(a)和(b)分別展示了“與”邏輯和“或”邏輯復(fù)合條件組合時,控制流圖的生成方法。79/116環(huán)路復(fù)雜度3種計算方法得到的結(jié)果一定是相同的,它們之間可以相圖2-13復(fù)合條件下的控制流圖80/116圖2-13復(fù)合條件下的控制流圖80/1162.6.2獨(dú)立路徑集合獨(dú)立路徑,也稱為基本路徑,其含義包含以下兩點(diǎn):(1)是一條從起始結(jié)點(diǎn)到終止結(jié)點(diǎn)的路徑。(2)一條獨(dú)立路徑至少包含一條其它獨(dú)立路徑?jīng)]有包含的邊,也就是說,至少引入了一條新執(zhí)行語句或一個新判定的程序通路。81/1162.6.2獨(dú)立路徑集合獨(dú)立路徑,也稱為基本路徑,其含義包含圖2-14獨(dú)立路徑集合示例圖2-14是一個程序控制流圖,其環(huán)路復(fù)雜度為:V(G)=圖中區(qū)域數(shù)=5。V(G)=E-N+2=10-7+2=5。V(G)=P+1=4+1=5。82/116圖2-14獨(dú)立路徑集合示例圖2-14是一個程序控制流圖,其程序的環(huán)路復(fù)雜度計算結(jié)果給出了程序獨(dú)立路徑集合中的獨(dú)立路徑條數(shù),這是保證程序中每個可執(zhí)行語句至少被執(zhí)行一次所必需的測試用例數(shù)量的上限,也就是說,我們只要最多V(G)個測試用例就可以滿足基本路徑覆蓋要求。83/116程序的環(huán)路復(fù)雜度計算結(jié)果給出了程序獨(dú)立路徑集合中的獨(dú)立路徑條針對圖2-14的示例,我們可以找出如下5條獨(dú)立路徑,構(gòu)成獨(dú)立路徑集合:Path1:a-b-c-g。Path2:a-b-c-b-c-g。Path3:a-b-e-f-g。Path4:a-d-e-f-g。Path5:a-d-f-g。如果再找出一條路徑Path6=a-b-c-b-e-f-g,我們會發(fā)現(xiàn),在原有5條獨(dú)立路徑的基礎(chǔ)上,Path6并沒有引入任何新的邊。所以,Path6不再是一條新的獨(dú)立路徑。84/116針對圖2-14的示例,我們可以找出如下5條獨(dú)立路徑,構(gòu)成獨(dú)立一個程序的獨(dú)立路徑集合通常并不是唯一的,例如,將Path2替換為Path6也可以構(gòu)成一個新的獨(dú)立路徑集合。獨(dú)立路徑集合中的每一條路徑都是以起始結(jié)點(diǎn)“a”開始,以終止結(jié)點(diǎn)“g”結(jié)束的。85/116一個程序的獨(dú)立路徑集合通常并不是唯一的,例如,將Path2替2.6.3基本路徑測試用例1 intTest(intcount,intflag)2 {3 inttemp=0;4

while(count>0)5 {6

if(flag==0)7

{8 temp=count+100;9 break;10

}11

else12

{13

if(flag==1)14 temp=temp+10;15 else16 temp=temp+20;17

}18 count=count-1;19 }20 returntemp;21}86/1162.6.3基本路徑測試用例1 intTest(int上述程序?qū)崿F(xiàn)當(dāng)flag=0時,返回count+100;當(dāng)flag=1時,返回count*10;flag是其它值時,返回count*20。下面按照基本路徑測試法的4個步驟進(jìn)行說明。(1)畫出上述程序的控制流圖87/116上述程序?qū)崿F(xiàn)當(dāng)flag=0時,返回count+100;當(dāng)fl圖2-15程序流程圖和控制流圖88/116圖2-15程序流程圖和控制流圖88/116

圖中的數(shù)字是源程序中的行號,4、6、13是判定結(jié)點(diǎn)。語句3和4順序執(zhí)行,合并為結(jié)點(diǎn)4;語句8和9順序執(zhí)行,合并為結(jié)點(diǎn)8。89/116圖中的數(shù)字是源程序中的行號,4、6、13是判定結(jié)點(diǎn)。語句3(2)計算程序環(huán)路復(fù)雜度

由圖2-15(b)的程序控制流圖可以計算得出:V(G)=圖中區(qū)域數(shù)=4。V(G)=E-N+2=10-8+2=4。V(G)=P+1=3+1=4。程序環(huán)路復(fù)雜度是4。因此,只要最多4個測試用例就可以達(dá)到基本路徑覆蓋。90/116(2)計算程序環(huán)路復(fù)雜度90/116(3)確定獨(dú)立路徑集合在程序控制流圖中,從起始結(jié)點(diǎn)4到終止結(jié)點(diǎn)20共有4條獨(dú)立路徑:4-204-6-8-204-6-13-14-18-4-204-6-13-16-18-4-20上面4條獨(dú)立路徑構(gòu)成的集合已經(jīng)包括了流圖中所有的邊。91/116(3)確定獨(dú)立路徑集合91/116(4)設(shè)計測試用例根據(jù)上面得到的4條獨(dú)立路徑可以設(shè)計如表2-11所示的4項(xiàng)測試用例。輸入數(shù)據(jù)預(yù)期結(jié)果獨(dú)立路徑flag=0,或者是flag<0的某一個值temp=04-20count=1,flag=0temp=1014-6-8-20count=1,flag=1temp=104-6-13-14-18-4-20count=1,flag=2temp=204-6-13-16-18-4-20表2-11基本路徑測試用例92/116(4)設(shè)計測試用例輸入數(shù)據(jù)預(yù)期結(jié)果獨(dú)立路徑flag=0,或者程序的環(huán)路復(fù)雜度表示的是最多的測試用例個數(shù),是測試用例數(shù)量的上界,實(shí)際用例數(shù)不一定要達(dá)到這個上界。測試用例數(shù)量越簡化,測試的充分性就越低。需要根據(jù)實(shí)際情況來確定測試用例數(shù)量簡化的程度。注意:93/116程序的環(huán)路復(fù)雜度表示的是最多的測試用例個數(shù),是測試用例數(shù)量的圖2-16包含復(fù)合條件的程序流程圖94/116圖2-16包含復(fù)合條件的程序流程圖94/116圖2-16是一個計算學(xué)生平均成績的程序流程圖。該程序最多可以計算50個學(xué)生的平平均成績,以-1作為成績輸入結(jié)束標(biāo)志。程序流程圖中,i是學(xué)生序號,n1是有效成績數(shù)量,n2是輸入的成績數(shù)量,sum是成績累加值,Score(i)是第i個學(xué)生的成績,Average是平均成績。95/116圖2-16是一個計算學(xué)生平均成績的程序流程圖。該程序最多可以(1)畫出程序的控制流圖96/116(1)畫出程序的控制流圖96/116(2)計算環(huán)路復(fù)雜度V(G)=圖中區(qū)域數(shù)=6。V(G)=E-N+2=16-12+2=6。V(G)=P+1=5+1=6。(3)確定獨(dú)立路徑集合可以確定以下6條獨(dú)立路徑:1-2-9-10-121-2-9-11-121-2-3-9-10-121-2-3-4-5-8-2…1-2-3-4-5-6-8-2…1-2-3-4-5-6-7-8-2…97/116(2)計算環(huán)路復(fù)雜度97/116(4)設(shè)計測試用例為每一條獨(dú)立路徑各設(shè)計一個測試用例,驅(qū)動被測程序沿著該路徑至少執(zhí)行一次??梢栽O(shè)計如表2-12所示的6個測試用例。98/116(4)設(shè)計測試用例98/116輸入數(shù)據(jù)預(yù)期結(jié)果獨(dú)立路徑Score(1)=60,Score(2)=-1n1=1,sum=60,Average=601-2-9-10-12Score(1)=-1Average=-1,其它變量為初值1-2-9-11-12輸入多于50個有效分?jǐn)?shù)n1=50,正確的sum和Average值1-2-3-9-10-12Score(1)=-5,Score(2)=70,Score(3)=-1n1=1,sum=70,Average=701-2-3-4-5-8-2…Score(1)=110,Score(2)=80,Score(3)=-1n1=1,sum=80,Average=801-2-3-4-5-6-8-2…Score(1)=80,Score(2)=90,Score(3)=-1n1=2,sum=170,Average=851-2-3-4-5-6-7-8-2…表2-12基本路徑測試用例99/116輸入數(shù)據(jù)預(yù)期結(jié)果獨(dú)立路徑Score(1)=60,Score(2.6.4控制流圖矩陣定義:控制流圖矩陣是將程序控制流圖表達(dá)為矩陣的方式。作用:利用控制流圖矩陣,可以構(gòu)造輔助完成路徑測試的工具,自動地確定獨(dú)立路徑集合,評估程序的控制結(jié)構(gòu)。原理:控制流圖矩陣實(shí)際上是一個有向圖的圖形矩陣,由行列數(shù)相同的方陣構(gòu)成,行列數(shù)即為控制流圖中的結(jié)點(diǎn)數(shù),每行和每列依次對應(yīng)一個結(jié)點(diǎn),矩陣元素反映的是結(jié)點(diǎn)間的連接關(guān)系。如果結(jié)點(diǎn)i到結(jié)點(diǎn)j之間有一條邊,那么矩陣第i行第j列的元素非空。矩陣元素標(biāo)記為權(quán)值1,表示存在一個連接;標(biāo)記為空或權(quán)值0,則表示不存在連接。100/1162.6.4控制流圖矩陣定義:控制流圖矩陣是將程序控制流圖表圖2-18控制流圖矩陣?yán)?,可以將圖2-15(b)的控制流圖表達(dá)為如圖2-18所示的控制流圖矩陣。從圖中可以看出,凡是一行中有大于等于兩個元素的結(jié)點(diǎn)就一定是判定結(jié)點(diǎn)。通過這一特點(diǎn),可以方便地確定判定結(jié)點(diǎn)的數(shù)量,然后計算環(huán)路復(fù)雜度。101/116圖2-18控制流圖矩陣?yán)纾梢詫D2-15(b)的控制流對于控制流圖矩陣中的元素,除了權(quán)值之外,還可以賦予其它屬性信息,用于完成對控制結(jié)構(gòu)的一些評估工作。執(zhí)行連接(邊)的概率。執(zhí)行連接的頻率連接的處理時間。執(zhí)行連接所需的計算資源(如內(nèi)存等)。102/116對于控制流圖矩陣中的元素,除了權(quán)值之外,還可以賦予其它屬性信2.6.5基本路徑測試法的擴(kuò)展應(yīng)用用基本路徑測試法對程序進(jìn)行測試時,路徑是指函數(shù)代碼的某個分支。實(shí)際上,將軟件系統(tǒng)的某個流程也看做是路徑的話,就可以用基本路徑分析的方法來設(shè)計測試用例。此時,控制流圖結(jié)點(diǎn)的粒度由語句級擴(kuò)大到了模塊級,而邊反映了軟件的系統(tǒng)流程。103/1162.6.5基本路徑測試法的擴(kuò)展應(yīng)用用基本路徑測試法對程序進(jìn)采用基本路徑測試法測試系統(tǒng)流程有如下優(yōu)點(diǎn):在已知系統(tǒng)流程結(jié)構(gòu)的基礎(chǔ)上,可以設(shè)計出高質(zhì)量的測試用例,降低了設(shè)計難度。在測試時間緊張的情況下,可以完成對系統(tǒng)重點(diǎn)流程的測試,無需完全根據(jù)經(jīng)驗(yàn)來取舍測試內(nèi)容。104/116采用基本路徑測試法測試系統(tǒng)流程有如下優(yōu)點(diǎn):104/116應(yīng)用基本路徑測試法對系統(tǒng)流程進(jìn)行測試時,一般分為如下3個步驟。(1)將系統(tǒng)運(yùn)行的流程以控制流圖的方式表達(dá)出來將系統(tǒng)流程表達(dá)為不同功能或模塊的執(zhí)行關(guān)系序列,從最常使用的基本流程入手,再考慮次要和異常的流程。通過逐步理解和細(xì)化流程,將各個看似孤立的流程關(guān)聯(lián)起來,形成完整的系統(tǒng)控制流圖。(2)找出所有的系統(tǒng)流程獨(dú)立路徑并為每條路徑設(shè)定優(yōu)先級路徑優(yōu)先級的設(shè)定考慮以下兩個因素:路徑使用的頻率。使用頻率越高,則路徑優(yōu)先級越高。路徑的重要程度。路徑執(zhí)行失敗對系統(tǒng)的影響越大,則優(yōu)先級越高。105/116應(yīng)用基本路徑測試法對系統(tǒng)流程進(jìn)行測試時,一般分為如下3個步驟將上述兩個因素確定的優(yōu)先級相加就得到了路徑的最終優(yōu)先級。根據(jù)路徑優(yōu)先級的排序就可以確定對所有獨(dú)立路徑的測試順序以及測試的細(xì)致程度。(3)設(shè)計測試用例為每條獨(dú)立路徑選取測試數(shù)據(jù),形成測試用例。每條路徑可以對應(yīng)多個測試用例,相應(yīng)的測試輸入數(shù)據(jù)應(yīng)當(dāng)充分考慮典型值、邊界值和特殊值等情況。106/116將上述兩個因素確定的優(yōu)先級相加就得到了路徑的最終優(yōu)先級。根據(jù)2.7其它白盒測試方法(1)域測試程序錯誤可以分為域錯誤、計算型錯誤和丟失路徑錯誤三種。域錯誤。這種錯誤也被稱為路徑錯誤。程序的每條執(zhí)行路徑都對應(yīng)于輸入域的一類情況,是程序的一個子計算。如果程序的控制流有錯誤,那么對于某一特定的輸入,程序可能執(zhí)行的是一條錯誤路徑。計算型錯誤。屬于常見類型的錯誤,主要是由于賦值語句中的計算錯誤而導(dǎo)致程序輸出結(jié)果不正確。丟失路徑錯誤。由于程序中的某處少了一個判定謂詞而造成路徑丟失。107/1162.7其它白盒測試方法(1)域測試107/116域測試主要是針對域錯誤進(jìn)行的程序測試,是一種基于程序結(jié)構(gòu)的測試方法?!坝颉痹谶@里是指程序的輸入空間,域測試方法是基于對程序輸入空間的分析,以及在分析基礎(chǔ)上對輸入空間進(jìn)行分割劃分,然后選取相應(yīng)的測試點(diǎn)進(jìn)行測試。108/116域測試主要是針對域錯誤進(jìn)行的程序測試,是一種基于程序結(jié)構(gòu)的測域測試是一種模塊測試的有效方法,但是有兩個致命的弱點(diǎn):一是為了簡化分析的目的,域測試對被測程序提出了過多的限制,如要求被測程序不出現(xiàn)數(shù)組,分支謂詞是不含布爾運(yùn)算的簡單謂詞等;二是當(dāng)程序包含很多路徑時,所需的測試點(diǎn)非常多。另外,輸入域的分割和劃分還涉及多維空間的概念,不易被理解。這些都限制了域測試方法的實(shí)用性,不易被人們所接受。109/116域測試是一種模塊測試的有效方法,但是有兩個致命的弱點(diǎn):一是為(2)符號測試基本思想:允許測試用例的輸入數(shù)據(jù)是符號值,用以代替具體的數(shù)值數(shù)據(jù)。目的:解決測試點(diǎn)不易選取,所選測試點(diǎn)不能保證具有完全代表性的問題。特點(diǎn):符號值既可以是基本符號變量值,也可以是符號變量值的一個表達(dá)式。符號測試執(zhí)行的是代數(shù)運(yùn)算,而普通測試執(zhí)行的是算數(shù)運(yùn)算。符號測試可以看做是對普通測試的一個自然的擴(kuò)充。符號測試可以看做是程序測試和程序驗(yàn)證的一個折衷。110(2)符號測試110符號測試存在的問題:符號測試方法是否能夠得到廣泛應(yīng)用的關(guān)鍵在于能否開發(fā)出功能更為強(qiáng)大的程序編譯器和解釋器,使它們能夠處理符號運(yùn)算。目前,符號測試還存在著分支問題、二義性問題、大程序問題等待解決問題,使其實(shí)際應(yīng)用性受到了一定的限制。111/116符號測試存在的問題:符號測試方法是否能夠得到廣泛應(yīng)用的關(guān)鍵在(3)程序變異定義:程序變異是一種錯誤驅(qū)動測試,是針對某類特定程序錯誤進(jìn)行的測試。分類:程序變異又分為程序強(qiáng)變異和程序弱變異。程序強(qiáng)變異通過對程序進(jìn)行微小的改變而生成許多被測程序變異體,而程序弱變異并不實(shí)際產(chǎn)生程序變異體,而是分析源程序中易于出錯的環(huán)節(jié),找出有效的測試數(shù)據(jù)去執(zhí)行這些部分。112/116(3)程序變異112/116變異測試通過在程序中逐個引入符合語法的變化,把源程序變異為若干個變異程序,利用相應(yīng)的測試結(jié)果檢驗(yàn)測試用例集的錯誤檢測能力,預(yù)測源程序存在錯誤的可能性。程序變異的優(yōu)點(diǎn):針對性強(qiáng)、系統(tǒng)測試性強(qiáng)程序變異的缺點(diǎn):如果運(yùn)行所有變異因子會成倍提高測試成本113/116變異測試通過在程序中逐個引入符合語法的變化,把源程序變異為若2.8白盒測試應(yīng)用策略白盒測試方法綜合應(yīng)用策略(1)開始進(jìn)行白盒測試時,首先應(yīng)當(dāng)盡量使用測試工具進(jìn)行程序靜態(tài)結(jié)構(gòu)分析。(2)在測試中,建議采用先靜態(tài)后動態(tài)的組合方式。先進(jìn)行靜態(tài)結(jié)構(gòu)分析和代碼檢查,然后再進(jìn)行覆蓋測試。(3)利用靜態(tài)分析的結(jié)果作為依據(jù)和引導(dǎo),再使用代碼檢查和動態(tài)測試的方式對靜態(tài)測試分析結(jié)果進(jìn)行進(jìn)一步確認(rèn),使測試工作更為準(zhǔn)確和有效。114/1162.8白盒測試應(yīng)用策略白盒測試方法綜合應(yīng)用策略114/11(4)覆蓋率測試是白盒測試的重點(diǎn),是測試報告中可以作為量化指標(biāo)的依據(jù)。一般可以使用基本路徑測試法達(dá)到語句覆蓋的標(biāo)準(zhǔn),對于重點(diǎn)模塊應(yīng)當(dāng)使用多種覆蓋率標(biāo)準(zhǔn)衡量代碼的覆蓋率。(5)在不同的測試階段,白盒測試的應(yīng)用側(cè)重點(diǎn)也不同。單元測試以代碼檢查和邏輯覆蓋為主,集成測試需要增加靜態(tài)結(jié)構(gòu)分析等,而系統(tǒng)測試需要根據(jù)黑盒測試結(jié)果采取相應(yīng)的白盒測試。115/116(4)覆蓋率測試是白盒測試的重點(diǎn),是測試報告中可以作為量化指軟件測試技術(shù)

第2章白盒測試116/116軟件測試技術(shù)

第2章白盒測試1/116靜態(tài)白盒測試主要包括代碼檢查和靜態(tài)結(jié)構(gòu)分析兩種方法。動態(tài)白盒測試主要包括程序插樁、邏輯覆蓋測試、基本路徑測試、循環(huán)結(jié)構(gòu)測試等。動態(tài)白盒測試方法是白盒測試中發(fā)現(xiàn)軟件缺陷的主要手段。其中,邏輯覆蓋測試和基本路徑測試方法是實(shí)際工作中最常用到的兩種動態(tài)白盒測試技術(shù),2.1對于白盒測試的基本認(rèn)識117/116靜態(tài)白盒測試主要包括代碼檢查和靜態(tài)結(jié)構(gòu)分析兩種方法。2.1對白盒測試簡介白盒測試一般用來分析程序的內(nèi)部結(jié)構(gòu),因此有時也被稱為基于程序的測試。白盒測試的前提條件是已知程序的內(nèi)部工作過程,清楚其語句、變量狀態(tài)、邏輯結(jié)構(gòu)和執(zhí)行路徑等關(guān)鍵信息,因此也被稱為玻璃盒測試。白盒測試主要是根據(jù)程序內(nèi)部的邏輯結(jié)構(gòu)和相關(guān)信息,檢驗(yàn)程序中的各條通路是否都能夠按設(shè)計要求正確工作,從這一意義上來講,白盒測試又常被稱為結(jié)構(gòu)測試或邏輯驅(qū)動測試。白盒測試針對的是程序的內(nèi)部結(jié)構(gòu)和運(yùn)行過程。白盒測試重視測試覆蓋率的度量,被看做是“基于覆蓋的測試”,要求對被測程序的結(jié)構(gòu)能夠做到一定程度的覆蓋,通過不同類型的覆蓋準(zhǔn)則來判斷測試執(zhí)行的充分性。118/116白盒測試簡介白盒測試一般用來分析程序的內(nèi)部結(jié)構(gòu),因此有時也被白盒測試的基本原則保證程序模塊中的所有獨(dú)立路徑都至少被使用一次;保證程序中的所有邏輯值都能測試True和False兩種情況;在循環(huán)的邊界和運(yùn)行的界限內(nèi)執(zhí)行循環(huán)體;測試程序內(nèi)部數(shù)據(jù)結(jié)構(gòu)的有效性以及完成邊界數(shù)據(jù)取值情況下的測試。119/116白盒測試的基本原則保證程序模塊中的所有獨(dú)立路徑都至少被使用一窮舉路徑測試示例120/116窮舉路徑測試示例5/116白盒測試的缺點(diǎn)白盒測試方法試圖窮舉所有程序路徑進(jìn)行測試,這往往是不可能的。窮舉路徑測試查不出違反設(shè)計規(guī)范的錯誤,不能發(fā)現(xiàn)程序中已實(shí)現(xiàn)但不是用戶所需要的功能,不可能查出程序中因遺漏路徑而產(chǎn)生的錯誤,可能發(fā)現(xiàn)不了一些與數(shù)據(jù)相關(guān)的異常錯誤。盡管白盒測試方法深入程序內(nèi)部,針對程序細(xì)節(jié)的邏輯結(jié)構(gòu)進(jìn)行測試,對代碼的測試比較徹底,但仍然存在著一定的局限性。121/116白盒測試的缺點(diǎn)白盒測試方法試圖窮舉所有程序路徑進(jìn)行測試,這往2.2靜態(tài)測試根據(jù)測試時是否運(yùn)行源程序,白盒測試可以分為靜態(tài)測試和動態(tài)測試。靜態(tài)測試方法又主要分為代碼檢查和靜態(tài)結(jié)構(gòu)分析等。靜態(tài)測試就是不實(shí)際運(yùn)行被測試的軟件,而只是靜態(tài)地檢查程序代碼、界面或文檔中可能存在的錯誤的過程。122/1162.2靜態(tài)測試根據(jù)測試時是否運(yùn)行源程序,白盒測試可以分為靜2.2.1代碼檢查法代碼檢查法主要包括桌面檢查、走查和代碼審查。主要檢查代碼的規(guī)范性、可讀性、結(jié)構(gòu)的合理性、邏輯表達(dá)的正確性等內(nèi)容。代碼檢查比動態(tài)測試更為有效,能快速發(fā)現(xiàn)30%~70%的邏輯設(shè)計和編碼缺陷,應(yīng)當(dāng)在程序編譯和動態(tài)測試之前進(jìn)行。最不正式的最正式的臨時評審輪查

走查互為評審?fù)性u審

審查Randomreview,Pass-round,Walkthrough,Peerreview,Inspection123/1162.2.1代碼檢查法代碼檢查法主要包括桌面檢查、走查和代碼審表2-1桌面檢查、走查和代碼審查的對比項(xiàng)目桌面檢查走查代碼審查準(zhǔn)備程序的規(guī)格說明、編碼規(guī)范、錯誤列表、源代碼參加人員事先閱讀設(shè)計和源代碼,準(zhǔn)備代表性測試用例需求與設(shè)計文檔、源代碼、編碼規(guī)范、缺陷檢測表、會議計劃和流程形式無非正式會議正式會議參加人員程序編寫者本人開發(fā)組內(nèi)部人員開發(fā)、測試和相關(guān)人員主要技術(shù)方法無邏輯運(yùn)行測試用例缺陷檢測表124/116表2-1桌面檢查、走查和代碼審查的對比項(xiàng)目桌面檢查走查代表2-1桌面檢查、走查和代碼審查的對比(續(xù)表)項(xiàng)目桌面檢查走查代碼審查注意事項(xiàng)注釋與編碼規(guī)范限時、不當(dāng)場修改代碼限時、不當(dāng)場修改代碼生成文檔無靜態(tài)分析錯誤報告結(jié)果報告目標(biāo)無代碼標(biāo)準(zhǔn)規(guī)范、無邏輯錯誤代碼標(biāo)準(zhǔn)規(guī)范、無邏輯錯誤優(yōu)點(diǎn)省時便于項(xiàng)目組成員交流,共同理解軟件產(chǎn)品有計劃的對軟件產(chǎn)品進(jìn)行編碼質(zhì)量控制缺點(diǎn)不正式、依賴個人能力、效率低耗時耗時125/116表2-1桌面檢查、走查和代碼審查的對比(續(xù)表)項(xiàng)目桌面檢1)桌面檢查桌面檢查是最不正式,也是最省時的靜態(tài)測試技術(shù)。桌面檢查就是程序員對自己的代碼進(jìn)行一次自我檢查,對編碼成果進(jìn)行自我完善。由于桌面檢查沒有任何約束,依賴程序員個人的經(jīng)驗(yàn)和技術(shù)能力,因此對于大多數(shù)人而言,檢查效率很低。由編程者本人完成的桌面檢查明顯違背了軟件測試的獨(dú)立性原則。效果遠(yuǎn)遠(yuǎn)遜色于代碼走查和代碼審查。126/1161)桌面檢查桌面檢查是最不正式,也是最省時的靜態(tài)測試技術(shù)。1桌面檢查的主要內(nèi)容:變量和標(biāo)號的交叉引用表檢查。檢查變量的定義和使用以及轉(zhuǎn)向特定位置的標(biāo)號。子程序、宏、函數(shù)檢查。等價性檢查。檢查全部等價變量類型的一致性。常量檢查。設(shè)計標(biāo)準(zhǔn)檢查。檢查程序是否違反設(shè)計標(biāo)準(zhǔn)。風(fēng)格檢查。127/116桌面檢查的主要內(nèi)容:變量和標(biāo)號的交叉引用表檢查。檢查變量的定控制流檢查。選擇、激活路徑檢查。檢查每條控制流路徑是否都能被程序激活,達(dá)到語句覆蓋。規(guī)格符合性檢查。是否符合程序規(guī)格說明以及編碼規(guī)范。補(bǔ)充文檔檢查。128/116控制流檢查。13/1162)走查代碼走查的過程是非正式的,一般是在開發(fā)組內(nèi)部進(jìn)行,通過一個代碼走查小組,以會議的方式來檢查代碼。代碼走查有利于項(xiàng)目組人員共同理解項(xiàng)目所涉及的業(yè)務(wù)信息和具體代碼實(shí)現(xiàn)過程,交換代碼編寫思路,幫助開發(fā)人員找出程序錯誤和解決方法。129/1162)走查代碼走查的過程是非正式的,一般是在開發(fā)組內(nèi)部進(jìn)行,通代碼審查是一種正式的評審活動,通過正式會議的方式進(jìn)行,事先一般具有制定好的會議計劃和流程,會議中應(yīng)用預(yù)先定義好的標(biāo)準(zhǔn)和檢查技術(shù)檢查程序和文檔,發(fā)現(xiàn)軟件缺陷,會后形成正式的審查結(jié)果報告。3)代碼審查主持人作者記錄員列席人員內(nèi)審員技術(shù)專業(yè)人員用戶代表130/116代碼審查是一種正式的評審活動,通過正式會議的方式進(jìn)行,事先一代碼審查是一個軟件開發(fā)過程中必不可少的環(huán)節(jié)。谷歌前資深軟件開發(fā)工程師MarkChu-Carroll博士認(rèn)為,之所以讓Google的程序如此優(yōu)秀的一個重要原因看起來很簡單:代碼審查。在Google,沒有任何項(xiàng)目的程序源代碼可以在沒有經(jīng)過有效的代碼審查前就提交到代碼庫中。MarkChu-Carroll131/116代碼審查是一個軟件開發(fā)過程中必不可少的環(huán)節(jié)。谷歌前資深軟件開代碼審查的作用和注意事項(xiàng):因知道存在代碼審查,編碼者編寫代碼更為規(guī)范;代碼審查能傳播知識,使模塊編寫者之外的審查者也能熟悉程序的設(shè)計和架構(gòu);確保程序作者自己寫出的代碼是正確的;不應(yīng)過于匆忙的完成代碼審查;需要遵循嚴(yán)格的編碼規(guī)范。132/116代碼審查的作用和注意事項(xiàng):因知道存在代碼審查,編碼者編寫代碼2.2.2靜態(tài)結(jié)構(gòu)分析法靜態(tài)結(jié)構(gòu)分析法實(shí)際上是通過白盒測試工具輔助進(jìn)行程序檢查的一種方法。在靜態(tài)結(jié)構(gòu)分析中,測試人員通過測試工具分析程序的系統(tǒng)結(jié)構(gòu)、數(shù)據(jù)結(jié)構(gòu)、數(shù)據(jù)接口、控制邏輯等內(nèi)部結(jié)構(gòu),生成函數(shù)調(diào)用關(guān)系圖、程序控制流圖、內(nèi)部文件調(diào)用關(guān)系圖、子程序表、宏和函數(shù)參數(shù)表等各類圖表,可以清晰地呈現(xiàn)整個系統(tǒng)的組成結(jié)構(gòu),方便閱讀和理解。通過分析這些圖表,測試人員可以快速和有效地發(fā)現(xiàn)程序中潛在的錯誤。133/1162.2.2靜態(tài)結(jié)構(gòu)分析法靜態(tài)結(jié)構(gòu)分析法實(shí)際上是通過白盒測試表2-2靜態(tài)結(jié)構(gòu)分析圖表及其作用分類名稱內(nèi)容與作用圖函數(shù)調(diào)用關(guān)系圖列出所有函數(shù),用連線表示調(diào)用關(guān)系,展示系統(tǒng)的結(jié)構(gòu);發(fā)現(xiàn)系統(tǒng)是否存在結(jié)構(gòu)缺陷、區(qū)分函數(shù)的重要程度、確定測試覆蓋級別;檢查函數(shù)的調(diào)用關(guān)系是否正確;是否存在遞歸調(diào)用;函數(shù)的調(diào)用層次是否過深;檢查是否存在孤立而未被調(diào)用的函數(shù);確定函數(shù)調(diào)用頻度,重點(diǎn)檢查被頻繁調(diào)用的函數(shù)。模塊控制流圖由結(jié)點(diǎn)和邊組成,每個結(jié)點(diǎn)代表一條或多條語句,邊表示控制流;能夠直觀地反映一個模塊的內(nèi)部邏輯結(jié)構(gòu)。134表2-2靜態(tài)結(jié)構(gòu)分析圖表及其作用分類名稱內(nèi)容與作用圖函數(shù)調(diào)表2-2靜態(tài)結(jié)構(gòu)分析圖表及其作用(續(xù)表)

分類名稱內(nèi)容與作用表標(biāo)號交叉引用表列出所有模塊中用到的標(biāo)號;標(biāo)號的屬性,包括已說明、未說明、已使用、未使用;模塊以外的全局標(biāo)號、計算標(biāo)號。變量交叉引用表展示所有變量的定義和引用情況;變量的屬性,包括是否已說明、是否已使用、類型、是否屬于公共變量、全局變量等。子程序(宏、函數(shù))引用表列出所有子程序、宏和函數(shù)的屬性,包括類型、是否已定義、是否已引用、引用次數(shù)、輸入輸出參數(shù)的數(shù)量、順序和類型。等價表

列出在等價語句或等值語句中出現(xiàn)的全局變量和標(biāo)號。常數(shù)表

列出所有數(shù)字和字符常數(shù)。135/116表2-2靜態(tài)結(jié)構(gòu)分析圖表及其作用(續(xù)表)分名稱內(nèi)容與借助圖表,可以完成如下靜態(tài)錯誤分析:數(shù)據(jù)類型和單位分析。引用分析。找出變量引用錯誤,例如:變量賦值以前被引用或賦值后未被引用。表達(dá)式分析。發(fā)現(xiàn)表達(dá)式中不正確地使用括號、數(shù)據(jù)下標(biāo)越界等錯誤。接口分析。檢查模塊之間接口的一致性和模塊與外部數(shù)據(jù)庫之間接口的一致性。136借助圖表,可以完成如下靜態(tài)錯誤分析:數(shù)據(jù)類型和單位分析。212.3程序插樁定義:是在保證被測程序原有邏輯完整性的基礎(chǔ)上在程序中插入一些語句,這些語句被稱為“探針”、“探測器”或“探測點(diǎn)”,其本質(zhì)就是進(jìn)行信息采集的代碼段。測試人員常常借助程序插樁的方法來收集程序動態(tài)運(yùn)行行為,一些與運(yùn)行環(huán)境相關(guān)的程序行為只能通過程序插樁的方法來收集,靜態(tài)程序分析無法完成這樣的工作。通過程序插樁技術(shù),能夠獲取各種程序信息,是對程序進(jìn)行白盒測試的一種有效手段。1372.3程序插樁定義:是在保證被測程序原有邏輯完整性的基礎(chǔ)上圖2-3計算最大公約數(shù)函數(shù)的程序插樁過程138圖2-3計算最大公約數(shù)函數(shù)的程序插樁過程23圖2-3是一個計算兩個整數(shù)的最大公約數(shù)函數(shù)的程序插樁示例,左邊是函數(shù)源程序,右邊是程序的流程圖。虛線框代表在源程序中插入的一些探針語句,用于記錄語句執(zhí)行的次數(shù),是一些計數(shù)器,可以用數(shù)組的方式實(shí)現(xiàn)。C(1)用于記錄函數(shù)被調(diào)用的次數(shù),C(2)用于記錄循環(huán)執(zhí)行的次數(shù),C(3)是函數(shù)出口計數(shù)器,C(4)~C(5)是主要程序分支上的計數(shù)器。139圖2-3是一個計算兩個整數(shù)的最大公約數(shù)函數(shù)的程序插樁示例,左插樁注意事項(xiàng):(1)需要探測哪些信息:這需要根據(jù)具體的測試目標(biāo)來決定。(2)在什么位置設(shè)置探測點(diǎn)程序的第一個可執(zhí)行語句之前,用于判斷該程序是否被執(zhí)行。有標(biāo)號的可執(zhí)行語句之前。for、while、dountil等循環(huán)語句處。if、then、else等條件分支語句處。輸入語句之后,用于檢驗(yàn)輸入數(shù)據(jù)的正確性。輸出語句之前,用于檢驗(yàn)將要輸出的數(shù)據(jù)是否正確。140/116插樁注意事項(xiàng):(1)需要探測哪些信息:這需要根據(jù)具體的測試目函數(shù)、過程等程序調(diào)用語句之后,用于判斷調(diào)用結(jié)果是否正確。Return語句之前,判斷程序是否正常返回。如果探針設(shè)置在return語句之后,那么它將無法被執(zhí)行。(3)需要設(shè)置多少個探測點(diǎn)一般情況下,在沒有分支的程序段中只需要在首尾各設(shè)置一個探測點(diǎn),用于確定程序執(zhí)行時該段程序是否被覆蓋。如果程序中有各種分支控制結(jié)構(gòu),如各種循環(huán)和條件判斷分支結(jié)構(gòu),那么為了插入最少的探測點(diǎn),需要針對程序的控制結(jié)構(gòu)進(jìn)行具體的分析。141/116函數(shù)、過程等程序調(diào)用語句之后,用于判斷調(diào)用結(jié)果是否正確。26(4)如何在程序的特定位置插入用于判斷變量特性的語句程序插樁并不是一個獨(dú)立的白盒測試方法,一般要和諸如覆蓋測試等方法

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論