版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
軟件質(zhì)量保證與測(cè)試4.1白盒測(cè)試概述第4章白盒測(cè)試SoftwareQualityAssuranceandTesting白盒測(cè)試白盒測(cè)試是一種軟件測(cè)試方法,測(cè)試對(duì)象基本上是源程序,它要求已知程序內(nèi)部的邏輯結(jié)構(gòu)、工作過(guò)程,檢查驗(yàn)證每種內(nèi)部操作是否符合設(shè)計(jì)規(guī)格,所有內(nèi)部成分是否符合標(biāo)準(zhǔn)和要求。白盒測(cè)試被測(cè)試的軟件內(nèi)部是可視的,測(cè)試人員需要清楚盒子內(nèi)部的結(jié)構(gòu)以及程序流程是如何執(zhí)行的。白盒測(cè)試軟件的白盒測(cè)試是對(duì)軟件及其執(zhí)行過(guò)程做細(xì)致的檢查,對(duì)軟件的執(zhí)行過(guò)程進(jìn)行覆蓋測(cè)試,檢查程序中的每條通路是否符合預(yù)定要求,能正確工作,并可通過(guò)在程序不同位置設(shè)立檢查點(diǎn),來(lái)檢查程序的狀態(tài),以確定實(shí)際運(yùn)行狀態(tài)與預(yù)期狀態(tài)是否一致。#include<stdio.h>max(floatx,floaty){floatz;z=x>y?x:y;return(z);}main(){floata,b;intc,d;scanf("%f,%f",&a,&b);c=max(a,b);printf("Maxis%d\n",c);}課堂提問(wèn)
你能想到應(yīng)該對(duì)程序進(jìn)行哪些類(lèi)型的檢查和測(cè)試?白盒測(cè)試白盒測(cè)試既有靜態(tài)測(cè)試也有動(dòng)態(tài)測(cè)試。靜態(tài)白盒測(cè)試是指在不執(zhí)行軟件的情況下,對(duì)軟件進(jìn)行檢查和分析,從而發(fā)現(xiàn)問(wèn)題,找出缺陷的過(guò)程。代碼檢查、靜態(tài)結(jié)構(gòu)分析、靜態(tài)質(zhì)量度量這些都是靜態(tài)白盒測(cè)試方法。通過(guò)靜態(tài)白盒測(cè)試,要盡可能檢查發(fā)現(xiàn)代碼中的邏輯錯(cuò)誤,讓代碼達(dá)到邏輯正確性、高效性、清晰性、規(guī)范性、一致性等要求。
白盒測(cè)試
動(dòng)態(tài)白盒測(cè)試是指先針對(duì)程序的內(nèi)部邏輯結(jié)構(gòu)設(shè)計(jì)測(cè)試用例。然后運(yùn)行程序,輸入測(cè)試用例,檢驗(yàn)程序執(zhí)行過(guò)程及最終結(jié)果是否符合預(yù)期要求,并查找問(wèn)題和缺陷的過(guò)程。邏輯覆蓋、基本路徑覆蓋、符號(hào)測(cè)試和程序變異這些是動(dòng)態(tài)白盒測(cè)試方法。白盒測(cè)試靜態(tài)方法動(dòng)態(tài)方法白盒測(cè)試動(dòng)態(tài)白盒測(cè)試的基本原則如下:1.保證一個(gè)模塊中的所有獨(dú)立路徑至少被測(cè)試一次。2.對(duì)所有邏輯值均需測(cè)試true和false。3.在上下邊界及可操作范圍內(nèi)運(yùn)行所有循環(huán)。4.檢查內(nèi)部數(shù)據(jù)結(jié)構(gòu)以確保其有效性??刂屏鲌D
控制流圖(Controlflowgraph,簡(jiǎn)稱(chēng)CFG)也叫控制流程圖,它用圖的方式來(lái)描述程序的控制流程,是對(duì)一個(gè)過(guò)程或程序的抽象表達(dá)??刂屏鲌D
控制流圖是一種有向圖,可以形式化為:G=(N,E,N_entry,N_exit)N是節(jié)點(diǎn)集,程序中的每個(gè)語(yǔ)句都對(duì)應(yīng)圖中的一個(gè)節(jié)點(diǎn),有時(shí)一組順序執(zhí)行、不存在分支的語(yǔ)句也可以合并為用一個(gè)節(jié)點(diǎn)表示。邊集E={<n1,n2>|n1,n2∈N,且n1執(zhí)行后,可能立即執(zhí)行n2}。N_entry和N_exit分別為程序的入口和出口節(jié)點(diǎn),且G只具有唯一的入口結(jié)點(diǎn)N_entry和唯一的出口結(jié)點(diǎn)N_exit。G中的每個(gè)結(jié)點(diǎn)至多只能有兩個(gè)直接后繼。對(duì)于有兩個(gè)直接后繼的結(jié)點(diǎn)v,其出邊分別具有屬性“T”或“F”,并且在G中的任意結(jié)點(diǎn)n,均存在一條從N_entry經(jīng)n到達(dá)N_exit的路徑??刂屏鲌D在控制流圖中,用節(jié)點(diǎn)來(lái)代表操作、條件判斷及匯合點(diǎn),用弧或者叫控制流線來(lái)表示執(zhí)行的先后順序關(guān)系。圓圈稱(chēng)為控制流圖的一個(gè)節(jié)點(diǎn),它表示一個(gè)或多個(gè)無(wú)分支的語(yǔ)句;有向箭頭稱(chēng)為弧或者叫控制流線,表示執(zhí)行的先后順序關(guān)系。控制流圖控制流圖課堂提問(wèn)
如何畫(huà)控制流圖?可以根據(jù)程序來(lái)得出其控制流圖,也可以由程序流程圖來(lái)轉(zhuǎn)換得到控制流圖。BE需要注意的是:
1、在將程序流程圖簡(jiǎn)化成控制流圖時(shí),在選擇或多分支結(jié)構(gòu)中,分支的匯聚處應(yīng)有一個(gè)匯聚結(jié)點(diǎn)。控制流圖
2、如果一個(gè)判斷中的條件表達(dá)式是由一個(gè)或多個(gè)邏輯運(yùn)算符(OR,AND,NAND,NOR)連接的復(fù)合條件表達(dá)式,則需要改為一系列只有一個(gè)條件、嵌套的判斷結(jié)構(gòu)??刂屏鲌D控制流圖把多條件判斷分解為多個(gè)單條件判斷課堂提問(wèn)我們來(lái)思考一個(gè)問(wèn)題,應(yīng)當(dāng)如何度量一個(gè)程序的復(fù)雜度?
是否程序的大小就能準(zhǔn)確反映程序的復(fù)雜程度呢?一個(gè)1000行的程序就一定比一個(gè)100行的程序復(fù)雜嗎?答案是否定的。這就好比100道100以?xún)?nèi)加減法題并不比做一道二元積分題復(fù)雜是一樣的道理。例如,一個(gè)由1000行順序執(zhí)行的賦值語(yǔ)句、輸出語(yǔ)句組成的程序,并不比一個(gè)100行的排序算法程序復(fù)雜。程序的復(fù)雜度
簡(jiǎn)單的用程序的大小來(lái)度量程序的復(fù)雜度是片面和不準(zhǔn)確的,而環(huán)路復(fù)雜度是程序復(fù)雜度度量的方法之一。程序中的控制路徑越復(fù)雜,環(huán)路越多,則環(huán)路復(fù)雜度越高,環(huán)路復(fù)雜度用來(lái)定量度量程序的邏輯復(fù)雜度。根據(jù)程序的控制流圖,可以計(jì)算程序的環(huán)路復(fù)雜度。程序的復(fù)雜度
在畫(huà)出控制流圖的基礎(chǔ)上,程序環(huán)路復(fù)雜度的計(jì)算方法如下:①將環(huán)路復(fù)雜度定義為控制流圖中的區(qū)域數(shù)。②設(shè)E為控制流圖的邊數(shù),N為圖的結(jié)點(diǎn)數(shù),則定義環(huán)路的復(fù)雜性為V(G)=E?N+2。③若設(shè)P為控制流圖中的判定結(jié)點(diǎn)數(shù),則有V(G)=P+1。對(duì)于同一個(gè)控制流圖,三種計(jì)算方法算出的結(jié)果是一樣的。程序的環(huán)路復(fù)雜度程序的環(huán)路復(fù)雜度程序的環(huán)路復(fù)雜度
①圖中的區(qū)域數(shù)為4,故環(huán)路復(fù)雜度V(G)=4。②邊數(shù)E=11,節(jié)點(diǎn)數(shù)N=9,環(huán)路復(fù)雜度V(G)=E?N+2=4。③圖中的判定結(jié)點(diǎn)數(shù)P=3,則有V(G)=3+1=4。三種計(jì)算方法算出的結(jié)果相等,右圖的環(huán)路復(fù)雜度為4。課堂練習(xí)
請(qǐng)對(duì)程序模塊Function1畫(huà)出控制流圖,并計(jì)算出環(huán)路復(fù)雜度。課堂練習(xí) publicintF1(intnum,intcycle,booleanflag) { intret=0; while(cycle>0) { if(flag==true) { ret=num-10; break; } else{if(num%2==0) {ret=ret*10; } else {ret=ret+1; }} cycle--; } returnret; }課堂練習(xí)V(G)=4(圖中有4個(gè)區(qū)域)V(G)=E?N+2V(G)=P+1本節(jié)內(nèi)容就講到這里,謝謝,再見(jiàn)!軟件質(zhì)量保證與測(cè)試4.2靜態(tài)白盒測(cè)試第4章白盒測(cè)試SoftwareQualityAssuranceandTesting靜態(tài)測(cè)試編譯器程序語(yǔ)法錯(cuò)誤一些非語(yǔ)法錯(cuò)誤靜態(tài)測(cè)試程序靜態(tài)測(cè)試通過(guò)分析或檢查源程序的結(jié)構(gòu)、過(guò)程、接口等來(lái)檢查程序的正確性,找出不妥和可疑之處,例如不匹配的參數(shù)、不適當(dāng)?shù)难h(huán)嵌套和分支嵌套、不允許的遞歸、未使用過(guò)的變量、空指針的引用和可疑的計(jì)算等。靜態(tài)測(cè)試結(jié)果可用于進(jìn)一步的查錯(cuò),并為測(cè)試用例選取提供指導(dǎo)。最常見(jiàn)的靜態(tài)測(cè)試包括代碼檢查、靜態(tài)結(jié)構(gòu)分析、靜態(tài)質(zhì)量度量等。靜態(tài)測(cè)試代碼檢查法主要是通過(guò)桌面檢查,代碼審查和走查方式,對(duì)以下內(nèi)容進(jìn)行檢查:1.檢查代碼和設(shè)計(jì)的一致性;2.代碼的可讀性以及對(duì)軟件設(shè)計(jì)標(biāo)準(zhǔn)的遵循情況;3.代碼邏輯表達(dá)的正確性;4.代碼結(jié)構(gòu)的合理性;5.程序中不安全、不明確和模糊的部分;6.編程風(fēng)格方面的問(wèn)題等。靜態(tài)測(cè)試常見(jiàn)的代碼檢查項(xiàng)目代碼檢查項(xiàng)目檢查結(jié)果所有設(shè)計(jì)要求是否都實(shí)現(xiàn)?
代碼編制是否遵照編碼規(guī)范?
所有的代碼是否風(fēng)格保持一致?
所有的注釋是清楚和正確?
所有代碼異常處理是否都有注釋?zhuān)?/p>
每一功能目的是否都有注釋?zhuān)?/p>
是否按注釋類(lèi)型格式編寫(xiě)注釋?zhuān)?/p>
代碼注釋量是否達(dá)到了規(guī)定值?
所有變量的命名是否依照規(guī)則?
循環(huán)嵌套是否優(yōu)化到最少?
......代碼檢查一旦發(fā)現(xiàn)錯(cuò)誤,通常能在代碼中對(duì)其進(jìn)行精確定位,這與動(dòng)態(tài)測(cè)試只能發(fā)現(xiàn)錯(cuò)誤的外部征兆不同,因而可以降低修正錯(cuò)誤的成本。另外,在代碼檢查過(guò)程中,有時(shí)可以發(fā)現(xiàn)成批的錯(cuò)誤,典型的如分散在多處的同一類(lèi)錯(cuò)誤,而動(dòng)態(tài)測(cè)試通常只能一個(gè)一個(gè)的測(cè)試和報(bào)錯(cuò)。代碼檢查代碼檢查桌面檢查可以說(shuō)是最早的一種代碼檢查方法,一般是程序員對(duì)自己的代碼進(jìn)行一次自我檢查,閱讀程序,對(duì)源程序代碼進(jìn)行分析,對(duì)照錯(cuò)誤列表檢查程序,對(duì)程序推演測(cè)試數(shù)據(jù),檢驗(yàn)程序中是否有錯(cuò)誤等??傮w而言,桌面檢查的效率是相當(dāng)?shù)偷模?、桌面檢查隨意性較大,除非有嚴(yán)格的管理和技術(shù)規(guī)范來(lái)約束,否則檢查哪些內(nèi)容,如何檢查,檢查到哪種程度,基本上取決于程序員個(gè)人。2、自己一般不太容易發(fā)現(xiàn)自己程序中的問(wèn)題。桌面檢查在實(shí)踐中,可以采用交叉桌面檢查的方法,兩個(gè)程序員可以相互交換各自的程序來(lái)做檢查,而不是自己檢查自己的程序。但是即使這樣,其效果仍然遜色于代碼審查和走查。因?yàn)榇a檢查和代碼走查以小組的形式進(jìn)行,小組成員之間存在著互相監(jiān)督和促進(jìn)的效應(yīng)。桌面檢查代碼審查是由若干程序員和測(cè)試員組成一個(gè)審查小組,通過(guò)閱讀、討論、評(píng)價(jià)和審議,對(duì)程序進(jìn)行靜態(tài)分析的過(guò)程。代碼審查分兩步。第一步,小組負(fù)責(zé)人提前把設(shè)計(jì)規(guī)格說(shuō)明書(shū)、控制流程圖、程序文本及有關(guān)要求、規(guī)范等分發(fā)給小組成員,作為審查的依據(jù)。小組成員在充分閱讀這些材料后,進(jìn)入審查的第二步,召開(kāi)程序?qū)彶闀?huì)。通過(guò)會(huì)議和集體討論、評(píng)價(jià)和審議,以集體的智慧和不同的角度,找出程序中的問(wèn)題,提出修改意見(jiàn)和建議。
代碼審查代碼審查是軟件開(kāi)發(fā)中常用的手段,和其它測(cè)試手段相比,它更容易發(fā)現(xiàn)和架構(gòu)以及時(shí)序相關(guān)等較難發(fā)現(xiàn)的問(wèn)題,還可以幫助團(tuán)隊(duì)成員提高編程技能,統(tǒng)一編程風(fēng)格等。代碼審查有相關(guān)輔助的輔助工具可以選擇使用。代碼審查走查是讓人充當(dāng)計(jì)算機(jī),把數(shù)據(jù)代入程序,模擬代碼的執(zhí)行,看程序能不能正常執(zhí)行下去,執(zhí)行過(guò)程和狀態(tài)是否正確,并能最終得出符合預(yù)期的結(jié)果。代碼走查與代碼審查有類(lèi)似的地方,都是以小組為單位進(jìn)行,但代碼走查重在模擬程序的執(zhí)行,它需要推演每個(gè)測(cè)試用例的執(zhí)行過(guò)程和結(jié)果,把測(cè)試數(shù)據(jù)沿程序的運(yùn)行邏輯走一遍,過(guò)程和中間狀態(tài)記錄在紙張或白板上以供監(jiān)視檢查。代碼走查與代碼審查基本相同,代碼走查過(guò)程也分為兩步。第一步把材料先發(fā)給走查小組每個(gè)成員,讓他們認(rèn)真研究程序,然后組織代碼走查會(huì)議。但開(kāi)會(huì)的過(guò)程與代碼審查不同,不是簡(jiǎn)單地讀程序和對(duì)照錯(cuò)誤檢查表進(jìn)行檢查,而是讓與會(huì)者“充當(dāng)計(jì)算機(jī)”,由測(cè)試人員為被測(cè)程序準(zhǔn)備一批有代表性的測(cè)試用例,提交給走查小組,走查小組開(kāi)會(huì),一起把測(cè)試用例代入程序,模擬代碼的執(zhí)行,分析檢查程序的執(zhí)行過(guò)程和結(jié)果。代碼走查靜態(tài)結(jié)構(gòu)分析一個(gè)軟件通常由多個(gè)部分組成,總是存在著一定的組織結(jié)構(gòu)。
程序源代碼
分析、生成
靜態(tài)結(jié)構(gòu)分析,可以清晰地呈現(xiàn)整個(gè)軟件的組成結(jié)構(gòu),使程序便于被宏觀把握和微觀分析。靜態(tài)結(jié)構(gòu)分析
發(fā)現(xiàn)程序當(dāng)中的問(wèn)題或者不合理的地方,然后通過(guò)進(jìn)一步檢查,就可以確認(rèn)軟件中是不是存在問(wèn)題、缺陷或錯(cuò)誤。靜態(tài)結(jié)構(gòu)分析靜態(tài)結(jié)構(gòu)分析法通常采用以下一些方法:1.通過(guò)生成各種圖表,來(lái)幫助對(duì)源程序的靜態(tài)分析,常用的各種引用表主要有:標(biāo)號(hào)交叉引用表變量交叉引用表子程序(宏、函數(shù))引用表等價(jià)表常數(shù)表靜態(tài)結(jié)構(gòu)分析2.通過(guò)分析各種關(guān)系圖、控制流圖來(lái)檢查程序是否有問(wèn)題。主要有:函數(shù)調(diào)用關(guān)系圖:列出所有函數(shù),用連線表示調(diào)用關(guān)系,通過(guò)應(yīng)用程序各函數(shù)之間的調(diào)用關(guān)系展示了系統(tǒng)的結(jié)構(gòu)。模塊控制流圖:由許多結(jié)點(diǎn)和連接結(jié)點(diǎn)的邊組成的圖形,其中每個(gè)結(jié)點(diǎn)代表一條或多條語(yǔ)句,邊表示控制流向,可以直觀地反映出一個(gè)函數(shù)的內(nèi)部結(jié)構(gòu)。靜態(tài)結(jié)構(gòu)分析3.其它常見(jiàn)錯(cuò)誤分析:分析程序中是否有某類(lèi)問(wèn)題、錯(cuò)誤或“危險(xiǎn)”結(jié)構(gòu)。如:類(lèi)型和單位分析引用分析表達(dá)式分析接口分析程序流程分析
一個(gè)程序要能夠正常執(zhí)行,不留下問(wèn)題隱患,在流程上會(huì)有一些基本要求??梢苑謩e從控制流和數(shù)據(jù)流的角度來(lái)對(duì)程序做流程上的分析??刂屏鞣治鰪目刂屏鞯慕嵌葋?lái)說(shuō),程序不應(yīng)存在以下問(wèn)題:1.轉(zhuǎn)向并不存在的標(biāo)號(hào),調(diào)用并不存在的函數(shù)、方法等如果這樣的話,程序執(zhí)行就會(huì)意外中止。2.有沒(méi)有用的語(yǔ)句標(biāo)號(hào)沒(méi)有用的語(yǔ)句標(biāo)號(hào)類(lèi)似于有定義而未使用的變量,沒(méi)有任何作用,卻需要對(duì)其進(jìn)行管理并占用資源。3.有從程序入口無(wú)法到達(dá)的語(yǔ)句從程序入口無(wú)法到達(dá)的語(yǔ)句,就意味著這些語(yǔ)句根本就不會(huì)被執(zhí)行到,相應(yīng)的功能也無(wú)法被調(diào)用。4.不能到達(dá)停機(jī)語(yǔ)句的語(yǔ)句不能到達(dá)停機(jī)語(yǔ)句的語(yǔ)句如死循環(huán)。數(shù)據(jù)流分析
早期的數(shù)據(jù)流分析主要集中于變量定義/引用錯(cuò)誤或異常,包括如下三方面:1.變量被定義,但是從來(lái)沒(méi)有使用(引用)2.所使用的變量沒(méi)有被定義3.變量在使用之前被定義多次這些問(wèn)題光靠簡(jiǎn)單的語(yǔ)法分析器或者是語(yǔ)義分析器是無(wú)法檢測(cè)出來(lái)的。而軟件測(cè)試工具檢測(cè)到上述問(wèn)題后,就可以給出一些警告信息,如“所定義的變量未被使用”等。數(shù)據(jù)流分析
變量被語(yǔ)句定義是指:某一語(yǔ)句執(zhí)行時(shí)能改變變量V的值,則稱(chēng)V是被該語(yǔ)句定義的。變量被語(yǔ)句引用是指:某一語(yǔ)句的執(zhí)行應(yīng)用了內(nèi)存變量V的值,則稱(chēng)變量被語(yǔ)句引用。語(yǔ)句:X:=Y+Z定義了變量X,引用了Y,Z語(yǔ)句:ifY>Zthen…引用了變量Y和Z語(yǔ)句:READX引用了變量XWRITEX定義了變量X數(shù)據(jù)流分析示例數(shù)據(jù)流分析
上頁(yè)左圖為一個(gè)程序的控制流圖,右表為控制流圖各節(jié)點(diǎn)的數(shù)據(jù)操作,分為變量定義和變量引用。通過(guò)數(shù)據(jù)流分析,我們可以發(fā)現(xiàn)一下一些錯(cuò)誤或者異常:2號(hào)節(jié)點(diǎn)引用了變量W,但在此之前W沒(méi)有定義。5號(hào)、6號(hào)節(jié)點(diǎn)引用了變量V,但第一次循環(huán)執(zhí)行到5號(hào)、6號(hào)節(jié)點(diǎn)時(shí),變量V尚未定義8號(hào)節(jié)點(diǎn)定義了變量W,但之后程序沒(méi)有引用變量W。6號(hào)節(jié)點(diǎn)、9號(hào)節(jié)點(diǎn)都定義了變量Z,但兩次定義之間并沒(méi)有引用變量Z。數(shù)據(jù)流分析
一般來(lái)說(shuō),情況1和2屬于錯(cuò)誤,引用未經(jīng)定義的變量可能會(huì)讓程序執(zhí)行出錯(cuò);情況3是一種疏漏,定義了變量但并沒(méi)有引用,那么這種定義操作就沒(méi)有實(shí)際意義;情況4是一種異常,這種異常有時(shí)可能是由于程序員疏漏所致,需要予以修正,但有時(shí)也可能是程序?qū)嶋H的需要。分析工具對(duì)程序的控制流分析和數(shù)據(jù)流分析,除了有的編譯器就帶有相關(guān)分析功能之外,很多都可以采用輔助工具來(lái)完成。本節(jié)內(nèi)容就講到這里,謝謝,再見(jiàn)!軟件質(zhì)量保證與測(cè)試4.3_1邏輯覆蓋第4章白盒測(cè)試SoftwareQualityAssuranceandTesting邏輯覆蓋
邏輯覆蓋是白盒測(cè)試中主要的動(dòng)態(tài)測(cè)試方法之一,是以程序內(nèi)部的邏輯結(jié)構(gòu)為基礎(chǔ)的測(cè)試技術(shù),是通過(guò)對(duì)程序邏輯結(jié)構(gòu)的遍歷來(lái)實(shí)現(xiàn)對(duì)程序的測(cè)試覆蓋,所謂覆蓋就是作為測(cè)試標(biāo)準(zhǔn)的邏輯單元、邏輯分支、邏輯取值都被執(zhí)行到。這一方法要求測(cè)試人員對(duì)程序的邏輯結(jié)構(gòu)有清楚的了解。邏輯覆蓋的標(biāo)準(zhǔn)有:語(yǔ)句覆蓋、判定覆蓋、條件覆蓋、判定/條件覆蓋、條件組合覆蓋等。邏輯覆蓋
設(shè)有如下一段程序P1:If(x>0ORy>0)thena=10If(x<10ANDy<10)thenb=0其中變量a,b的初始值在其他地方已經(jīng)定義了,都為-1。程序段對(duì)應(yīng)的流程圖如圖所示。邏輯覆蓋
下面我們來(lái)看一下應(yīng)如何來(lái)分別實(shí)現(xiàn)語(yǔ)句覆蓋、判定覆蓋、條件覆蓋、判定/條件覆蓋和條件組合覆蓋。語(yǔ)句覆蓋:語(yǔ)句覆蓋要求設(shè)計(jì)若干個(gè)測(cè)試用例,使得程序中的每個(gè)語(yǔ)句至少都能被執(zhí)行一次。語(yǔ)句覆蓋
對(duì)照流程圖,我們來(lái)看一下,按照這一標(biāo)準(zhǔn),程序需要執(zhí)行通過(guò)的位置有①③④⑥,而②⑤位置,由于沒(méi)有語(yǔ)句,所以不需要覆蓋。
首先我們可能想到的是,可以設(shè)計(jì)兩個(gè)測(cè)試用例,分別覆蓋第一個(gè)IF結(jié)構(gòu)有執(zhí)行語(yǔ)句的分支③,和第二個(gè)IF結(jié)構(gòu)有執(zhí)行語(yǔ)句的分支④,如:case1:x=1,y=1,覆蓋③;case2:x=-1,y=-1,覆蓋④。這樣即可達(dá)到語(yǔ)句覆蓋要求。語(yǔ)句覆蓋
但從節(jié)約測(cè)試成本的角度出發(fā),我們可以?xún)?yōu)化一下測(cè)試用例設(shè)計(jì),實(shí)際上只需要一個(gè)測(cè)試用例,如:case3:x=8,y=8。即可同時(shí)覆蓋①③④⑥,執(zhí)行通過(guò)路徑如圖所示。語(yǔ)句覆蓋
語(yǔ)句覆蓋測(cè)試執(zhí)行了程序中的每一個(gè)語(yǔ)句,似乎能夠比較全面的對(duì)程序進(jìn)行檢驗(yàn),但實(shí)際上,它并不是一個(gè)測(cè)試很充分的覆蓋標(biāo)準(zhǔn),從圖中可以看出,兩個(gè)判斷語(yǔ)句的都只執(zhí)行了一個(gè)分支,而另外一個(gè)分支根本就沒(méi)有被執(zhí)行到。語(yǔ)句覆蓋
假設(shè)這一程序段中,兩個(gè)判斷語(yǔ)句的邏輯運(yùn)算符號(hào)由于疏忽寫(xiě)錯(cuò)了,第一個(gè)判斷語(yǔ)句中的“or”錯(cuò)寫(xiě)成了“and”,第二個(gè)判斷語(yǔ)句中的“and”錯(cuò)寫(xiě)成了“or”,我們用測(cè)試用例case3來(lái)進(jìn)行測(cè)試,則執(zhí)行的路徑仍然是①③④⑥,測(cè)試結(jié)果也依然正確,測(cè)試沒(méi)有能夠發(fā)現(xiàn)程序中的錯(cuò)誤。語(yǔ)句覆蓋ANDOR語(yǔ)句覆蓋,說(shuō)起來(lái)是每一個(gè)語(yǔ)句都執(zhí)行過(guò)了,似乎十分可靠,但實(shí)際上語(yǔ)句覆蓋是一種比較弱的覆蓋準(zhǔn)則。語(yǔ)句覆蓋判定覆蓋
比語(yǔ)句覆蓋稍強(qiáng)的覆蓋標(biāo)準(zhǔn)是判定覆蓋。判定覆蓋是指,設(shè)計(jì)若干測(cè)試用例,運(yùn)行被測(cè)程序,使得程序中每個(gè)判斷的真值結(jié)果和假值結(jié)果都至少出現(xiàn)一次。判定覆蓋又稱(chēng)為分支覆蓋,因?yàn)榕袛嘟Y(jié)果取真值就會(huì)執(zhí)行取真分支,判斷結(jié)果取假值就會(huì)執(zhí)行取假分支,每個(gè)判斷的真值結(jié)果和假值結(jié)果都至少出現(xiàn)一次,也就相當(dāng)于每個(gè)判斷的取真分支和取假分支至少都經(jīng)歷一次。
仍以前面的程序段P1為例,對(duì)照流程圖,按照判定覆蓋標(biāo)準(zhǔn),程序需要執(zhí)行通過(guò)的位置有①②③④⑤⑥。判定覆蓋程序段P1中存在IF語(yǔ)句,由于每個(gè)判斷有真假兩種判斷結(jié)果,所以至少需要兩個(gè)測(cè)試用例。P1中的兩個(gè)IF語(yǔ)句是串聯(lián)的,不是嵌套,所以如果設(shè)計(jì)合理的話兩個(gè)測(cè)試用例也確實(shí)夠了,如:
case4:x=20,y=20,覆蓋①③⑤⑥;
case5:x=-2,y=-2,覆蓋①②④⑥。這樣即可達(dá)到判定覆蓋要求,具體覆蓋情況如表所示。判定覆蓋測(cè)試用例編號(hào)xy第1個(gè)判定表達(dá)式x>0ORy>0第2個(gè)判定表達(dá)式x<10ANDy<10case42020YNcase5-2-2NY判定覆蓋判定覆蓋情況如表所示。
如果測(cè)試達(dá)到判定覆蓋,則顯然程序流程的所有分支都是會(huì)被測(cè)試到的,各個(gè)分支上的所有語(yǔ)句都會(huì)被測(cè)試到,所以只要滿足判定覆蓋,就必定會(huì)滿足語(yǔ)句覆蓋,這一點(diǎn)從圖中可以直觀的看出來(lái)。
判定覆蓋
在判定覆蓋中,如果一個(gè)判定表達(dá)式中有多個(gè)條件,由于我們只關(guān)注這個(gè)判斷表達(dá)式的最終結(jié)果,而不是每一個(gè)條件的判定結(jié)果,所以有的條件可能只取過(guò)真值或者假值,而另外一種取值根本就沒(méi)有出現(xiàn)過(guò),如果這個(gè)條件寫(xiě)錯(cuò)了,那么判定覆蓋測(cè)試顯然是發(fā)現(xiàn)不了的。判定覆蓋課堂提問(wèn)
試舉例說(shuō)明,為什么有時(shí)有的邏輯表達(dá)式中,一個(gè)條件的取值就可以決定整個(gè)表達(dá)式的取值?
條件覆蓋就是要求判斷表達(dá)式中的每一個(gè)條件都要至少取得一次真值和一次假值,需要注意的是,每一個(gè)條件都要至少取得一次真值和一次假值并不等于每一個(gè)判定也都能至少取得一次真值和一次假值,即條件覆蓋并不比判定覆蓋強(qiáng),兩者的關(guān)注點(diǎn)不同。例如,對(duì)于程序段P1,設(shè)計(jì)測(cè)試用例如下:
case6:x=20,y=-20;
case7:x=-2,y=20。這樣即可達(dá)到條件覆蓋要求,具體覆蓋情況如表所示。條件覆蓋測(cè)試用例編號(hào)xy條件x>0條件y>0條件x<10條件y<10case620-20YNNYcase7-220NYYN
由于case6和case7對(duì)第1個(gè)IF語(yǔ)句,只覆蓋了Y分支,對(duì)第2個(gè)IF語(yǔ)句,只覆蓋了N分支,因此并不滿足判定覆蓋。條件覆蓋條件覆蓋情況如表所示。條件/判定覆蓋
條件覆蓋并不比判定覆蓋強(qiáng),兩者只是關(guān)注點(diǎn)不同,有時(shí)會(huì)把條件覆蓋和判定覆蓋結(jié)合起來(lái)使用,這被稱(chēng)之為條件/判定覆蓋,它的含義是指:設(shè)計(jì)足夠多的測(cè)試用例,使得判定表達(dá)式中每個(gè)條件的真/假取值至少都出現(xiàn)一次,并且每個(gè)判定表達(dá)式自身的真/假取值也都要至少出現(xiàn)一次。
對(duì)于程序段P1,我們?cè)谧雠卸ǜ采w時(shí)設(shè)計(jì)的測(cè)試用例:
case4:x=20,y=20;
case5:x=-2,y=-2。實(shí)際上也同時(shí)是滿足條件/判定覆蓋的,因?yàn)槊總€(gè)條件的真/假取值都出現(xiàn)了一次,并且每個(gè)判定的真/假取值結(jié)果也都出現(xiàn)了一次,具體覆蓋情況如表所示。條件/判定覆蓋測(cè)試用例編號(hào)xy條件x>0條件y>0條件x<10條件y<10case42020YYNNcase5-2-2NNYY條件/判定覆蓋情況如表所示。條件/判定覆蓋
再來(lái)看一個(gè)三角形判定問(wèn)題的案例,有程序段P2如下:
if((a<b+c)&&(b<a+c)&&(c<a+b))
is_Triangle=true;
else
is_Triangle=false;對(duì)該程序段進(jìn)行測(cè)試時(shí),如果要滿足條件/判定覆蓋,則四個(gè)條件表達(dá)式都要既有true取值,也有false取值。四個(gè)條件表達(dá)式如表所示。條件/判定覆蓋條件表達(dá)式編號(hào)條件表達(dá)式1a<b+c2b<a+c3c<a+b4(a<b+c)&&(b<a+c)&&(c<a+b)四個(gè)條件表達(dá)式如表所示。條件/判定覆蓋設(shè)計(jì)測(cè)試用例如下: case8:a=1,b=1,c=1; case9:a=1,b=2,c=3; case10:a=3,b=1,c=2; case11:a=2,b=3,c=1。即可滿足條件/判定覆蓋,具體覆蓋情況如表所示。條件/判定覆蓋測(cè)試用例編號(hào)abc條件表達(dá)式1條件表達(dá)式2條件表達(dá)式3條件表達(dá)式4Case8111YYYYCase9123YYNNCase10312NYYNCase11231YNYN條件/判定覆蓋條件/判定覆蓋情況如表所示。條件組合覆蓋
條件組合覆蓋,它的含義是:設(shè)計(jì)足夠多的測(cè)試用例,使得每個(gè)判定中條件取值的各種組合都至少出現(xiàn)一次。顯然滿足條件組合覆蓋的測(cè)試用例一定也是滿足判定覆蓋、條件覆蓋和條件/判定覆蓋的。
對(duì)于程序段P1,由于一個(gè)判定中有兩個(gè)條件,而兩個(gè)條件可能的組合情況有4種,所以,如果要達(dá)到條件組合覆蓋,至少需要四個(gè)測(cè)試用例。如果能夠合理設(shè)計(jì),讓四個(gè)測(cè)試用例在覆蓋第1個(gè)判定四種條件組合的同時(shí)也覆蓋第2個(gè)判定的四種條件組合,那么四個(gè)測(cè)試用例就夠了。設(shè)計(jì)的測(cè)試用例如下:case12:x=50,y=50;case13:x=-5,y=-5;case14:x=50,y=-5;case15:x=-5,y=50;條件組合覆蓋測(cè)試用例編號(hào)xy第1個(gè)判定第2個(gè)判定條件x>0條件y>0條件x<10條件y<10case125050YYNNcase13-5-5NNYYcase1450-5YNNYcase15-550NYYN對(duì)條件組合的覆蓋情況如表所示。條件組合覆蓋課堂提問(wèn)
條件組合覆蓋測(cè)試設(shè)計(jì)對(duì)我們編寫(xiě)程序有什么啟示?
上面四個(gè)例子雖然滿足條件組合覆蓋,但并不能覆蓋程序中的每一條路徑,例如路徑①②⑤⑥就沒(méi)有執(zhí)行過(guò),因此,條件組合覆蓋標(biāo)準(zhǔn)仍然可能是不徹底的。條件組合覆蓋本節(jié)內(nèi)容就講到這里,謝謝,再見(jiàn)!軟件質(zhì)量保證與測(cè)試4.3_2邏輯覆蓋標(biāo)準(zhǔn)小結(jié)第4章白盒測(cè)試SoftwareQualityAssuranceandTesting邏輯覆蓋小結(jié)邏輯覆蓋是通過(guò)對(duì)程序邏輯結(jié)構(gòu)的遍歷,來(lái)實(shí)現(xiàn)對(duì)程序的測(cè)試,它需要根據(jù)程序內(nèi)部的邏輯結(jié)構(gòu)來(lái)設(shè)計(jì)測(cè)試用例,是一種白盒測(cè)試技術(shù)。邏輯覆蓋是一種基于控制流的覆蓋標(biāo)準(zhǔn),被工業(yè)界廣泛采用。除此之外也有基于數(shù)據(jù)流的覆蓋標(biāo)準(zhǔn)。邏輯覆蓋標(biāo)準(zhǔn)
根據(jù)覆蓋目標(biāo)的不同,邏輯覆蓋可以分為:1.語(yǔ)句覆蓋(SC)2.判定覆蓋(DC)3.條件覆蓋(CC)4.判定/條件覆蓋(DCC)5.條件組合覆蓋(CDC)6.修正判定條件覆蓋(MC/DC)等等
邏輯覆蓋標(biāo)準(zhǔn)
邏輯覆蓋標(biāo)準(zhǔn)用于描述在測(cè)試過(guò)程中,對(duì)被測(cè)對(duì)象的測(cè)試程度,有時(shí)候也稱(chēng)為軟件測(cè)試覆蓋準(zhǔn)則或者測(cè)試數(shù)據(jù)完備準(zhǔn)則。不同的邏輯覆蓋標(biāo)準(zhǔn),對(duì)軟件的測(cè)試程度是不一樣的,而滿足相同覆蓋標(biāo)準(zhǔn)的測(cè)試數(shù)據(jù)集則是等價(jià)的。
邏輯覆蓋標(biāo)準(zhǔn)的作用邏輯覆蓋標(biāo)準(zhǔn)的作用體現(xiàn)在多個(gè)方面。(1)它可以定量地明確軟件測(cè)試的要求和工作量。對(duì)一段程序進(jìn)行測(cè)試時(shí),按照不同的測(cè)試標(biāo)準(zhǔn),測(cè)試的要求,包括測(cè)試的工作量,是不一樣的,例如對(duì)某一段程序進(jìn)行條件組合覆蓋可能需要8個(gè)測(cè)試用例,而條件覆蓋只需要2個(gè)測(cè)試用例,因?yàn)闂l件組合覆蓋標(biāo)準(zhǔn)高于條件覆蓋。通過(guò)邏輯覆蓋標(biāo)準(zhǔn)可以明確軟件測(cè)試要求和工作量。邏輯覆蓋標(biāo)準(zhǔn)的作用(2)它可以體現(xiàn)測(cè)試的充分程度。通過(guò)邏輯覆蓋標(biāo)準(zhǔn),及對(duì)覆蓋率的統(tǒng)計(jì)可以體現(xiàn)測(cè)試進(jìn)行的充分程度,覆蓋標(biāo)準(zhǔn)越高,測(cè)試程度越高,覆蓋率越高,測(cè)試越充分。例如:判定覆蓋比語(yǔ)句覆蓋測(cè)試程度更高。同樣是判定覆蓋,100%的覆蓋率比95%的覆蓋率測(cè)試更充分。邏輯覆蓋標(biāo)準(zhǔn)的作用
(3)它是選取測(cè)試數(shù)據(jù)的依據(jù)在進(jìn)行軟件測(cè)試時(shí),需要設(shè)計(jì)或者選擇很多測(cè)試數(shù)據(jù),那么應(yīng)當(dāng)選取什么樣的數(shù)據(jù)呢?覆蓋標(biāo)準(zhǔn)就是選取測(cè)試數(shù)據(jù)的依據(jù),不同的邏輯覆蓋,就會(huì)按照不同的標(biāo)準(zhǔn)來(lái)選擇測(cè)試數(shù)據(jù)。
邏輯覆蓋標(biāo)準(zhǔn)的作用
(4)它可以作為測(cè)試停止的標(biāo)準(zhǔn)過(guò)度的測(cè)試是一種浪費(fèi),測(cè)試工作不能一直進(jìn)行下去,那么測(cè)試工作應(yīng)當(dāng)何時(shí)停止呢?停止的標(biāo)準(zhǔn)可以有很多種,其中,達(dá)到某種邏輯覆蓋標(biāo)準(zhǔn),就可以作為依據(jù)之一。例如某對(duì)程序進(jìn)行測(cè)試時(shí),要求達(dá)到修正判定條件覆蓋(MC/DC),那么當(dāng)測(cè)試達(dá)到這樣的測(cè)試標(biāo)準(zhǔn)之后,這項(xiàng)測(cè)試任務(wù)即算完成,測(cè)試可以停止。邏輯覆蓋標(biāo)準(zhǔn)的作用
(5)它對(duì)測(cè)試結(jié)果和軟件質(zhì)量評(píng)估具有重要影響測(cè)試結(jié)果是跟測(cè)試標(biāo)準(zhǔn)掛鉤的,不同的覆蓋標(biāo)準(zhǔn)對(duì)同一個(gè)軟件的測(cè)試結(jié)果有可能是不一樣的,軟件能通過(guò)一個(gè)覆蓋標(biāo)準(zhǔn)的測(cè)試,不一定能通過(guò)另外一個(gè)覆蓋標(biāo)準(zhǔn)的測(cè)試。不同覆蓋標(biāo)準(zhǔn)在對(duì)軟件的測(cè)試程度上有區(qū)別,根據(jù)測(cè)試通過(guò)的覆蓋標(biāo)準(zhǔn)的不同,可以對(duì)軟件質(zhì)量給出不同的評(píng)估意見(jiàn)。
如果說(shuō)覆蓋標(biāo)準(zhǔn)A的充分程度比標(biāo)準(zhǔn)B高,則意味著滿足A標(biāo)準(zhǔn)的測(cè)試用例集合也滿足B標(biāo)準(zhǔn)。語(yǔ)句覆蓋、判定覆蓋、條件覆蓋、條件/判定覆蓋、條件組合覆蓋它們的測(cè)試充分程度存在著如圖所示的強(qiáng)弱關(guān)系。覆蓋標(biāo)準(zhǔn)對(duì)比
它們中,條件組合覆蓋最強(qiáng)。而條件覆蓋并不一定比語(yǔ)句覆蓋強(qiáng)。
在軟件測(cè)試過(guò)程中,需要按照測(cè)試覆蓋標(biāo)準(zhǔn)統(tǒng)計(jì)覆蓋率,例如統(tǒng)計(jì)語(yǔ)句覆蓋率、判定覆蓋率等,這樣做的目的是:1.提高測(cè)試效率通過(guò)覆蓋率統(tǒng)計(jì),可以發(fā)現(xiàn)并去除無(wú)效的測(cè)試項(xiàng)目,減少測(cè)試次數(shù),簡(jiǎn)化測(cè)試用例生成過(guò)程,提高測(cè)試效率。覆蓋率統(tǒng)計(jì)例如,張三李四兩位測(cè)試工程師一起設(shè)計(jì)測(cè)試用例,通過(guò)覆蓋率統(tǒng)計(jì)發(fā)現(xiàn),兩人的測(cè)試用例合并時(shí)李四設(shè)計(jì)的一部分測(cè)試用例對(duì)提高覆蓋率沒(méi)有任何貢獻(xiàn),也就是這些測(cè)試用例是冗余的,應(yīng)當(dāng)去掉,以減少不必要的工作量。覆蓋率統(tǒng)計(jì)2.發(fā)現(xiàn)更多問(wèn)題,提高產(chǎn)品質(zhì)量通過(guò)覆蓋率統(tǒng)計(jì),可以清楚的描述程序被檢驗(yàn)到了何種程度,發(fā)現(xiàn)軟件中尚未測(cè)量過(guò)的部分,然后針對(duì)未測(cè)試或者測(cè)試不充分的地方繼續(xù)測(cè)試,以發(fā)現(xiàn)更多問(wèn)題,提高軟件產(chǎn)品的質(zhì)量。
例如,通過(guò)覆蓋率統(tǒng)計(jì)發(fā)現(xiàn),模塊X的覆蓋率為0,也就是說(shuō)這個(gè)模塊根本就還沒(méi)有測(cè)試到,而模塊Y的覆蓋率為還只有30%,測(cè)試不夠充分,此時(shí)應(yīng)針對(duì)模塊X和Y繼續(xù)測(cè)試。覆蓋率統(tǒng)計(jì)本節(jié)內(nèi)容就講到這里,謝謝,再見(jiàn)!軟件質(zhì)量保證與測(cè)試4.4基本路徑覆蓋第4章白盒測(cè)試SoftwareQualityAssuranceandTesting
在把程序抽象為有向圖之后,我們把從程序入口到出口經(jīng)過(guò)的各個(gè)節(jié)點(diǎn)的有序排列稱(chēng)為路徑,可用路徑表達(dá)式來(lái)表示這樣的一條路徑。路徑表達(dá)式可以是節(jié)點(diǎn)序列,也可以是弧序列,例如有如圖所示程序控制流圖,其可能的程序執(zhí)行路徑如下表所示。程序中的路徑
需要注意的是,程序中存在循環(huán)時(shí),如果執(zhí)行循環(huán)的次數(shù)不同,那么對(duì)應(yīng)的執(zhí)行路徑就不同,例如表中路徑3和路徑4就是由于程序執(zhí)行循環(huán)次數(shù)不同而形成的不同的路徑。程序中的路徑路徑編號(hào)弧序列表示節(jié)點(diǎn)序列表示1acde1-2-3-4-52abe1-2-4-53abefabe1-2-4-5-1-2-4-54abefabefabe1-2-4-5-1-2-4-5-1-2-4-55abefacde1-2-4-5-1-2-3-4-5..................
基本的路徑表達(dá),采用的是節(jié)點(diǎn)序列,或者是弧序列,例如表中路徑1為acde,或者1-2-3-4-5。為增強(qiáng)路徑表達(dá)能力,可以在路徑表達(dá)式引入加法和乘方,加法可以表達(dá)IF分支結(jié)構(gòu),乘方可以表達(dá)循環(huán)結(jié)構(gòu)。
設(shè)有程序控制流圖如右圖所示,則它所有可能的路徑可表達(dá)為:(ac+bd)e(fe)n,n為循環(huán)的次數(shù)。程序中的路徑完全的路徑覆蓋一般不可能
程序中的一條IF語(yǔ)句就會(huì)形成兩條路徑。兩條IF語(yǔ)句的串聯(lián)就會(huì)有四條路徑,在實(shí)際問(wèn)題中,即使一個(gè)不太復(fù)雜的程序,其可能的路徑都是一個(gè)龐大的數(shù)字,而如果程序中存在循環(huán),則可能的路徑就是天文數(shù)字。完全的路徑覆蓋一般不可能設(shè)有如圖所示的一個(gè)程序流程圖,如果程序中循環(huán)的執(zhí)行上限是10次,那么可能有多少條程序執(zhí)行路徑?答案是,可能的程序執(zhí)行路徑條數(shù)L:=40+41+42+43+……+410=1398101完全的路徑覆蓋一般不可能
假設(shè)圖中所有可能的路徑都是可執(zhí)行路徑,某臺(tái)計(jì)算機(jī)對(duì)該程序執(zhí)行一次循環(huán)大約需要10微秒,那么把所有可能的路徑都測(cè)試一遍,大約需要的時(shí)間為:
1398101*10/1000000≈14(秒)
假設(shè)該計(jì)算機(jī)一年365天每天24小時(shí)不停機(jī),如果程序中循環(huán)的執(zhí)行次數(shù)上限是20次,那么把所有可能的路徑都測(cè)試一遍大約需要4072小時(shí),如果循環(huán)次數(shù)上限是100次,則大約需要6.79*1047年。由此可見(jiàn),對(duì)于實(shí)際的應(yīng)用程序,做路徑窮舉測(cè)試是不可行的。基本路徑覆蓋
既然無(wú)法對(duì)一個(gè)實(shí)際的應(yīng)用程序進(jìn)行路徑的窮舉測(cè)試,那么就只能選取部分路徑來(lái)進(jìn)行測(cè)試?;韭窂礁采w就是在程序控制流圖的基礎(chǔ)上,通過(guò)分析控制流圖的環(huán)路復(fù)雜性,然后導(dǎo)出程序獨(dú)立路徑集合,再設(shè)計(jì)測(cè)試用例覆蓋所有獨(dú)立路徑的一種動(dòng)態(tài)白盒測(cè)試方法。由于基本路徑覆蓋把程序中的所有節(jié)點(diǎn)都覆蓋到了,所以程序中的每一條可執(zhí)行語(yǔ)句也至少會(huì)被執(zhí)行一次,也就是說(shuō)滿足基本路徑覆蓋就一定是滿足語(yǔ)句覆蓋的?;韭窂礁采w
所謂獨(dú)立路徑是指,和其他的獨(dú)立路徑相比,至少有一個(gè)路徑節(jié)點(diǎn)是新的,未被其他獨(dú)立路徑所包含。
從程序的環(huán)路復(fù)雜度可導(dǎo)出程序基本路徑集合中的獨(dú)立路徑條數(shù):
程序獨(dú)立路徑條數(shù)=程序的環(huán)路復(fù)雜度
這是確保程序中每個(gè)可執(zhí)行語(yǔ)句至少執(zhí)行一次所必須的測(cè)試用例數(shù)目的下界。
得出程序獨(dú)立路徑條數(shù)后,再根據(jù)控制流圖,得出各條獨(dú)立路徑。所有獨(dú)立路徑組成獨(dú)立路徑集合,也就是基本路徑集合。基本路徑覆蓋畫(huà)出程序控制流圖2)計(jì)算程序環(huán)路復(fù)雜性3)確定獨(dú)立路徑集合4)為每條獨(dú)立路徑設(shè)計(jì)測(cè)試用例
基本路徑覆蓋應(yīng)當(dāng)確?;韭窂郊械拿恳粭l路徑都能被執(zhí)行到。一般是為每條獨(dú)立路徑設(shè)計(jì)一個(gè)測(cè)試用例,執(zhí)行這個(gè)測(cè)試用例時(shí),就能確保該獨(dú)立路徑會(huì)被執(zhí)行。
借助于專(zhuān)門(mén)的工具軟件,導(dǎo)出控制流圖和確定基本路徑的過(guò)程均可以自動(dòng)完成。
基本路徑覆蓋測(cè)試法的基本步驟如下:基本路徑覆蓋
在基本路徑測(cè)試中,稱(chēng)為圖形矩陣的數(shù)據(jù)結(jié)構(gòu)很有用。利用圖形矩陣可以確定控制流圖的環(huán)路復(fù)雜度,也就是基本路徑集合中基本路徑的條數(shù)。一個(gè)圖形矩陣是—個(gè)方陣,其行/列都是控制流圖中的節(jié)點(diǎn),每行和每列依次對(duì)應(yīng)到一個(gè)被標(biāo)識(shí)的節(jié)點(diǎn),矩陣元素對(duì)應(yīng)到節(jié)點(diǎn)間的連接(即?。T趫D形矩陣中控制流圖的每一個(gè)節(jié)點(diǎn)都用數(shù)字加以標(biāo)識(shí),每一條邊都用字母加以標(biāo)識(shí)。如果在控制流團(tuán)中第i個(gè)結(jié)點(diǎn)到第j個(gè)結(jié)點(diǎn)有一個(gè)名為x的邊相連接,則在對(duì)應(yīng)的圖形矩陣中第i行/第j列有—個(gè)非空的元素?;韭窂礁采w
對(duì)每個(gè)矩陣項(xiàng)加入連接權(quán)值,圖形矩陣就可以用于在測(cè)試中評(píng)估程序的控制結(jié)構(gòu),連接權(quán)值為控制流提供了另外的信息。最簡(jiǎn)單的情況下,連接權(quán)值是1或0,分別表示存在連接或不存在連接。但是,連接權(quán)值可以被賦予更多有用的屬性,如:執(zhí)行連接的概率;穿越連接的處理時(shí)間;穿越連接時(shí)所需的內(nèi)存;穿越連接時(shí)所需的資源等。
如果連接權(quán)值為1表示存在連接,那么圖中有兩個(gè)元素為1的行所代表的節(jié)點(diǎn)就一定是一個(gè)判定節(jié)點(diǎn),通過(guò)計(jì)算圖形矩陣中有兩個(gè)元素為1的行的個(gè)數(shù),就可以得出總的判定節(jié)點(diǎn)數(shù),從而得出環(huán)路復(fù)雜度。這是確定環(huán)路復(fù)雜度的另一種方法?;韭窂礁采w
給出一個(gè)圖形矩陣的實(shí)例如下:左邊為程序控制流圖,右邊為對(duì)應(yīng)的圖形矩陣?;韭窂礁采w
圖形矩陣中,有兩個(gè)元素為1的行有3個(gè),所以判定節(jié)點(diǎn)數(shù)為3,從而得出環(huán)路復(fù)雜度為3+1=4?;韭窂礁采w實(shí)例
下面我們來(lái)看一個(gè)基本路徑覆蓋的例子。
請(qǐng)針對(duì)程序段IsLeap,為變量year設(shè)計(jì)測(cè)試用例,滿足基本路徑覆蓋,假設(shè)year的取值范圍為1000——9999。
基本路徑覆蓋實(shí)例intIsLeap(intyear){ if(year%4==0){ if(year%100==0){ if(year%400==0) leap=1; else leap=0; }elseleap=1; }else leap=0;returnleap;}基本路徑覆蓋實(shí)例(1)繪制出程序代碼對(duì)應(yīng)的控制流圖,如下圖所示?;韭窂礁采w實(shí)例(2)計(jì)算環(huán)路復(fù)雜度V(G)。 V(G)=E-N+2=14-12+2=4;V(G)=判定點(diǎn)數(shù)+1=3+1=4
V(G)=區(qū)域數(shù)=4(3)確定獨(dú)立路徑集合。 1-2-3-11-12 1-2-4-5-10-11-12 1-2-4-6-7-9-10-11-12 1-2-4-6-8-9-10-11-12(4)設(shè)計(jì)測(cè)試用例。
針對(duì)各條獨(dú)立路徑設(shè)計(jì)的測(cè)試用例,如表所示?;韭窂礁采w實(shí)例測(cè)試用例編號(hào)測(cè)試數(shù)據(jù)預(yù)期執(zhí)行結(jié)果測(cè)試路徑1year=1001leap=01-2-3-11-122year=1004leap=11-2-4-5-10-11-123year=1100leap=01-2-4-6-7-9-10-11-124year=2000leap=11-2-4-6-8-9-10-11-12本節(jié)內(nèi)容就講到這里,謝謝,再見(jiàn)!軟件質(zhì)量保證與測(cè)試循環(huán)測(cè)試第4章白盒測(cè)試SoftwareQualityAssuranceandTesting
在基本的程序結(jié)構(gòu)中,循環(huán)結(jié)構(gòu)是最為復(fù)雜的一種,程序執(zhí)行路徑的膨脹主要是由循環(huán)結(jié)構(gòu)引起的,循環(huán)次數(shù)不同,就會(huì)形成不同的執(zhí)行路徑。由于程序執(zhí)行時(shí)循環(huán)結(jié)構(gòu)的執(zhí)行次數(shù)具有不確定性,可能會(huì)出現(xiàn)各種情況,也最容易出現(xiàn)錯(cuò)誤,所以循環(huán)結(jié)構(gòu)應(yīng)當(dāng)是測(cè)試的重點(diǎn)之一。循環(huán)測(cè)試
有必要關(guān)注和分析程序中循環(huán)結(jié)構(gòu)的正確性,對(duì)循環(huán)進(jìn)行測(cè)試,以驗(yàn)證循環(huán)結(jié)構(gòu)在不同的情況下都能正確運(yùn)行,從而保證整個(gè)程序的正確。循環(huán)測(cè)試基本的循環(huán)結(jié)構(gòu)有兩種形式:先判斷循環(huán)條件是否成立,再循環(huán)先循環(huán),再判斷條件是否成立,需不需要繼續(xù)循環(huán)。
如圖所示。
循環(huán)測(cè)試//先判斷再執(zhí)行inti=1,s=0,a=100;while(i<=a){s=s+i;i=i+1;}基本的循環(huán)結(jié)構(gòu)有兩種形式//先執(zhí)行再判斷inti=1,s=0,a=100;do{s=s+i;i=i+1;}while(i<=a);代碼實(shí)例
對(duì)于基本循環(huán)結(jié)構(gòu),一般測(cè)試方法有兩種:第一種:Z路徑覆蓋測(cè)試第二種:循環(huán)邊界條件測(cè)試循環(huán)測(cè)試Z路徑覆蓋測(cè)試是對(duì)循環(huán)機(jī)制進(jìn)行簡(jiǎn)化,簡(jiǎn)化的方法就是限制循環(huán)的次數(shù),不管循環(huán)的形式是哪一種?無(wú)論循環(huán)體實(shí)際執(zhí)行的次數(shù)可能是多少,都只考慮循環(huán)條件不滿足,和只滿足一次這兩種情況。Z路徑覆蓋測(cè)試
對(duì)于兩種基本循環(huán)結(jié)構(gòu),Z路徑覆蓋測(cè)試都會(huì)把它們簡(jiǎn)化為一個(gè)簡(jiǎn)單的判定結(jié)構(gòu)。Z路徑覆蓋測(cè)試Z路徑覆蓋測(cè)試
在對(duì)程序進(jìn)行測(cè)試時(shí),如果采用上述方法對(duì)循環(huán)的次數(shù)加以限制,那么程序總的執(zhí)行路徑數(shù)就可能不會(huì)太大,因而有可能實(shí)現(xiàn)對(duì)循環(huán)簡(jiǎn)化的所有路徑進(jìn)行全覆蓋,這就是路徑枚舉所要進(jìn)行的工作。
Z路徑覆蓋測(cè)試
對(duì)循環(huán)進(jìn)行測(cè)試的第二種方法是循環(huán)邊界條件測(cè)試,相當(dāng)于對(duì)循環(huán)次數(shù)變量進(jìn)行邊界值測(cè)試,一般覆蓋7個(gè)邊界值點(diǎn)。
循環(huán)邊界條件測(cè)試
設(shè)i為實(shí)際循環(huán)次數(shù),n是最大循環(huán)次數(shù),那么測(cè)試用例應(yīng)包括:
直接跳過(guò)循環(huán)體,讓i=0;只執(zhí)行一遍循環(huán)體,讓i=1;執(zhí)行兩遍循環(huán)體,讓i=2;執(zhí)行m遍循環(huán)體(2<m<n-1)
;執(zhí)行n-1遍循環(huán)體,讓i=n-1;正好執(zhí)行n遍循環(huán)體,讓i=n;超出最大循環(huán)次數(shù)。循環(huán)邊界條件測(cè)試對(duì)循環(huán)次數(shù)變量進(jìn)行邊界值測(cè)試,覆蓋7個(gè)邊界值點(diǎn)。設(shè)n是最大循環(huán)次數(shù)
循環(huán)邊界條件測(cè)試七點(diǎn)法012
m
n-1n跳出
下面我們來(lái)看一個(gè)循環(huán)邊界條件測(cè)試的應(yīng)用實(shí)例,有一個(gè)帶有循環(huán)的程序段,我們采用循環(huán)邊界條件測(cè)試法來(lái)對(duì)其進(jìn)行測(cè)試,程序段如下:循環(huán)邊界條件測(cè)試//被測(cè)程序My_Sum{intj}inti=1,s=0,a=100;while(i<=jandi<=a){s=s+i;i=i+1;}CASE1:j=0實(shí)際循環(huán)0次CASE2:j=1實(shí)際循環(huán)1次CASE3:j=2實(shí)際循環(huán)2次CASE4:j=50實(shí)際循環(huán)50次CASE5:j=99實(shí)際循環(huán)99次CASE6:j=100實(shí)際循環(huán)100次CASE7:j=101實(shí)際循環(huán)100次且此時(shí)i=101超出最大循環(huán)次數(shù)循環(huán)邊界條件測(cè)試復(fù)合循環(huán)結(jié)構(gòu)測(cè)試
除了基本的循環(huán)結(jié)構(gòu)之外,在程序中可能出現(xiàn)復(fù)合循環(huán)結(jié)構(gòu),它們可能是:連接循環(huán)指兩個(gè)或兩個(gè)以上簡(jiǎn)單循環(huán)串聯(lián)起來(lái)順序執(zhí)行。嵌套循環(huán)指循環(huán)結(jié)構(gòu)中又包含循環(huán)結(jié)構(gòu)。非結(jié)構(gòu)循環(huán)
指從一個(gè)循環(huán)體內(nèi)直接跳轉(zhuǎn)到另外一個(gè)循環(huán)體內(nèi)的情況。三種復(fù)合循環(huán)結(jié)構(gòu)如下圖所示。復(fù)合循環(huán)結(jié)構(gòu)測(cè)試
1.測(cè)試連接循環(huán)如果相連接的循環(huán)體互相獨(dú)立,那么按照簡(jiǎn)單循環(huán)測(cè)試每一個(gè)循環(huán)體即可。如果相連接的循環(huán)體1的循環(huán)變量的最終結(jié)果是循環(huán)體2循環(huán)變量的初始值,那么可采用針對(duì)嵌套循環(huán)的方法來(lái)測(cè)試。復(fù)合循環(huán)結(jié)構(gòu)測(cè)試2.測(cè)試嵌套循環(huán)測(cè)試嵌套循環(huán)的方法為:從最內(nèi)層測(cè)試開(kāi)始,其它層的循環(huán)變量置為最小值;按照簡(jiǎn)單循環(huán)的測(cè)試方法測(cè)試最內(nèi)層的循環(huán)體,外層循環(huán)仍舊取最小值;向外擴(kuò)展循環(huán)體,測(cè)試下一個(gè)循環(huán);所有外層循環(huán)變量取最小值;其余內(nèi)層嵌套的循環(huán)體取典型值;繼續(xù)本步驟直到所有的循環(huán)體均測(cè)試完畢。復(fù)合循環(huán)結(jié)構(gòu)測(cè)試3.測(cè)試非結(jié)構(gòu)循環(huán)測(cè)試非結(jié)構(gòu)循環(huán)是一件十分令人頭痛的事情,最好的方法是重新設(shè)計(jì)循環(huán)體結(jié)構(gòu),使其變成嵌套循環(huán)或者連接循環(huán)。復(fù)合循環(huán)結(jié)構(gòu)測(cè)試本節(jié)內(nèi)容就講到這里,謝謝,再見(jiàn)!軟件質(zhì)量保證與測(cè)試4.7程序變異測(cè)試第4章白盒測(cè)試SoftwareQualityAssuranceandTesting導(dǎo)言變異測(cè)試,好奇怪的名字!什么是變異測(cè)試?為什么要有變異測(cè)試?變異測(cè)試新檢查儀器沒(méi)病做一個(gè)類(lèi)比
醫(yī)院新儀器設(shè)備;對(duì)一批疑似病人進(jìn)行了檢查;檢查結(jié)果是這些疑似病人都沒(méi)有患病;此時(shí),無(wú)法斷定是這些人確實(shí)沒(méi)有病,還是這臺(tái)儀器有問(wèn)題。測(cè)試中類(lèi)似問(wèn)題
軟件測(cè)試中也有類(lèi)似情況。假設(shè)在對(duì)某個(gè)軟件進(jìn)行測(cè)試時(shí),我們?cè)O(shè)計(jì)并執(zhí)行了大量測(cè)試數(shù)據(jù),但沒(méi)有發(fā)現(xiàn)程序有什么問(wèn)題,執(zhí)行結(jié)果都是正確的。這時(shí)有兩種可能:
測(cè)試程序測(cè)試數(shù)據(jù)測(cè)試通過(guò)測(cè)試數(shù)據(jù)質(zhì)量差程序質(zhì)量高?那么到底是哪種情況呢?新檢查儀器沒(méi)病提問(wèn):醫(yī)院如何解決類(lèi)似問(wèn)題
被檢查的人確實(shí)沒(méi)有病還是這臺(tái)儀器有問(wèn)題?軟件測(cè)試中類(lèi)似的辦法
人為的按照某種規(guī)則把程序修改一下,讓它有錯(cuò)誤,然后再去執(zhí)行前面的測(cè)試數(shù)據(jù)。
程序被人為改錯(cuò)測(cè)試數(shù)據(jù)
測(cè)試?若發(fā)現(xiàn)了植入的錯(cuò)誤,說(shuō)明測(cè)試數(shù)據(jù)質(zhì)量還是可以的。若沒(méi)有發(fā)現(xiàn),則說(shuō)明先前設(shè)計(jì)的測(cè)試數(shù)據(jù)質(zhì)量確實(shí)不高。引入主題——變異測(cè)試
醫(yī)院用確實(shí)有病的人來(lái)檢驗(yàn)診斷儀器是否有效,這個(gè)例子可以幫助我們理解什么是變異測(cè)試,它有什么作用。
簡(jiǎn)單地說(shuō),人為地把程序修改得有錯(cuò)誤,以檢驗(yàn)測(cè)試用例是否有效,這就是變異測(cè)試。
當(dāng)然這只是變異測(cè)試的一種情況,變異測(cè)試的作用也不止這一種。學(xué)習(xí)目標(biāo)本知識(shí)單元我們就來(lái)學(xué)習(xí)變異測(cè)試,通過(guò)學(xué)習(xí),我們應(yīng)當(dāng)實(shí)現(xiàn)的教學(xué)目標(biāo)為:掌握程序變異和變異測(cè)試的基本概念;理解變異測(cè)試產(chǎn)生的原因和作用;具備對(duì)程序進(jìn)行變異并進(jìn)行變異測(cè)試的能力;學(xué)會(huì)通過(guò)變異測(cè)試來(lái)改進(jìn)測(cè)試用例設(shè)計(jì);理解變異測(cè)試的優(yōu)缺點(diǎn),并能合理運(yùn)用變異測(cè)試技術(shù)。如何變異目標(biāo):修改程序讓它有錯(cuò)以檢驗(yàn)測(cè)試數(shù)據(jù)是否有效。問(wèn)題:什么樣的修改最有現(xiàn)實(shí)意義?對(duì)檢驗(yàn)測(cè)試數(shù)據(jù)有效性、對(duì)提高測(cè)試的質(zhì)量是較為有現(xiàn)實(shí)作用?做法:要檢查驗(yàn)證測(cè)試數(shù)據(jù)的有效性,首先應(yīng)當(dāng)模擬常見(jiàn)的錯(cuò)誤和疏漏來(lái)修改程序。如果連這些都發(fā)現(xiàn)不了,那測(cè)試數(shù)據(jù)的質(zhì)量肯定是有問(wèn)題的,需要進(jìn)一步完善。概念:程序變異
變異測(cè)試中的程序變異是指:基于良好定義的變異操作,對(duì)程序進(jìn)行修改,得到源程序的變異程序。而良好定義的變異操作可以是模擬典型的應(yīng)用錯(cuò)誤。例如:模擬操作符使用錯(cuò)誤,把大于等于寫(xiě)成小于等于,或者是強(qiáng)制出現(xiàn)特定數(shù)據(jù),以便對(duì)特定的代碼或者特定的情況進(jìn)行有效地測(cè)試,例如使得每個(gè)表達(dá)式都等于0,以測(cè)試某種特殊情況。用“>”來(lái)替換“>=”程序變異通常只是一種輕微改變程序的操作。例如,有程序段P1,可以用“>”來(lái)替換程序中的“>=”,產(chǎn)生變異程序P2。程序變異程序段P1if(x>=60)y=“合格”;elsey=“不合格”;程序段P2if(x>60)y=“合格”;elsey=“不合格”;請(qǐng)同學(xué)們也模擬程序編寫(xiě)當(dāng)中的典型錯(cuò)誤和疏漏,提出一項(xiàng)自己的程序變異方案。程序變異程序段P1if(x>=60)y=“合格”;elsey=“不合格”;?變異測(cè)試
先對(duì)程序進(jìn)行變異,然后再來(lái)執(zhí)行測(cè)試,以檢驗(yàn)測(cè)試數(shù)據(jù)集是否有效,或者達(dá)到某種特定目的的測(cè)試方法叫做變異測(cè)試。變異測(cè)試有時(shí)也叫做“變異分析”,是一種對(duì)測(cè)試數(shù)據(jù)集的有效性、充分性進(jìn)行評(píng)估的技術(shù),以便指導(dǎo)我們創(chuàng)建更有效的測(cè)試數(shù)據(jù)集。產(chǎn)生于20世紀(jì)70年代最初是為了揭示軟件測(cè)試中的不足如果一個(gè)已知的修改甚至是錯(cuò)誤被植入到程序中,而測(cè)試結(jié)果不受影響。則說(shuō)明:測(cè)試不充分或者測(cè)試無(wú)效變異測(cè)試
事先被良好定義的變異操作可以稱(chēng)為變異算子。變異算子變異算子描述運(yùn)算符變異對(duì)關(guān)系運(yùn)算符“<”、“<=”、“>”、“>=”進(jìn)行替換,如將“<”替換為“<=”對(duì)自增運(yùn)算符“++”或自減運(yùn)算符“--”進(jìn)行替換,如將“++”替換為“--”對(duì)與數(shù)值運(yùn)算的二元算術(shù)運(yùn)算符進(jìn)行替換,如將“+”替換為“-”將程序中的條件運(yùn)算符替換為相反運(yùn)算符,如將“==”替換為“!=”數(shù)值變異對(duì)程序中整數(shù)類(lèi)型、浮點(diǎn)數(shù)類(lèi)型的變量取相反數(shù),如將“i”替換為“-i”方法返回值變異刪除程序中返回值類(lèi)型為void的方法對(duì)程序中方法的返回值進(jìn)行修改,如將“true”修改為“false”
程序:P測(cè)試數(shù)據(jù)集:T變異算子:F()F(P)Mi(i=1,2,3...)Test(P,T)andTest(Mi,T)
IfTest(P,T)<>Test(Mi,T)//(i=x)
Mi
isKilledelseMi
isaliveEndifIfMi_alive
<>PImprove(T)變異測(cè)試存在變異程序與原程序等價(jià)的特殊情形!!!Mi_alive
==P程序段P1if(x>=60)y=“合格”;elsey=“不合格”;程序段P’if(x<60)y=“不合格”;elsey=“合格”;
針對(duì)程序段P1,前面我們已經(jīng)用“>”來(lái)替換“>=”,產(chǎn)生了下面的變異程序P2。變異測(cè)試實(shí)例用“>”來(lái)替換“>=”程序段P1if(x>=60)y=“合格”;elsey=“不合格”;程序段P2if(x>60)y=“合格”;elsey=“不合格”;
除了這種變異之外,還可以用“=”來(lái)替換“>=”,產(chǎn)生下面的變異程序P3如下:變異測(cè)試實(shí)例用“=”來(lái)替換“>=”程序段P1if(x>=60)y=“合格”;elsey=“不合格”;程序段P3if(x=60)y=“合格”;elsey=“不合格”;兩個(gè)測(cè)試數(shù)據(jù)都能得到正確結(jié)果,還需要增加測(cè)試用例,例如x=60變異測(cè)試實(shí)例測(cè)試員A
程序段P1if(x>=60)y=“合格”;elsey=“不合格”;測(cè)試數(shù)據(jù)集T1x=70x=50針對(duì)設(shè)計(jì)測(cè)試程序段P2if(x>60)y=“合格”;elsey=“不合格”;兩個(gè)測(cè)試數(shù)據(jù)也都得到正確結(jié)果,還需要增加測(cè)試用例!?。∽儺悳y(cè)試實(shí)例測(cè)試員B
程序段P1if(x>=60)y=“合格”;elsey=“不合格”;測(cè)試數(shù)據(jù)集T2x=60x=50針對(duì)設(shè)計(jì)測(cè)試程序段P3if(x=60)y=“合格”;elsey=“不合格”;
那么請(qǐng)大家思考一下,還需要增加一個(gè)什么樣測(cè)試用例,才能殺死變異程序P3,并給出自己的答案。參與式學(xué)習(xí)?變異程序P3變異測(cè)試的特點(diǎn)
程序變異測(cè)試方法是一種錯(cuò)誤驅(qū)動(dòng)測(cè)試。該方法通常是針對(duì)某類(lèi)特定的程序錯(cuò)誤。
關(guān)系運(yùn)算符使用錯(cuò)誤方法返回值錯(cuò)誤數(shù)據(jù)類(lèi)型錯(cuò)誤變異測(cè)試的優(yōu)缺點(diǎn)優(yōu)點(diǎn)缺點(diǎn)
幫助發(fā)現(xiàn)測(cè)試工作中的不足,提高測(cè)試數(shù)據(jù)集的覆蓋度和有效性,改進(jìn)和優(yōu)化測(cè)試數(shù)據(jù)集,可用于在細(xì)節(jié)方面改進(jìn)程序源代碼。
如果要讓變異測(cè)試針對(duì)各種情況,則必須引入大量的變異,這將導(dǎo)致測(cè)試成本過(guò)大,變異測(cè)試一般并不能單獨(dú)使用,而需要與傳統(tǒng)的其它測(cè)試方法技術(shù)相結(jié)合。練習(xí)與測(cè)驗(yàn)給定程序段P如下:If(cj1<0orcj1>100)Return“平時(shí)成績(jī)超出范圍”If(cj2<0orcj2>100)Return“期末成績(jī)超出范圍”P(pán)rint“成績(jī)輸入符合要求”請(qǐng)按照某種測(cè)試設(shè)計(jì)方法,為該程序段設(shè)計(jì)一組測(cè)試數(shù)據(jù)T模擬某種常見(jiàn)的錯(cuò)誤和疏漏,定義變異算子F()用F()對(duì)程序P進(jìn)行變異,得到變異程序PX檢查T(mén)能否殺死PX
如果T不能殺死PX,改進(jìn)T,直到能殺死為止應(yīng)用拓展1.科研應(yīng)用:算法優(yōu)化
某智能算法F有參數(shù)C,根據(jù)已有研究,在某領(lǐng)域應(yīng)用此算法時(shí),參數(shù)取C=c0時(shí),算法給出的結(jié)果最好?,F(xiàn)將此算法應(yīng)用于另一領(lǐng)域,參數(shù)取C=c0時(shí),算法給出的結(jié)果難以令人滿意,問(wèn)如何改進(jìn)?應(yīng)用拓展1.科研應(yīng)用:算法優(yōu)化
改進(jìn)的常用方法之一,就是嘗試參數(shù)C取不同的值,然后通過(guò)比較算法執(zhí)行結(jié)果的優(yōu)劣,來(lái)確定C的最佳取值。
讓C取不同的值,得到的不同的程序,可以看成是對(duì)源程序的變異,通過(guò)對(duì)變異程序的測(cè)試,可以嘗試尋找算法參數(shù)的最優(yōu)配置,從而實(shí)現(xiàn)算法優(yōu)化。
類(lèi)似于這樣的變異測(cè)試,廣泛應(yīng)用于科學(xué)研究。應(yīng)用拓展2.學(xué)科競(jìng)賽:全國(guó)大學(xué)生軟件測(cè)試大賽
某次賽題:給定Java源代碼RedBlackTree,要求寫(xiě)出測(cè)試腳本實(shí)現(xiàn)分支覆蓋,并能殺死與源代碼不等價(jià)的變異程序。
實(shí)現(xiàn)對(duì)代碼的測(cè)試覆蓋是測(cè)試時(shí)應(yīng)當(dāng)達(dá)到的目標(biāo)之一,但僅此還不夠。應(yīng)用拓展2.學(xué)科競(jìng)賽:全國(guó)大學(xué)生軟件測(cè)試大賽
測(cè)試覆蓋,只是說(shuō)明測(cè)試到了所有要測(cè)試的位置,但并不意味著一定能發(fā)現(xiàn)可能存在的缺陷。這就類(lèi)似于班干部檢查衛(wèi)生時(shí)查了所有的寢室,但并不一定能保證沒(méi)有任何衛(wèi)生的死角。
好的測(cè)試用例集,還應(yīng)能盡可能多的發(fā)現(xiàn)代碼中可能存在的軟件缺陷。程序變異一般是模擬常見(jiàn)的缺陷,所以能殺死與源代碼不等價(jià)的變異程序,就相當(dāng)于能發(fā)現(xiàn)常見(jiàn)的軟件缺陷。小結(jié)類(lèi)比理解什么是變異測(cè)試、為什么要有變異測(cè)試程序變異、變異測(cè)試的概念如何對(duì)程序進(jìn)行變異如何通過(guò)變異測(cè)試來(lái)改進(jìn)測(cè)試數(shù)據(jù)的設(shè)計(jì)練習(xí)與測(cè)試,掌握如何應(yīng)用變異測(cè)試方法去解決實(shí)際問(wèn)題本節(jié)內(nèi)容就講到這里,謝謝,再見(jiàn)!4.7程序變異測(cè)試第4章白盒測(cè)試軟件質(zhì)量保證與測(cè)試
符號(hào)測(cè)試第4章白盒測(cè)試SoftwareQualityAssuranceandTesting符號(hào)測(cè)試
符號(hào)測(cè)試的基本思想是允許程序的輸入不僅是具體的數(shù)值數(shù)據(jù),而且可以是符號(hào)值,這一方法也因此而得名。
符號(hào)執(zhí)行法是一種介于程序測(cè)試用例執(zhí)行與程序正確性證明之間的方法。它使用一個(gè)專(zhuān)用的程序,對(duì)輸入的源程序進(jìn)行解釋。在解釋執(zhí)行時(shí),允許程序的輸入不僅僅是具體的數(shù)值數(shù)據(jù),而且包括符號(hào)值,符號(hào)值可以是基本的符號(hào)變量,也可以是符號(hào)變量的表達(dá)式。符號(hào)測(cè)試專(zhuān)用解釋程序
被測(cè)程序符號(hào)輸入輸出符號(hào)表達(dá)式
符號(hào)測(cè)試的執(zhí)行結(jié)果,是包含輸入符號(hào)的表達(dá)式。符號(hào)測(cè)試
符號(hào)測(cè)試執(zhí)行得到的結(jié)果,可以有兩個(gè)用途:一是可以檢查程序的執(zhí)行結(jié)果是否符合程序的規(guī)格或者是預(yù)期的目的;二是通過(guò)程序的符號(hào)執(zhí)行結(jié)果,可以分析程序的執(zhí)行路徑,為進(jìn)一步自動(dòng)生成測(cè)試數(shù)據(jù)提供條件。符號(hào)測(cè)試
下面我們來(lái)看兩個(gè)簡(jiǎn)單的例子,以幫助我們理解符號(hào)測(cè)試。設(shè)有一段程序,功能是計(jì)算兩個(gè)數(shù)的和,如果要把兩個(gè)數(shù)相加所有可能的情況如1+1,1+2,2+1,......等等,都輸入進(jìn)去測(cè)試一次,這是不可能做到的,也是沒(méi)有必要的。于是我們會(huì)想,是不是可以輸入兩個(gè)符號(hào),A和B,只要執(zhí)行結(jié)果是A+B,那么程序就是正確的。這就是通過(guò)符號(hào)測(cè)試來(lái)檢查程序執(zhí)行結(jié)果是否符合程序的規(guī)格或者是預(yù)期的目的。當(dāng)然這一般只適用于簡(jiǎn)單的程序。符號(hào)測(cè)試
再來(lái)看另外一個(gè)例子,設(shè)有程序段P1:
if(x>=60)
y=“合格”;
else
y=“不合格”;對(duì)其進(jìn)行測(cè)試時(shí),如果要把x的所有取值如x=10,15,20,80.5,......等等,都輸入進(jìn)去測(cè)試一次,測(cè)試工作量還是很大的。此時(shí)可以采用符號(hào)測(cè)試,輸入符號(hào)C。符號(hào)測(cè)試
對(duì)程序段P1,輸入符號(hào)C后的執(zhí)行結(jié)果,一般是如下形式的符號(hào)表達(dá)式組: “if(C>=60)y=“合格”” “if(C
<60)y=“不合格””
通過(guò)符號(hào)測(cè)試執(zhí)行的這一結(jié)果,我們可以分析出程序有兩條執(zhí)行路徑,兩條執(zhí)行路徑分叉的依據(jù)是輸入數(shù)據(jù)是否>=60,這樣我們就可以針對(duì)這兩條路徑設(shè)計(jì)測(cè)試數(shù)據(jù),如70和50。而且,通過(guò)一定的技術(shù)手段,這樣的測(cè)試數(shù)據(jù)可以自動(dòng)生成。
符號(hào)測(cè)試中的解釋程序需要在被測(cè)試程序的判定點(diǎn)計(jì)算謂詞。例如,對(duì)程序段P1進(jìn)行符號(hào)測(cè)試時(shí)判斷輸入數(shù)據(jù)C是否>=60。很顯然,一個(gè)IF語(yǔ)句就會(huì)形成兩個(gè)執(zhí)行分支。符號(hào)測(cè)試一個(gè)判斷語(yǔ)句if……then…else的兩個(gè)分支在一般情況下需要進(jìn)行并行計(jì)算。語(yǔ)法路徑的分支形成一棵“執(zhí)行樹(shù)”,樹(shù)中每一個(gè)結(jié)點(diǎn)都是一個(gè)表示執(zhí)行到該結(jié)點(diǎn)時(shí)累加判定的謂詞,也就是包含輸入符號(hào)、判斷和運(yùn)算的表達(dá)式。符號(hào)測(cè)試
一旦解釋程序?qū)Ρ粶y(cè)源程序的每一條語(yǔ)法路徑都進(jìn)行了符號(hào)計(jì)算,就會(huì)對(duì)每一條路徑給出一組輸出,它是用輸入符號(hào),再加上遍歷這條路徑所必須滿足的條件的謂詞組,這兩者的符號(hào)形式表示的。實(shí)際上,這種輸出包含了程序功能的定義。在理想情形下,這種輸出可以自動(dòng)地與被測(cè)程序所要具備的功能,也就是它的程序規(guī)格,進(jìn)行比較。否則可用手工進(jìn)行比較。符號(hào)測(cè)試
由于語(yǔ)法路徑的數(shù)目可能很大,再加上其中有許多是不可達(dá)路徑,這時(shí)需要對(duì)執(zhí)行樹(shù)進(jìn)行修剪。但是修剪時(shí)必須特別小心,不要把“重要”路徑無(wú)意中修剪掉。另外,還有一個(gè)問(wèn)題:如果對(duì)象源程序中包含有循環(huán),而循環(huán)的結(jié)束取決于輸入的值,那么執(zhí)行樹(shù)就會(huì)是無(wú)窮的,這時(shí),必須加以人工干預(yù),進(jìn)行某種形式的動(dòng)態(tài)修剪,以保證解釋執(zhí)行是可以終止的,而不會(huì)無(wú)限進(jìn)行下去。符號(hào)測(cè)試
符號(hào)執(zhí)行更有用的一個(gè)結(jié)果是用于產(chǎn)生測(cè)試數(shù)據(jù)。符號(hào)執(zhí)行的各種語(yǔ)法路徑輸出的累加謂詞組(只要它是可解的)定義了一組等價(jià)類(lèi),每一等價(jià)類(lèi)又定義了能夠經(jīng)過(guò)該路徑的輸入應(yīng)當(dāng)滿足的條件,因此可依據(jù)這種信息來(lái)選擇測(cè)試數(shù)據(jù)。尋找好的測(cè)試數(shù)據(jù)就等于尋找語(yǔ)義(即可達(dá))路徑。
符號(hào)執(zhí)行方法還可以度量測(cè)試覆蓋程度。如果路徑謂詞的析取值為真(true),則該測(cè)試用例的集合就“覆蓋”了源程序。如果不是這樣,該析取值的取假(false),表示源程序中還有沒(méi)有被測(cè)試到的區(qū)域。符號(hào)測(cè)試本節(jié)內(nèi)容就講到這里,謝謝,再見(jiàn)!軟件質(zhì)量保證與測(cè)試
程序插樁和調(diào)試第4章白盒測(cè)試SoftwareQualityAssuranceandTesting
程序插樁技術(shù)
在軟件的動(dòng)態(tài)測(cè)試中,程序插樁是一種基本的測(cè)試手段,有著廣泛的應(yīng)用。
程序插樁是借助于往被測(cè)程序中插入操作,來(lái)實(shí)現(xiàn)測(cè)試目的一種方法,即向源程序中添加一些語(yǔ)句,來(lái)實(shí)現(xiàn)對(duì)程序語(yǔ)句的執(zhí)行、變量的變化等情況進(jìn)行監(jiān)測(cè)和檢查。
最簡(jiǎn)單的插樁是在程序中插入輸出語(yǔ)句,以監(jiān)測(cè)變量的取值或者狀態(tài)是否符合預(yù)期。斷言是一種特殊的插樁,是在程序的特定部位插入語(yǔ)句用來(lái)檢查變量的特性。1.設(shè)計(jì)插樁在程序中插樁是需要付出成本的,包括插入代碼的成本和用完之后去掉這些代碼的成本,所以程序插樁并不是隨意進(jìn)行的。對(duì)程序進(jìn)行插樁時(shí),應(yīng)當(dāng)考慮以下問(wèn)題:需要通過(guò)插樁探測(cè)哪些信息?在代碼的什么部位設(shè)置探測(cè)點(diǎn)?典型的探測(cè)點(diǎn)如:每個(gè)程序塊的第1個(gè)可執(zhí)行語(yǔ)句之前;for,do-while,dountil等循環(huán)語(yǔ)句處;if-else等條件語(yǔ)句各分支處;輸入語(yǔ)句之后;函數(shù)、過(guò)程、子程序調(diào)用語(yǔ)句之后;return語(yǔ)句之后;goto語(yǔ)句之后等。
程序插樁技術(shù)需要設(shè)置多少個(gè)探測(cè)點(diǎn)?應(yīng)當(dāng)優(yōu)選插樁方案,使得需要設(shè)置的探測(cè)點(diǎn)盡可能少。需要插入哪些語(yǔ)句?
在進(jìn)行程序插樁時(shí),除了插入輸出語(yǔ)句之外,還可以在程序中特定部位插入某些用以判斷變量特性的語(yǔ)句,程序執(zhí)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 產(chǎn)后修復(fù)培訓(xùn)管理制度
- 培訓(xùn)流程與培訓(xùn)制度
- 舞蹈培訓(xùn)機(jī)構(gòu)資產(chǎn)與財(cái)務(wù)管理制度
- 護(hù)士分層級(jí)崗位培訓(xùn)制度
- 嗩吶線上培訓(xùn)制度及流程
- 教育培訓(xùn)公司考勤制度
- 防火宣傳與培訓(xùn)制度
- 輔導(dǎo)培訓(xùn)機(jī)構(gòu)管理制度
- 宣傳培訓(xùn)黨內(nèi)法規(guī)制度
- 高考考務(wù)人員培訓(xùn)制度
- 2024年風(fēng)電、光伏項(xiàng)目前期及建設(shè)手續(xù)辦理流程匯編
- 不良資產(chǎn)合作戰(zhàn)略框架協(xié)議文本
- 2025年鹽城中考?xì)v史試卷及答案
- 2026年孝昌縣供水有限公司公開(kāi)招聘正式員工備考題庫(kù)完整參考答案詳解
- 2025年鄭州工業(yè)應(yīng)用技術(shù)學(xué)院馬克思主義基本原理概論期末考試模擬試卷
- 測(cè)繪資料檔案匯交制度
- 2026年孝昌縣供水有限公司公開(kāi)招聘正式員工備考題庫(kù)及完整答案詳解
- 2025年六年級(jí)上冊(cè)道德與法治期末測(cè)試卷附答案(完整版)
- 先進(jìn)班級(jí)介紹
- 附件二;吊斗安全計(jì)算書(shū)2.16
- 學(xué)校食堂改造工程施工組織設(shè)計(jì)方案
評(píng)論
0/150
提交評(píng)論