版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第5章白盒測(cè)試技術(shù)高等學(xué)校計(jì)算機(jī)類(lèi)系列教材軟件測(cè)試實(shí)用教程——方法與實(shí)踐01概述基本原理和特點(diǎn)但同時(shí)也可以看出,該原理圖中給出的只是程序結(jié)構(gòu)而已,并非一行行源代碼,因此,白盒測(cè)試關(guān)注的對(duì)象包括兩方面:(1)源代碼,即直接查看源代碼,查看代碼的規(guī)范性,并對(duì)照函數(shù)功能查找代碼的邏輯缺陷、內(nèi)存管理缺陷、數(shù)據(jù)定義和使用缺陷等:(2)程序結(jié)構(gòu),即通過(guò)函數(shù)調(diào)用圖、算法流程圖等反映程序設(shè)計(jì)的相關(guān)圖表,找到程序設(shè)計(jì)的缺陷,或評(píng)價(jià)程序的執(zhí)行效率,以利于程序的結(jié)構(gòu)優(yōu)化。白盒測(cè)試是另一類(lèi)重要的軟件測(cè)試方法,其原理如圖5.1所示。從該圖可以看出,原先在黑盒測(cè)試中無(wú)法看到的程序細(xì)節(jié)被揭開(kāi),白盒測(cè)試基于軟件的源代碼,已知產(chǎn)品的內(nèi)部工作過(guò)程,主要是對(duì)程序內(nèi)部結(jié)構(gòu)展開(kāi)測(cè)試,關(guān)注程序?qū)崿F(xiàn)的細(xì)節(jié)。白盒測(cè)試方法最大的優(yōu)勢(shì)在于如下兩方面:(1)針對(duì)性強(qiáng),測(cè)試效率高,通過(guò)不同的白盒覆蓋指標(biāo)有助于衡量對(duì)被測(cè)對(duì)象的測(cè)試覆蓋程度;(2)在函數(shù)級(jí)別開(kāi)始測(cè)試工作,缺陷修復(fù)的成本低。但是,由此也造成白盒測(cè)試的主要局限性在于:對(duì)測(cè)試人員的技術(shù)要求高,沒(méi)有一定編程經(jīng)驗(yàn)的人是無(wú)法做白盒測(cè)試的?;驹砗吞攸c(diǎn)適用階段
隨著被測(cè)對(duì)象粒度的變化,白盒測(cè)試方法可以用于不同的測(cè)試階段:(1)當(dāng)被測(cè)對(duì)象為函數(shù)時(shí),白盒測(cè)試方法完成的是對(duì)函數(shù)代碼和結(jié)構(gòu)的測(cè)試,主要關(guān)注的是函數(shù)源代碼的邏輯是否符合該函數(shù)的功能要求,查看源代碼中是否存在典型的編程缺陷,或從設(shè)計(jì)優(yōu)化的角度觀察源代碼結(jié)構(gòu)是否合理、是否過(guò)于復(fù)雜等,此時(shí)對(duì)應(yīng)的是單元測(cè)試階段,主要由開(kāi)發(fā)人員自己來(lái)完成測(cè)試工作;(2)當(dāng)被測(cè)對(duì)象為功能時(shí),白盒測(cè)試不再對(duì)源代碼進(jìn)行檢查,此時(shí)更多的是借鑒白盒測(cè)試方法的思想,完成對(duì)業(yè)務(wù)流程的覆蓋測(cè)試。此時(shí)對(duì)應(yīng)的是集成測(cè)試甚至系統(tǒng)測(cè)試階段,主要由測(cè)試人員來(lái)完成測(cè)試工作。測(cè)試方法的評(píng)價(jià)
白盒測(cè)試通過(guò)重點(diǎn)關(guān)注源代碼中不同類(lèi)型的結(jié)構(gòu),如判定表達(dá)式、執(zhí)行路徑、循環(huán)結(jié)構(gòu)、數(shù)據(jù)變量等,引入不同的白盒覆蓋指標(biāo),從而得到不同的白盒測(cè)試方法,這些方法的側(cè)重點(diǎn)不同,對(duì)應(yīng)源代碼結(jié)構(gòu)的覆蓋程度也不同。例如,滿足判定覆蓋意味著百分之百地滿足語(yǔ)句覆蓋,因此測(cè)試測(cè)試用例時(shí),一般可根據(jù)覆蓋指標(biāo)的強(qiáng)弱來(lái)選擇對(duì)應(yīng)的測(cè)試方法。另一方面,在第3章介紹黑盒測(cè)試方法時(shí)曾提到,盡管黑盒測(cè)試方法簡(jiǎn)單有效,但測(cè)試結(jié)果的覆蓋度不容易度量,測(cè)試的潛在風(fēng)險(xiǎn)較高,需要通過(guò)引入白盒測(cè)試覆蓋指標(biāo)來(lái)評(píng)估黑盒測(cè)試方法的測(cè)試覆蓋率,將在5.7節(jié)討論這方面內(nèi)容。02靜態(tài)白盒測(cè)試概述在軟件測(cè)試的定義中談到,軟件測(cè)試工作不僅包括對(duì)系統(tǒng)的動(dòng)態(tài)測(cè)試,還包括對(duì)系統(tǒng)的靜態(tài)檢查,這種靜態(tài)檢查通常不需要實(shí)際運(yùn)行被測(cè)軟件,而是直接對(duì)軟件形式和結(jié)構(gòu)進(jìn)行分析,內(nèi)容涵蓋對(duì)開(kāi)發(fā)文檔、測(cè)試相關(guān)文檔(如測(cè)試計(jì)劃、測(cè)試用例說(shuō)明書(shū)等)、程序界面,以及程序源代碼的評(píng)審,這種評(píng)審工作主要是對(duì)工作產(chǎn)品及開(kāi)發(fā)過(guò)程進(jìn)行管理,是軟件質(zhì)量保證的重要措施之一。本書(shū)所談的靜態(tài)白盒測(cè)試主要是指對(duì)源代碼的檢查。概述程序編寫(xiě)完后,首先是調(diào)試能通過(guò),然后用幾個(gè)關(guān)鍵數(shù)據(jù)嘗試一下,如果能正常運(yùn)行就可以了。不少開(kāi)發(fā)人員是這樣來(lái)交付代碼的。他們往往會(huì)認(rèn)為:“測(cè)試是測(cè)試人員的事情,我是負(fù)責(zé)寫(xiě)代碼的,不是負(fù)責(zé)看代碼和測(cè)試代碼的,把程序交給測(cè)試人員,讓他們?cè)O(shè)計(jì)測(cè)試用例,執(zhí)行測(cè)試就行啦,否則要測(cè)試人員干什么?再說(shuō)了,我寫(xiě)代碼都?jí)蛎Φ牧耍挠袝r(shí)間做復(fù)審?"然而,事實(shí)上,代碼的靜態(tài)檢查不僅需要做,而且將大大降低返工(Rework)的成本,從業(yè)界的數(shù)據(jù)表明,通過(guò)同行評(píng)審發(fā)現(xiàn)缺陷的返工成本是在測(cè)試階段的14.5倍,產(chǎn)品發(fā)布后發(fā)現(xiàn)缺陷的返工成本是在設(shè)計(jì)階段的45倍。且大部分靜態(tài)測(cè)試是需要開(kāi)發(fā)人員自己來(lái)完成的。靜態(tài)白盒測(cè)試的內(nèi)容主要包括代碼檢查、靜態(tài)結(jié)構(gòu)分析、代碼質(zhì)量度量等。代碼檢查1.方法分類(lèi)同行評(píng)審方法主要包括:審查(Inspection)、團(tuán)隊(duì)評(píng)審(TeamReview)、走查(WalkThrough)、結(jié)對(duì)編程(PairProgramming)、同行桌查(PeerDeskCheck)、輪查(PassAround)、特別檢查(AdhocReview)。代碼檢查主要是通過(guò)同行評(píng)審(PeerReview)方法來(lái)發(fā)現(xiàn)缺陷,即基于缺陷預(yù)防的思想,以評(píng)審會(huì)議為形式,通過(guò)多人對(duì)軟件交付物進(jìn)行檢查,從而發(fā)現(xiàn)缺陷或獲得改進(jìn)優(yōu)化的機(jī)會(huì)。雖然同行評(píng)審需要大量投入時(shí)間和人力資源,但同時(shí)也將帶來(lái)豐厚的額外回報(bào)。代碼檢查表5.1從評(píng)審目的、評(píng)審形式、評(píng)審過(guò)程等方面對(duì)這些評(píng)審方法進(jìn)行了比較。表中的“持續(xù)”是指評(píng)審過(guò)程不限于一次會(huì)議過(guò)程(通常在2小時(shí)以內(nèi)),而是從產(chǎn)品模塊開(kāi)發(fā)開(kāi)始一直持續(xù)到開(kāi)發(fā)完成為止;“可能”是指不確定是否需要舉行會(huì)議,可在會(huì)議中由參與人員同時(shí)進(jìn)行單獨(dú)評(píng)審并匯總,也可由參與人員分別抽時(shí)間單獨(dú)評(píng)審后由組織者匯總意見(jiàn);“修復(fù)”是指評(píng)審會(huì)議結(jié)束后作者是否需對(duì)發(fā)現(xiàn)的缺陷進(jìn)行修復(fù);“確認(rèn)”是指對(duì)缺陷修復(fù)的結(jié)果是否需要指派專(zhuān)人進(jìn)行確認(rèn)修復(fù)。從方法的比較可以看出,審查、團(tuán)隊(duì)評(píng)審、走查是使用最廣泛的同行評(píng)審方法。2.評(píng)審流程同行評(píng)審的一般流程都基本相似,完整的同行評(píng)審流程如圖5.2所示。該評(píng)審過(guò)程所涉及的角色包括:①作者:被評(píng)審工作產(chǎn)品的提供者;②評(píng)審主持人:也稱(chēng)組織者、協(xié)調(diào)員;③評(píng)審員:對(duì)工作產(chǎn)品進(jìn)行評(píng)審的人員,有時(shí),評(píng)審員需要在評(píng)審會(huì)上充當(dāng)測(cè)試人員的角色,負(fù)責(zé)設(shè)計(jì)測(cè)試用例,但他本人并不一定是測(cè)試工程師;④講解員:對(duì)被評(píng)審工作產(chǎn)品進(jìn)行講解的人員;⑤記錄員:也稱(chēng)秘書(shū),記錄缺陷和決議的人員。代碼檢查1.基于模塊的功能測(cè)試就系統(tǒng)功能來(lái)說(shuō),可按照業(yè)務(wù)流程,分為不同的功能模塊進(jìn)行測(cè)試,需測(cè)試的功能包括:(1)系統(tǒng)登錄;(2)文件導(dǎo)入(包括照片文件和信息文件的導(dǎo)入);(3)文件校驗(yàn)(包括照片文件和信息文件的校驗(yàn)及結(jié)果查看);(4)文件導(dǎo)出(包括照片文件和信息文件的導(dǎo)出);(5)其他功能(包括版權(quán)聲明、幫助等)。下面以文件校驗(yàn)為例,分析功能測(cè)試的設(shè)計(jì),其他功能模塊的測(cè)試可參照此思想自行設(shè)計(jì)。代碼檢查代碼檢查(1)計(jì)劃評(píng)審會(huì)議一般地,設(shè)計(jì)部門(mén)應(yīng)在評(píng)審前3天向項(xiàng)目管理部提交《設(shè)計(jì)和開(kāi)發(fā)評(píng)審申請(qǐng)表》,經(jīng)批準(zhǔn)后才進(jìn)入計(jì)劃評(píng)審會(huì)議階段。(2)召開(kāi)評(píng)審預(yù)備會(huì)評(píng)審人員向評(píng)審主持人提出申請(qǐng),由主持人決定是否需要召開(kāi)評(píng)審預(yù)備會(huì),為了確保評(píng)審質(zhì)量,就需要先召開(kāi)一個(gè)2小時(shí)以內(nèi)的評(píng)審預(yù)備會(huì),目的是確保參加正式評(píng)審會(huì)議的人員能清楚地了解評(píng)審流程和評(píng)審目的,正確理解自己的責(zé)任,且評(píng)審員得到的評(píng)審材料正確無(wú)誤。(3)準(zhǔn)備評(píng)審會(huì)議無(wú)論是否召開(kāi)評(píng)審預(yù)備會(huì),一旦評(píng)審員拿到了評(píng)審材料包,就開(kāi)始為正式評(píng)審會(huì)做準(zhǔn)備。(4)召開(kāi)正式評(píng)審會(huì)議根據(jù)評(píng)審會(huì)議日程安排,到達(dá)會(huì)議時(shí)間時(shí),由主持人組織所有相關(guān)人員召開(kāi)評(píng)審會(huì)議。代碼檢查(5)召開(kāi)第3小時(shí)會(huì)議當(dāng)評(píng)審會(huì)議中發(fā)現(xiàn)較多未達(dá)成共識(shí)的缺陷,或需進(jìn)一步針對(duì)確認(rèn)的缺陷討論解決方案時(shí),主持人將召開(kāi)第3小時(shí)會(huì)議。(6)修復(fù)缺陷無(wú)論是否召開(kāi)第3小時(shí)會(huì)議,當(dāng)所有缺陷均達(dá)成共識(shí)后,就進(jìn)入缺陷修復(fù)階段,主要涉及的角色只有作者,其任務(wù)是針對(duì)提交的審閱情況記錄表,對(duì)每個(gè)缺陷進(jìn)行定位、調(diào)試和修復(fù),然后提交修復(fù)后的工作產(chǎn)品,同時(shí)更新審閱情況記錄表,在表格中簡(jiǎn)要說(shuō)明對(duì)每個(gè)缺陷的修復(fù)過(guò)程。(7)確認(rèn)修復(fù)作者修復(fù)缺陷后,評(píng)審組還需要再次確認(rèn)所有缺陷得到了正確的修復(fù)。代碼檢查同行評(píng)審?fù)ǔS腥缦?類(lèi)結(jié)果:(1)正常:評(píng)審專(zhuān)家做好了評(píng)審準(zhǔn)備,評(píng)審會(huì)議順利進(jìn)行,達(dá)到了預(yù)期目的,達(dá)成明確的評(píng)審結(jié)論,不需要再次評(píng)審。(2)延期:30%以上的評(píng)審專(zhuān)家并未做好評(píng)審準(zhǔn)備,會(huì)議無(wú)法正常進(jìn)行,需要重新安排評(píng)審日程。(3)取消:初審階段就發(fā)現(xiàn)工作產(chǎn)品中存在太多問(wèn)題,需要作者進(jìn)行修復(fù),然后再進(jìn)行第二次同行評(píng)審。代碼檢查同行評(píng)審各個(gè)階段中,每個(gè)角色都有一些主要注意的事項(xiàng),列舉如下:(1)計(jì)劃和準(zhǔn)備階段的問(wèn)題管理層的問(wèn)題及對(duì)策如下:①不重視。②無(wú)計(jì)劃。③無(wú)培訓(xùn)。主持人的問(wèn)題及對(duì)策如下:①評(píng)審員不合理,導(dǎo)致遺漏重要的需求或降低評(píng)審效率。②評(píng)審員搭配不合理。對(duì)策:評(píng)審員應(yīng)有明確分工。③讓管理者參與評(píng)審,導(dǎo)致作者對(duì)評(píng)審感到緊張和局促。④制訂的日程不合理,未留出充裕時(shí)間給評(píng)審員進(jìn)行會(huì)前準(zhǔn)備。⑤無(wú)檢查表,難以確保評(píng)審內(nèi)容的完整性。(2)評(píng)審會(huì)進(jìn)行階段的問(wèn)題主持人的問(wèn)題及對(duì)策是:①過(guò)分注重會(huì)議時(shí)間,不重視產(chǎn)品質(zhì)量。為了保證評(píng)審進(jìn)度而一味擠壓評(píng)審時(shí)間,特別是工作產(chǎn)品的預(yù)審時(shí)間,使之無(wú)法得到充分的評(píng)審。對(duì)策:做好計(jì)劃,若需評(píng)審的內(nèi)容太多,則分多次進(jìn)行評(píng)審。②不控制進(jìn)度,針對(duì)某個(gè)技術(shù)問(wèn)題討論時(shí)間過(guò)長(zhǎng),導(dǎo)致會(huì)議拖沓,效率低。對(duì)策:應(yīng)將會(huì)議時(shí)間控制在90~120分鐘之間,若在準(zhǔn)備階段發(fā)現(xiàn)要處理的問(wèn)題較多,應(yīng)分為多次評(píng)審會(huì),每次會(huì)議處理幾個(gè)模塊。代碼檢查評(píng)審員的問(wèn)題及對(duì)策如下:①無(wú)評(píng)審重點(diǎn),易遺漏關(guān)鍵缺陷。對(duì)策:應(yīng)在準(zhǔn)備階段就給出明確的評(píng)審重點(diǎn),確保發(fā)現(xiàn)最嚴(yán)重的缺陷,不要太關(guān)注細(xì)枝末節(jié)。②不考慮數(shù)據(jù)之間、業(yè)務(wù)之間及系統(tǒng)之間的相關(guān)性,評(píng)審不全面。對(duì)策:應(yīng)充分對(duì)照已有成果,考慮工作產(chǎn)品在數(shù)據(jù)、接口、業(yè)務(wù)等方面之間的關(guān)聯(lián)。③過(guò)分依賴檢查表,使評(píng)審時(shí)關(guān)注的問(wèn)題較為雷同,容易忽略其他環(huán)節(jié)。對(duì)策:除了對(duì)照檢查表,還應(yīng)從其他方面試圖發(fā)現(xiàn)工作產(chǎn)品中的缺陷,提高工作產(chǎn)品的抽樣率。④在會(huì)議中措辭刻薄,進(jìn)行人身攻擊,使作者對(duì)評(píng)審產(chǎn)生強(qiáng)烈的抵觸。對(duì)策:對(duì)事不對(duì)人,應(yīng)注意發(fā)言的措辭,指出工作產(chǎn)品中的具體問(wèn)題即可,不應(yīng)對(duì)作者進(jìn)行評(píng)價(jià),不要將評(píng)審變成評(píng)價(jià)。且主持人應(yīng)提前將評(píng)審員的反饋發(fā)給作者,使作者對(duì)評(píng)審有十足把握和信心。代碼檢查⑤不重視評(píng)審會(huì),不提前檢查工作產(chǎn)品,僅在會(huì)議現(xiàn)場(chǎng)查看,難以發(fā)現(xiàn)關(guān)鍵問(wèn)題。對(duì)策:應(yīng)認(rèn)真對(duì)待評(píng)審,提前對(duì)工作產(chǎn)品進(jìn)行嚴(yán)格檢查。⑥過(guò)多討論缺陷的修復(fù),會(huì)議效率不高。對(duì)策:評(píng)審會(huì)議重點(diǎn)是發(fā)現(xiàn)問(wèn)題,不是解決問(wèn)題。會(huì)議中發(fā)現(xiàn)的缺陷數(shù)應(yīng)為會(huì)前發(fā)現(xiàn)缺陷數(shù)的2倍以上。⑦擔(dān)心得罪人,而拒絕評(píng)審他人的工作。對(duì)策:主持人應(yīng)加強(qiáng)評(píng)審員與作者的溝通,不將評(píng)審雙方變成敵對(duì)雙方。⑧現(xiàn)場(chǎng)修改缺陷。評(píng)審會(huì)的焦點(diǎn)在于發(fā)現(xiàn)缺陷,而非修復(fù)缺陷,針對(duì)發(fā)現(xiàn)的缺陷應(yīng)在會(huì)后自行討論如何修改,以免浪費(fèi)與會(huì)人員的時(shí)間。⑨評(píng)審會(huì)變成個(gè)人批斗會(huì)。評(píng)審員所提建議應(yīng)針對(duì)程序,不應(yīng)針對(duì)程序員。代碼檢查⑩測(cè)試用例太多,且計(jì)算復(fù)雜。需要提前設(shè)計(jì)測(cè)試用例時(shí),這些用例應(yīng)確保結(jié)構(gòu)簡(jiǎn)單,數(shù)量不多,因?yàn)槿四X執(zhí)行程序的速度遠(yuǎn)遠(yuǎn)不如計(jì)算機(jī)執(zhí)行的速度。測(cè)試用例本身并不起關(guān)鍵作用,僅作為懷疑程序邏輯和計(jì)算錯(cuò)誤的參照。在多數(shù)代碼走查中,多數(shù)缺陷是在向程序員提問(wèn)的過(guò)程中發(fā)現(xiàn)的,而非測(cè)試用例本身發(fā)現(xiàn)的。代碼檢查(3)評(píng)審會(huì)后階段的問(wèn)題主持人的問(wèn)題和對(duì)策如下:①對(duì)發(fā)現(xiàn)的缺陷缺乏有效跟蹤,導(dǎo)致發(fā)現(xiàn)的缺陷得不到及時(shí)修復(fù)。對(duì)策:制訂評(píng)審進(jìn)入和退出標(biāo)準(zhǔn),并在評(píng)審中嚴(yán)格遵循該標(biāo)準(zhǔn)。②評(píng)審中僅僅是收集數(shù)據(jù),卻不注重上報(bào)和改進(jìn)。對(duì)策:應(yīng)將度量數(shù)據(jù)存儲(chǔ)到組織度量庫(kù),并提交給專(zhuān)人進(jìn)行統(tǒng)計(jì)和分析,然后上報(bào)給上級(jí)主管,讓管理層決定哪些數(shù)據(jù)重要,并用于指導(dǎo)后續(xù)的度量數(shù)據(jù)收集和評(píng)審效果監(jiān)控。Myers指出,代碼走查和審查通??梢杂行У卣页?0%~70%的邏輯設(shè)計(jì)和編碼缺陷(該百分率是針對(duì)已知缺陷而言)。但同行評(píng)審也存在一些局限性:①會(huì)議耗費(fèi)了大量的時(shí)間,這類(lèi)會(huì)議若次數(shù)太多,將影響開(kāi)發(fā)進(jìn)度。②需要與會(huì)者具有豐富的知識(shí)和經(jīng)驗(yàn)。靜態(tài)結(jié)構(gòu)分析1.基本原理程序的結(jié)構(gòu)形式是白盒測(cè)試的主要依據(jù)和對(duì)象,研究表明,程序員將38%的時(shí)間都花費(fèi)在對(duì)軟件系統(tǒng)的理解。編寫(xiě)代碼時(shí),源代碼通常是以純文本方式呈現(xiàn),文字間的唯一區(qū)別僅在于字體和文字的顏色,然而,眾多條件判定和循環(huán)結(jié)構(gòu)導(dǎo)致程序結(jié)構(gòu)復(fù)雜,若程序員的代碼編寫(xiě)規(guī)范性差的話,代碼可讀性更差,難以閱讀和理解。靜態(tài)結(jié)構(gòu)分析通過(guò)引入多種形式的圖表(如函數(shù)調(diào)用關(guān)系圖、模塊控制流圖等),幫助人們快速了解程序設(shè)計(jì)和結(jié)構(gòu),更好地理解源代碼,以及找到程序設(shè)計(jì)缺陷和代碼優(yōu)化的方向。下面選擇最常見(jiàn)的兩類(lèi)圖進(jìn)行討論。靜態(tài)結(jié)構(gòu)分析2.函數(shù)調(diào)用關(guān)系圖函數(shù)調(diào)用關(guān)系圖將被測(cè)系統(tǒng)中各函數(shù)間的調(diào)用關(guān)系通過(guò)樹(shù)形方式進(jìn)行展現(xiàn),測(cè)試重點(diǎn)為:(1)函數(shù)之間的調(diào)用關(guān)系是否符合要求;(2)是否存在遞歸調(diào)用,遞歸調(diào)用一般對(duì)內(nèi)存的消耗較大,長(zhǎng)時(shí)間運(yùn)行很容易導(dǎo)致崩潰,對(duì)于不必要的遞歸調(diào)用可盡量改為循環(huán)結(jié)構(gòu);(3)函數(shù)調(diào)用層次是否太深,過(guò)深的調(diào)用層次容易導(dǎo)致數(shù)據(jù)和信息傳遞的錯(cuò)誤或遺漏,并增大集成測(cè)試的負(fù)擔(dān),可通過(guò)適當(dāng)增加單個(gè)函數(shù)的復(fù)雜度來(lái)加以改進(jìn);(4)是否存在孤立的函數(shù),孤立函數(shù)意味著永遠(yuǎn)執(zhí)行不到的場(chǎng)景或路徑,代表編碼或設(shè)計(jì)的不合理。靜態(tài)結(jié)構(gòu)分析通過(guò)查看函數(shù)調(diào)用圖不僅能發(fā)現(xiàn)明確的缺陷,還有利于確定測(cè)試重點(diǎn),一般原則包括:(1)根節(jié)點(diǎn)是需要優(yōu)先測(cè)試的,它不僅涉及的接口較多,而且起到主要的控制執(zhí)行作用,其執(zhí)行正確性至關(guān)重要;(2)葉子節(jié)點(diǎn)是需要優(yōu)先測(cè)試的,它可能包含核心算法或較為復(fù)雜的算法,整個(gè)輸出結(jié)果的正確性多依賴于這類(lèi)節(jié)點(diǎn)的輸出正確性;(3)接口數(shù)量多的節(jié)點(diǎn)是需要優(yōu)先測(cè)試的,被頻繁調(diào)用的節(jié)點(diǎn)內(nèi)部或接口存在缺陷,將導(dǎo)致被其調(diào)用的所有節(jié)點(diǎn)的錯(cuò)誤,而調(diào)用多個(gè)其他模塊的節(jié)點(diǎn)若存在缺陷,則需要在眾多被調(diào)用模塊中查找并定位缺陷,由此造成的測(cè)試工作量都是很大的。靜態(tài)結(jié)構(gòu)分析3.函數(shù)控制流圖函數(shù)調(diào)用關(guān)系圖是對(duì)多個(gè)函數(shù)之間的關(guān)系進(jìn)行描述,是從外部查看函數(shù);函數(shù)控制流圖正好與此相反,它是從函數(shù)內(nèi)部進(jìn)行考察。函數(shù)的控制流圖是由節(jié)點(diǎn)和邊組成的有向圖,其中,節(jié)點(diǎn)表示一條或多條語(yǔ)句,邊代表節(jié)點(diǎn)之間的控制走向,即語(yǔ)句的執(zhí)行。函數(shù)的控制流圖可以直觀地反映函數(shù)的內(nèi)部邏輯結(jié)構(gòu),展示程序中明顯的缺陷,并揭示程序是否隱含缺陷的風(fēng)險(xiǎn)情況。(1)是否存在多出口情況,多個(gè)程序出口意味著程序不是從一個(gè)統(tǒng)一的出口退出該變量空間,如果涉及指針變量的賦值、空間分配這類(lèi)情況,多出口的程序最容易導(dǎo)致空指針、內(nèi)存未釋放這類(lèi)缺陷,同時(shí),每增加一個(gè)程序出口就意味著代碼的環(huán)復(fù)雜度增加1。因此,多出口一般會(huì)同時(shí)帶來(lái)高環(huán)復(fù)雜度的問(wèn)題。有關(guān)環(huán)復(fù)雜度的定義和計(jì)算請(qǐng)閱讀5.4.1節(jié)的相關(guān)內(nèi)容。靜態(tài)結(jié)構(gòu)分析(2)是否存在孤立的語(yǔ)句,孤立的語(yǔ)句意味著永遠(yuǎn)執(zhí)行不到的路徑,必然代表著一個(gè)明顯的編碼缺陷。(3)環(huán)復(fù)雜度是否太大(一般地,環(huán)復(fù)雜度不應(yīng)大于10),環(huán)復(fù)雜度太高可能是由多種原因造成的,例如,程序出口太多,判定節(jié)點(diǎn)數(shù)目太多,未采用結(jié)構(gòu)化程序設(shè)計(jì)等,過(guò)高的環(huán)復(fù)雜度導(dǎo)致路徑數(shù)量的激增,容易引入缺陷,并造成測(cè)試難度和測(cè)試工作量的增大。(4)是否存在非結(jié)構(gòu)化的設(shè)計(jì),非結(jié)構(gòu)化的設(shè)計(jì)通常是由goto、break、continue等語(yǔ)句導(dǎo)致,表現(xiàn)形式為程序執(zhí)行強(qiáng)行跳入某個(gè)判定或循環(huán)結(jié)構(gòu),或者從判定或循環(huán)結(jié)構(gòu)中強(qiáng)行跳出,造成的后果是導(dǎo)致程序的非正常執(zhí)行結(jié)構(gòu),程序可讀性差,同時(shí)增加測(cè)試的難度和工作量,不僅容易導(dǎo)致缺陷而且在測(cè)試中不易發(fā)現(xiàn),形成測(cè)試的漏洞。有關(guān)非結(jié)構(gòu)化設(shè)計(jì)的詳細(xì)內(nèi)容請(qǐng)閱讀5.4.1節(jié)的相關(guān)內(nèi)容。代碼質(zhì)量度量1.軟件質(zhì)量模型為了更好地理解、預(yù)測(cè)和評(píng)價(jià)軟件的質(zhì)量,人們建立了各種軟件質(zhì)量模型來(lái)描述影響軟件質(zhì)量的特性,在軟件整個(gè)生命周期的各個(gè)階段對(duì)軟件質(zhì)量進(jìn)行評(píng)估,ISO9126質(zhì)量模型是最著名的模型之一。1991年由國(guó)際標(biāo)準(zhǔn)化組織(ISO/IECJTC1)頒布ISO/IEC9126-1991(GB/T16260—1996)標(biāo)準(zhǔn),即《軟件產(chǎn)品評(píng)價(jià)-質(zhì)量特性及其使用指南》,幾經(jīng)修正最新版本為ISO/IEC9126:2001。代碼質(zhì)量度量該標(biāo)準(zhǔn)規(guī)定了軟件產(chǎn)品質(zhì)量的3個(gè)質(zhì)量模型,即外部質(zhì)量模型、內(nèi)部質(zhì)量模型和使用中質(zhì)量模型,其中外部和內(nèi)部質(zhì)量模型由3層組成(見(jiàn)圖5.3):第一層:即高層(TopLevel),為質(zhì)量特性,也是軟件質(zhì)量需求評(píng)價(jià)準(zhǔn)則(SQRC),共6個(gè);第二層:即中層(MidLevel),為質(zhì)量子特性,也是軟件質(zhì)量設(shè)計(jì)評(píng)價(jià)準(zhǔn)則(SQDC),共推薦了27個(gè);第三層:即低層(LowLevel),為質(zhì)量度量,也是軟件質(zhì)量度量評(píng)價(jià)準(zhǔn)則(SQMC)。關(guān)于質(zhì)量度量,并未給出推薦內(nèi)容,而是由使用單位自行制訂。代碼質(zhì)量度量代碼質(zhì)量度量2.代碼質(zhì)量度量模型
(1)代碼質(zhì)量度量模型的定義類(lèi)似地,可構(gòu)建三層代碼質(zhì)量度量模型,見(jiàn)圖5.4。該度量模型共分三層,從上到下依次為:①質(zhì)量因素(Factors):對(duì)應(yīng)ISO9126質(zhì)量模型的質(zhì)量特性。②質(zhì)量標(biāo)準(zhǔn)(Criteria):對(duì)應(yīng)ISO9126質(zhì)量模型的子特性。不同質(zhì)量因素由多個(gè)質(zhì)量標(biāo)準(zhǔn)組成。③質(zhì)量度量元(Metrics):規(guī)范軟件的行為屬性。每個(gè)質(zhì)量標(biāo)準(zhǔn)由多個(gè)質(zhì)量度量元組成。質(zhì)量因素和質(zhì)量標(biāo)準(zhǔn)的規(guī)定見(jiàn)圖5.3,該代碼質(zhì)量度量模型的關(guān)鍵在于定義、量化和計(jì)算各個(gè)質(zhì)量度量元。代碼質(zhì)量度量代碼質(zhì)量度量(2)質(zhì)量度量元的定義和計(jì)算質(zhì)量度量元是量化的行為規(guī)范,通過(guò)對(duì)每個(gè)度量元設(shè)定上、下限,可將其轉(zhuǎn)為數(shù)字。當(dāng)被測(cè)代碼關(guān)于該度量元的實(shí)際取值落在規(guī)定的上、下限范圍內(nèi)時(shí),就認(rèn)為被測(cè)代碼關(guān)于該項(xiàng)度量元是合格的,并賦值為“1”,否則賦值為“0”。代碼質(zhì)量度量(3)質(zhì)量標(biāo)準(zhǔn)的計(jì)算質(zhì)量標(biāo)準(zhǔn)由若干質(zhì)量度量元綜合進(jìn)行評(píng)價(jià),必須建立度量元與質(zhì)量標(biāo)準(zhǔn)的計(jì)算公式,才能對(duì)質(zhì)量標(biāo)準(zhǔn)進(jìn)行量化。一個(gè)簡(jiǎn)單而常見(jiàn)的方式是將質(zhì)量標(biāo)準(zhǔn)定義為度量元的加權(quán)和。例如,軟件可分析性質(zhì)量標(biāo)準(zhǔn)的質(zhì)量度量元為AVGS、COMF、STMT、VG,權(quán)重均為1,由此得到可分析性質(zhì)量標(biāo)準(zhǔn)的計(jì)算方法如下:Analyzability=1×AVGS+1×COMF+1×STMT+1×VG=AVGS+COMF+STMT+VG根據(jù)質(zhì)量標(biāo)準(zhǔn)的取值還可進(jìn)行質(zhì)量等級(jí)劃分,如表5.3所示。該表中前3個(gè)等級(jí)表示可以接受,最后一個(gè)等級(jí)表示不可接受。其他質(zhì)量標(biāo)準(zhǔn)的質(zhì)量等級(jí)劃分可參照該表。代碼質(zhì)量度量(4)質(zhì)量因素的計(jì)算質(zhì)量因素是由若干質(zhì)量標(biāo)準(zhǔn)進(jìn)行綜合評(píng)價(jià),也可通過(guò)該質(zhì)量因素對(duì)應(yīng)的質(zhì)量標(biāo)準(zhǔn)的加權(quán)和量化表示,并以之劃分質(zhì)量等級(jí)。例如,軟件可維護(hù)性質(zhì)量因素的質(zhì)量標(biāo)準(zhǔn)見(jiàn)表5.4,設(shè)每個(gè)質(zhì)量標(biāo)準(zhǔn)的權(quán)重均為1,則可維護(hù)性的計(jì)算方式如下:Maintainability=Analyzability+Changeability+Stability+Testability代碼質(zhì)量度量由此得到該質(zhì)量因素的等級(jí)劃分如表5.5所示。通過(guò)將代碼質(zhì)量度量模型應(yīng)用于被測(cè)程序,得到量化的數(shù)據(jù),就可以對(duì)軟件質(zhì)量進(jìn)行評(píng)估了。通常情況下,質(zhì)量?jī)?yōu)秀的模塊與質(zhì)量良好模塊的總數(shù)占全部模塊的80%以上,則可認(rèn)為被測(cè)軟件系統(tǒng)是可接受的。代碼質(zhì)量度量3.代碼質(zhì)量的自動(dòng)度量代碼質(zhì)量可通過(guò)測(cè)試工具來(lái)完成自動(dòng)度量,以直觀的圖表形式呈現(xiàn),既利于后續(xù)的分析,又節(jié)省了人力、加快了工作進(jìn)度。Logiscope就是一個(gè)典型的靜態(tài)測(cè)試工具,該工具根據(jù)圖5.4所示的代碼質(zhì)量度量模型來(lái)評(píng)價(jià)被測(cè)代碼的質(zhì)量。其基本工作原理和步驟包括:(1)劃分作用域通過(guò)劃分作用域?qū)崿F(xiàn)分階段的代碼質(zhì)量分析和顯示。不同作用域之間彼此獨(dú)立。(2)計(jì)算相應(yīng)質(zhì)量因素根據(jù)代碼質(zhì)量度量模型自動(dòng)計(jì)算相應(yīng)質(zhì)量因素。代碼質(zhì)量度量(3)以圖表方式進(jìn)行顯示利用Audit工具實(shí)現(xiàn)軟件質(zhì)量詳細(xì)分析結(jié)果的圖形表示,包括:①以函數(shù)調(diào)用圖顯示過(guò)程和函數(shù)之間的關(guān)系,來(lái)評(píng)審應(yīng)用系統(tǒng)的體系結(jié)構(gòu)設(shè)計(jì);②以模塊控制流圖顯示算法的邏輯路徑,來(lái)表示過(guò)程和函數(shù)的邏輯結(jié)構(gòu);③以Kiviat圖和餅圖展示函數(shù)和系統(tǒng)的質(zhì)量度量元檢測(cè)結(jié)果,即顯示被測(cè)代碼的質(zhì)量等級(jí)與所選擇的質(zhì)量參考模型之間的一致性。捉蟲(chóng)實(shí)踐1:自動(dòng)柜員機(jī)問(wèn)題的函數(shù)調(diào)用圖分析1.函數(shù)調(diào)用圖自動(dòng)柜員機(jī)問(wèn)題仍為3.6.3節(jié)的自動(dòng)柜員機(jī)案例,該系統(tǒng)的函數(shù)調(diào)用關(guān)系圖如圖5.6所示。捉蟲(chóng)實(shí)踐1:自動(dòng)柜員機(jī)問(wèn)題的函數(shù)調(diào)用圖分析2.測(cè)試分析從該圖的整體調(diào)用層次來(lái)看,具有4層調(diào)用結(jié)構(gòu),因此調(diào)用層次并不深。同時(shí),該函數(shù)不存在遞歸調(diào)用和孤立函數(shù)的情況。從單個(gè)節(jié)點(diǎn)來(lái)看測(cè)試重點(diǎn),包括如下情況:(1)節(jié)點(diǎn)1為調(diào)用圖的根節(jié)點(diǎn),屬于上層控制模塊,其本身所處的位置非常重要,它關(guān)系到能否正確展現(xiàn)該子系統(tǒng)或系統(tǒng)的全貌,且該節(jié)點(diǎn)調(diào)用的下層模塊多達(dá)9個(gè),使得其接口的正確性驗(yàn)證變得非常重要。因此,節(jié)點(diǎn)1的函數(shù)應(yīng)優(yōu)先測(cè)試,以確保上層控制的正確。(2)節(jié)點(diǎn)14、15為調(diào)用圖的葉子節(jié)點(diǎn),屬于底層模塊,且這兩個(gè)節(jié)點(diǎn)分別被多達(dá)7個(gè)和6個(gè)上層節(jié)點(diǎn)所調(diào)用,這種被頻繁調(diào)用的函數(shù)也應(yīng)確保接口的正確性。因此,節(jié)點(diǎn)14、15的函數(shù)也應(yīng)優(yōu)先測(cè)試,并重點(diǎn)測(cè)試。(3)節(jié)點(diǎn)26、27雖然是中間節(jié)點(diǎn),但均具有多個(gè)接口,如節(jié)點(diǎn)26包含1個(gè)上層調(diào)用接口和6個(gè)下層調(diào)用接口,節(jié)點(diǎn)27則包含1個(gè)上層調(diào)用接口和5個(gè)下層調(diào)用接口,這類(lèi)接口數(shù)量較多的節(jié)點(diǎn)將具有隱含缺陷的高風(fēng)險(xiǎn),因此也應(yīng)考慮優(yōu)先展開(kāi)測(cè)試。捉蟲(chóng)實(shí)踐2:第二日問(wèn)題的控制流圖分析1.代碼說(shuō)明computeNextDate()是通過(guò)一個(gè)函數(shù)實(shí)現(xiàn)第二日問(wèn)題的程序,該函數(shù)僅接受有效輸入,即凡是不存在的日期均不在本函數(shù)的輸入范圍內(nèi),所有無(wú)效輸入是通過(guò)其他函數(shù)處理的,在此不再列出。2.函數(shù)控制流圖computeNextDate函數(shù)的控制流圖如圖5.7所示,圖中各類(lèi)符號(hào)遵循Logiscope的規(guī)定(見(jiàn)圖5.8)。捉蟲(chóng)實(shí)踐2:第二日問(wèn)題的控制流圖分析捉蟲(chóng)實(shí)踐1:自動(dòng)柜員機(jī)問(wèn)題的函數(shù)調(diào)用圖分析3.測(cè)試分析從computeNextDate函數(shù)的控制流圖可以看出,它是一個(gè)單入口和單出口的程序,且不存在孤立的語(yǔ)句,該函數(shù)的環(huán)復(fù)雜度為6,對(duì)應(yīng)函數(shù)結(jié)構(gòu)較為簡(jiǎn)單。就控制流圖來(lái)說(shuō),該函數(shù)的結(jié)構(gòu)設(shè)計(jì)是符合要求的。當(dāng)然,并非所有的函數(shù)結(jié)構(gòu)都是這樣簡(jiǎn)單的,圖5.9給出了另一個(gè)實(shí)際函數(shù)的控制流圖,其中圖5.9(a)是原始的控制流圖,圖5.9(b)對(duì)原始控制流圖中的部分程序結(jié)構(gòu)進(jìn)行了解釋說(shuō)明。捉蟲(chóng)實(shí)踐1:自動(dòng)柜員機(jī)問(wèn)題的函數(shù)調(diào)用圖分析捉蟲(chóng)實(shí)踐1:自動(dòng)柜員機(jī)問(wèn)題的函數(shù)調(diào)用圖分析4.靜態(tài)結(jié)構(gòu)分析的局限無(wú)論是函數(shù)調(diào)用圖,還是控制流圖,都是從圖論的角度,在遠(yuǎn)離代碼的條件下對(duì)程序進(jìn)行分析,在函數(shù)調(diào)用圖中無(wú)法看出函數(shù)調(diào)用接口的復(fù)雜度,如包含多少個(gè)參數(shù)、參數(shù)數(shù)據(jù)類(lèi)型是否復(fù)雜,類(lèi)似地,控制流圖中無(wú)法看出每個(gè)判定節(jié)點(diǎn)的復(fù)雜度和循環(huán)結(jié)構(gòu)的復(fù)雜度,如判定表達(dá)式包含多少個(gè)簡(jiǎn)單判定條件,循環(huán)次數(shù)如何控制,判定節(jié)點(diǎn)之間是否存在相互關(guān)聯(lián)等。為此,需要通過(guò)源代碼評(píng)審、后續(xù)的動(dòng)態(tài)白盒測(cè)試來(lái)進(jìn)一步對(duì)源代碼進(jìn)行測(cè)試覆蓋,以期找到更多潛伏的軟件缺陷。后面將討論如何對(duì)源代碼進(jìn)行動(dòng)態(tài)白盒測(cè)試。靜態(tài)白盒測(cè)試小結(jié)靜態(tài)白盒測(cè)試是白盒測(cè)試的重要組成部分,它不需要執(zhí)行程序,而是通過(guò)對(duì)比標(biāo)準(zhǔn)和規(guī)范,檢查程序邏輯,直接定位缺陷,從而加快測(cè)試進(jìn)度,降低測(cè)試工作量,省去了動(dòng)態(tài)測(cè)試所需的測(cè)試用例設(shè)計(jì)、執(zhí)行和結(jié)果檢查的工作,使用效率很高。靜態(tài)白盒測(cè)試還基于缺陷預(yù)防的思想,通過(guò)檢查程序的各種圖表定位那些具有高風(fēng)險(xiǎn)的程序代碼,并承擔(dān)部分代碼質(zhì)量度量的工作。從質(zhì)量保證的觀點(diǎn)來(lái)看,靜態(tài)白盒測(cè)試可以更好地確保所提交的軟件系統(tǒng)的質(zhì)量。靜態(tài)白盒測(cè)試的主要內(nèi)容包括對(duì)源代碼的同行評(píng)審、對(duì)程序結(jié)構(gòu)的靜態(tài)結(jié)構(gòu)分析,以及對(duì)代碼質(zhì)量的度量。同行評(píng)審主要包括桌面檢查、走查、審查、團(tuán)隊(duì)評(píng)審等多種形式,多以定期或不定期的會(huì)議方式進(jìn)行,目的是通過(guò)程序員、測(cè)試專(zhuān)家等多人對(duì)源代碼進(jìn)行檢查,從而發(fā)現(xiàn)缺陷或獲得改進(jìn)優(yōu)化的機(jī)會(huì)。靜態(tài)白盒測(cè)試小結(jié)靜態(tài)結(jié)構(gòu)分析主要是利用各種圖表,如函數(shù)調(diào)用圖、模塊控制流圖等形式,從函數(shù)內(nèi)部流程、外部接口等方面直觀展示系統(tǒng)存在的明顯缺陷和可能存在的潛在缺陷,并以之確定設(shè)計(jì)優(yōu)化的方向,提高代碼的質(zhì)量。代碼質(zhì)量度量則通常是利用測(cè)試工具,基于三層代碼質(zhì)量度量模型對(duì)代碼質(zhì)量進(jìn)行分層量化和等級(jí)劃分,綜合評(píng)價(jià)軟件源代碼的質(zhì)量,便于支持作為后續(xù)開(kāi)發(fā)的改進(jìn)決策。注意:評(píng)審并非僅針對(duì)源代碼,這種靜態(tài)檢查工作適用于從需求階段到驗(yàn)收測(cè)試階段的所有階段工作產(chǎn)品,當(dāng)然,對(duì)于不同類(lèi)型的工作產(chǎn)品可選擇最適合的評(píng)審形式。另外,在代碼評(píng)審中往往會(huì)用到缺陷檢查單,它不但是針對(duì)代碼的檢查清單,而且包含基于項(xiàng)目的檢查清單。RobertCulbertson曾指出:“如果檢查清單不是通過(guò)項(xiàng)目的經(jīng)驗(yàn)教訓(xùn)而建立起來(lái)的,它就不會(huì)有用,正確地采用檢查清單對(duì)于避免項(xiàng)目風(fēng)險(xiǎn)是極有價(jià)值的”。03對(duì)判定的測(cè)試判定是重要的程序結(jié)構(gòu)之一,無(wú)論是形如if…elsc的條件判定,還是形如while...do的循環(huán),都必須通過(guò)判定節(jié)點(diǎn)來(lái)控制程序的走向。如果程序中沒(méi)有判定,那么無(wú)論數(shù)據(jù)變量的類(lèi)型有多復(fù)雜,無(wú)論變量的數(shù)目有多大,程序執(zhí)行路徑永遠(yuǎn)只有一條,其結(jié)構(gòu)是非常簡(jiǎn)單的。判定節(jié)點(diǎn)的出現(xiàn),導(dǎo)致程序執(zhí)行出現(xiàn)分支,形成復(fù)雜多變的路徑(見(jiàn)圖5.10),造成數(shù)據(jù)變量可能被錯(cuò)誤地賦值,被分配的內(nèi)存空間可能忘記及時(shí)釋放,產(chǎn)生各種缺陷。因此,考察源代碼時(shí)必須重點(diǎn)對(duì)判定展開(kāi)測(cè)試?;驹砘驹順?gòu)成判定的判定表達(dá)式本身可能是由多個(gè)簡(jiǎn)單邏輯條件通過(guò)多個(gè)“與”、“或”關(guān)系連接而成的一個(gè)復(fù)雜的式子,使判定表達(dá)式的輸入與輸出之間形成復(fù)雜的邏輯關(guān)系,難以看出系統(tǒng)輸出隨輸入變化的走向。為此,需要分析判定表達(dá)式的構(gòu)成,對(duì)表達(dá)式進(jìn)行測(cè)試,保證判定表達(dá)式本身符合程序設(shè)計(jì)的預(yù)期功能。對(duì)判定表達(dá)式的測(cè)試主要是通過(guò)對(duì)程序邏輯結(jié)構(gòu)的遍歷來(lái)實(shí)現(xiàn)程序的測(cè)試覆蓋,其基本思想是:對(duì)源代碼中所有的邏輯值均需要測(cè)試真值(True)和假值(False)的情況。基本原理(1)語(yǔ)句覆蓋(StatementCoverage,SC);(2)判定覆蓋(DecisionCoverage,DC,也稱(chēng)分支覆蓋);(3)條件覆蓋(ConditionCoverage,Cc);(4)判定/條件覆蓋(Decision/ConditionCoverage,D/CC);(5)條件組合覆蓋(ConditionCombinationCoverage,CCC);(6)修正的判定/條件覆蓋(ModifiedDecision/ConditionCoverage,MD/CC)?;诟髋卸y(cè)試覆蓋指標(biāo)設(shè)計(jì)測(cè)試用例時(shí),主要的難點(diǎn)問(wèn)題包括:(1)針對(duì)選定的覆蓋指標(biāo),如何有效控制測(cè)試用例規(guī)模,提高測(cè)試用例典型性,最大限度減少測(cè)試漏洞;(2)面對(duì)一段被測(cè)程序源代碼,如何選擇合適的判定測(cè)試覆蓋指標(biāo)。案例描述為便于說(shuō)明,采用一段簡(jiǎn)單的C語(yǔ)言代碼為例展開(kāi)各覆蓋指標(biāo)的討論。代碼流程圖見(jiàn)圖5.11。案例描述該段代碼共包含4個(gè)簡(jiǎn)單判定條件,即T1:a>1;T2:b<2;T3:a==3;T4:x>3。該段代碼包含4條執(zhí)行路徑,即L13:pl+p3;L14:p1+p4;L23:p2+p3;L24:p2+p4。需要注意的是,在這段代碼中,兩個(gè)判定節(jié)點(diǎn)均為隱式分支的情況,即當(dāng)不滿足判定表達(dá)式取真值時(shí),不執(zhí)行任何語(yǔ)句,直接結(jié)束該判定,執(zhí)行后續(xù)語(yǔ)句,從源代碼來(lái)看,是不含else分支的。就代碼本身而言,這并不影響編程的正確性,程序編譯不會(huì)報(bào)錯(cuò),但從程序編寫(xiě)的角度而言,這并非良好的編程習(xí)慣,規(guī)范要求if語(yǔ)句應(yīng)有else分支與其進(jìn)行對(duì)應(yīng),否則是很容易導(dǎo)致缺陷的。這從后續(xù)的測(cè)試設(shè)計(jì)中可以體現(xiàn)出來(lái)。測(cè)試用例設(shè)計(jì)1.語(yǔ)句覆蓋(1)基本思想語(yǔ)句覆蓋指標(biāo)的基本思想是:設(shè)計(jì)測(cè)試用例時(shí)應(yīng)保證程序的每一條可執(zhí)行語(yǔ)句至少執(zhí)行一次。從圖5.12所示的流程圖來(lái)看,語(yǔ)句覆蓋等同于對(duì)圖中所有節(jié)點(diǎn)的覆蓋。測(cè)試用例設(shè)計(jì)(2)測(cè)試用例由于SampleFunc1的兩個(gè)判定表達(dá)式的取假分支都不包含任何執(zhí)行語(yǔ)句,因此,為了滿足語(yǔ)句覆蓋,設(shè)計(jì)的測(cè)試用例僅需執(zhí)行路徑L24即可,即兩個(gè)判定表達(dá)式均取真值。根據(jù)以上分析,設(shè)計(jì)得到的測(cè)試用例見(jiàn)表5.6,且表中任意一個(gè)測(cè)試用例均可滿足語(yǔ)句覆蓋指標(biāo)。測(cè)試用例設(shè)計(jì)(3)測(cè)試分析基于語(yǔ)句覆蓋指標(biāo)所生成的測(cè)試用例數(shù)量少,且無(wú)須額外分析每個(gè)判定表達(dá)式。然而,語(yǔ)句覆蓋是對(duì)判定表達(dá)式的測(cè)試中最弱的覆蓋準(zhǔn)則,原因在于:①關(guān)注語(yǔ)句而非判定表達(dá)式。判定節(jié)點(diǎn)是導(dǎo)致程序出現(xiàn)分支、提高程序結(jié)構(gòu)復(fù)雜性的關(guān)鍵因素之一,而語(yǔ)句覆蓋的測(cè)試重點(diǎn)是所有可執(zhí)行語(yǔ)句,并非判定節(jié)點(diǎn),因此,盡管語(yǔ)句覆蓋可以識(shí)別未執(zhí)行的代碼塊,卻無(wú)法識(shí)別源代碼中因控制流結(jié)構(gòu)而導(dǎo)致的缺陷。②對(duì)隱式分支無(wú)效。當(dāng)隱式分支中涉及諸如內(nèi)存空間的分配和釋放這類(lèi)缺陷時(shí),語(yǔ)句覆蓋是無(wú)法發(fā)現(xiàn)的。測(cè)試用例設(shè)計(jì)2.判定覆蓋(1)基本思想針對(duì)語(yǔ)句覆蓋指標(biāo)無(wú)法著重對(duì)判定節(jié)點(diǎn)進(jìn)行測(cè)試的不足,判定覆蓋指標(biāo)的基本思想是:設(shè)計(jì)測(cè)試用例時(shí)應(yīng)保證程序中每個(gè)判定節(jié)點(diǎn)的取真和取假分支至少執(zhí)行一次。若判定節(jié)點(diǎn)為多分支情況,則設(shè)計(jì)測(cè)試用例時(shí)應(yīng)保證程序中每個(gè)判定節(jié)點(diǎn)取得每種可能的結(jié)果至少一次。從圖5.11所示的流程圖來(lái)看,判定覆蓋等同于對(duì)圖中所有邊的覆蓋。測(cè)試用例設(shè)計(jì)(2)測(cè)試用例為了滿足判定覆蓋,設(shè)計(jì)的測(cè)試用例應(yīng)同時(shí)執(zhí)行路徑L13、L24,或者同時(shí)執(zhí)行路徑L14、L23,如表5.7所示。測(cè)試用例設(shè)計(jì)(3)測(cè)試分析基于判定覆蓋指標(biāo)的測(cè)試因需覆蓋到每一條執(zhí)行邊,生成的測(cè)試用例數(shù)量相對(duì)語(yǔ)句覆蓋有所增加,且測(cè)試重點(diǎn)轉(zhuǎn)向判定節(jié)點(diǎn),因此一般來(lái)說(shuō)具有更強(qiáng)的測(cè)試覆蓋能力。判定覆蓋同時(shí)能夠滿足百分之百的語(yǔ)句覆蓋。然而,判定表達(dá)式多為復(fù)合判定表達(dá)式,即由多個(gè)簡(jiǎn)單判定條件通過(guò)“與”、“或”關(guān)系組合而成,判定覆蓋指標(biāo)并未徹底分析每個(gè)簡(jiǎn)單判定條件的取值情況,仍然會(huì)導(dǎo)致遺漏部分缺陷。例如,函數(shù)SampleFunc1中,若將if((a>1)&&(b<2))錯(cuò)寫(xiě)為if((a>1)Ⅱ(b<2)),則選擇LC-001和LC-002構(gòu)成的這組測(cè)試用例的實(shí)際輸出與預(yù)期輸出完全一致,無(wú)法發(fā)現(xiàn)該缺陷。測(cè)試用例設(shè)計(jì)3.條件覆蓋
(1)基本思想針對(duì)判定覆蓋指標(biāo)無(wú)法測(cè)試每個(gè)簡(jiǎn)單判定條件的不足,條件覆蓋的基本思想是:設(shè)計(jì)測(cè)試用例時(shí)應(yīng)保證程序中每個(gè)復(fù)合判定表達(dá)式中,每個(gè)簡(jiǎn)單判定條件的取真和取假情況至少執(zhí)行一次。(2)測(cè)試用例為了滿足條件覆蓋,就是要使得基本邏輯判定條件T1~T4的取真和取假分支至少執(zhí)行一次。設(shè)計(jì)得到的測(cè)試用例如表5.8所示。測(cè)試用例設(shè)計(jì)
(3)測(cè)試分析條件覆蓋通過(guò)分析每個(gè)判定表達(dá)式中各簡(jiǎn)單判定條件的取值,進(jìn)一步增加了測(cè)試的覆蓋程度,但條件覆蓋一定能夠滿足判定覆蓋嗎?從表5.8來(lái)看,結(jié)果并非如此,對(duì)分支路徑p2和p3的測(cè)試被遺漏了。當(dāng)然,如果注意優(yōu)選測(cè)試用例(見(jiàn)表5.9),就可以保證其既滿足條件覆蓋,又滿足判定覆蓋。測(cè)試用例設(shè)計(jì)4.判定/條件覆蓋
(1)基本思想為了使測(cè)試同時(shí)達(dá)到對(duì)整體判定表達(dá)式的取值情況的覆蓋以及對(duì)每個(gè)簡(jiǎn)單判定條件的取值情況的完全覆蓋,可以引入判定/條件覆蓋指標(biāo),其基本思想是:測(cè)試用例的設(shè)計(jì)應(yīng)滿足判定節(jié)點(diǎn)的取真和取假分支至少執(zhí)行一次,且每個(gè)簡(jiǎn)單判定條件的取真和取假情況也應(yīng)至少執(zhí)行一次,即判定覆蓋+條件覆蓋。(2)測(cè)試用例為滿足判定/條件覆蓋,只需設(shè)計(jì)如表5.9所示的一組測(cè)試用例即可。(3)測(cè)試分析判定/條件覆蓋從判定表達(dá)式的整體和局部分別展開(kāi)測(cè)試,顯然是一個(gè)較為完善的覆蓋指標(biāo)。測(cè)試用例設(shè)計(jì)4.判定/條件覆蓋
由該圖可見(jiàn),通過(guò)修改代碼流程圖,降低了每個(gè)判定表達(dá)式的復(fù)雜度,保證所有判定表達(dá)式都是不包含“與”、“或”關(guān)系的簡(jiǎn)單判定表達(dá)式,只要簡(jiǎn)單使用判定覆蓋指標(biāo)就可保證最終得到的測(cè)試用例可同時(shí)滿足條件覆蓋。且此改動(dòng)對(duì)程序源代碼不產(chǎn)生任何影響。測(cè)試用例設(shè)計(jì)然而,同時(shí)需要注意到:這一改動(dòng)增大了程序結(jié)構(gòu)的復(fù)雜性,導(dǎo)致語(yǔ)句數(shù)目、路徑數(shù)目等大大增加(見(jiàn)表5.10)。且對(duì)于不熟悉編程的測(cè)試新手來(lái)說(shuō),修改代碼流程圖可能植入新的缺陷,這種測(cè)試缺陷雖然不會(huì)影響到源代碼,但將導(dǎo)致測(cè)試用例本身的錯(cuò)誤,最終影響測(cè)試的準(zhǔn)確性。測(cè)試用例設(shè)計(jì)5.條件組合覆蓋(1)基本思想能否找到一種測(cè)試方法來(lái)達(dá)到設(shè)計(jì)難度與測(cè)試效果的均衡呢?條件組合覆蓋的基本思想是:測(cè)試用例的設(shè)計(jì)應(yīng)滿足每個(gè)判定節(jié)點(diǎn)中,所有簡(jiǎn)單判定條件的所有可能的取值組合情況應(yīng)至少執(zhí)行一次。這種覆蓋指標(biāo)的實(shí)質(zhì)是通過(guò)列出真值表的方式來(lái)得到完全的覆蓋,即以冗余換取方法的簡(jiǎn)單性。(2)測(cè)試用例函數(shù)SampleFunc1中包含2個(gè)判定節(jié)點(diǎn),且為串聯(lián)方式,因此,條件組合包含兩方面含義:①對(duì)于每個(gè)判定節(jié)點(diǎn)而言,其簡(jiǎn)單判定條件的所有取值組合情況應(yīng)覆蓋到;②對(duì)于多個(gè)串聯(lián)的判定節(jié)點(diǎn)而言,判定節(jié)點(diǎn)的整體取值存在多種組合情況,也應(yīng)完全覆蓋到。測(cè)試用例設(shè)計(jì)若考慮第二種組合情況,則SampleFunc1有4個(gè)簡(jiǎn)單判定條件,共產(chǎn)生16種組合情況,對(duì)應(yīng)需設(shè)計(jì)16個(gè)測(cè)試用例,如表5.11所示。其中,有4個(gè)測(cè)試用例對(duì)應(yīng)的是不可能存在的情況,即當(dāng)簡(jiǎn)單判定條件T1取假值時(shí)(即變量a小于等于1),簡(jiǎn)單判定條件T3不可能為真(即變量a不可能等于3)。最終得到12個(gè)測(cè)試用例。測(cè)試用例設(shè)計(jì)(3)測(cè)試分析條件組合覆蓋指標(biāo)是以上指標(biāo)中最完備的,該指標(biāo)覆蓋了所有簡(jiǎn)單判定條件的所有組合情況,當(dāng)然同時(shí)滿足條件覆蓋和判定覆蓋。然而,當(dāng)判定表達(dá)式本身較為復(fù)雜、且存在多個(gè)判定節(jié)點(diǎn)串聯(lián)時(shí),條件組合覆蓋的測(cè)試用例規(guī)模將大得驚人。注意,當(dāng)代碼中某判定節(jié)點(diǎn)所包含的多個(gè)簡(jiǎn)單判定表達(dá)式存在相互關(guān)聯(lián)時(shí),即涉及相同的數(shù)據(jù)變量時(shí),這些簡(jiǎn)單判定條件的取值存在一定約束關(guān)系,將造成部分不可行測(cè)試用例,應(yīng)予以剔除。測(cè)試用例設(shè)計(jì)6.修正的判定/條件覆蓋
(1)基本思想綜合上述覆蓋指標(biāo)來(lái)看,語(yǔ)句覆蓋太弱,判定覆蓋和條件覆蓋不夠全面,判定/條件覆蓋設(shè)計(jì)難度大,條件組合覆蓋的測(cè)試用例數(shù)量太多,從測(cè)試效率來(lái)看,似乎都不盡如人意。例如,對(duì)于AANDB這個(gè)表達(dá)式而言,A、B是兩個(gè)簡(jiǎn)單判定條件,真值表及其對(duì)應(yīng)的測(cè)試用例見(jiàn)表5.12。測(cè)試用例設(shè)計(jì)
(2)測(cè)試用例根據(jù)以上思想,基于修正的判定/條件覆蓋設(shè)計(jì)測(cè)試用例的一般步驟為:①列出所有的簡(jiǎn)單判定條件,設(shè)為I1,I2,…In,并構(gòu)建真值表;②對(duì)每個(gè)簡(jiǎn)單判定條件Ij(j在1到n之間),找到能夠?qū)φ麄€(gè)判定結(jié)果產(chǎn)生獨(dú)立影響的多組測(cè)試用例(簡(jiǎn)稱(chēng)獨(dú)立影響對(duì)),措施是在真值表中依次固定其他簡(jiǎn)單判定條件,只要整個(gè)判定表達(dá)式的取值隨當(dāng)前簡(jiǎn)單判定條件萬(wàn)的變化而產(chǎn)生一致的變化,這樣得到的測(cè)試用例就是該條件習(xí)的獨(dú)立影響對(duì);③抽取能體現(xiàn)所有簡(jiǎn)單判定條件獨(dú)立影響性的最少獨(dú)立影響對(duì),就是滿足修正的判定/條件覆蓋的測(cè)試用例集。(3)測(cè)試分析以上討論的測(cè)試用例設(shè)計(jì)方法不需要分析表達(dá)式的內(nèi)部邏輯,得到的測(cè)試用例數(shù)量少,但其致命的局限性在于無(wú)法處理存在耦合的判定表達(dá)式,例如,上面的onCompute函數(shù)中形如(year<1800|lyear>2050)這樣的表達(dá)式是無(wú)法使用此法的,在這種情況下,可采用分解法設(shè)計(jì)測(cè)試用例。測(cè)試用例優(yōu)化針對(duì)選定的覆蓋指標(biāo),如何有效控制測(cè)試用例規(guī)模,提高測(cè)試用例典型性,最大限度減少測(cè)試漏洞,是設(shè)計(jì)測(cè)試用例時(shí)需要考慮的問(wèn)題。(1)盡量選擇邊界測(cè)試數(shù)據(jù)根據(jù)覆蓋指標(biāo)的要求設(shè)計(jì)測(cè)試用例時(shí),應(yīng)盡量結(jié)合邊界選擇測(cè)試數(shù)據(jù)。(2)應(yīng)避免“與”、“或”關(guān)系的屏蔽現(xiàn)象對(duì)于形如(a>1)AND(b<2)這樣由“與”關(guān)系連接而成的判定表達(dá)式而言,若要滿足整個(gè)判定結(jié)果為假時(shí),只要(a>1)或(b<2)中任意一個(gè)條件取假值即可(不妨設(shè)a>1為假),此時(shí),(a>1)條件的取值對(duì)(b<2)條件產(chǎn)生了一種屏蔽效應(yīng),即無(wú)論(b<2)條件的取值是否正確,都不會(huì)對(duì)(a>1)AND(b<2)的輸出結(jié)果造成影響。因此,設(shè)計(jì)測(cè)試用例時(shí),應(yīng)盡量避免出現(xiàn)這種情況。如本例,選擇a=1、b=2的取值,就優(yōu)于a=1、b=1這組取值。捉蟲(chóng)實(shí)踐3:第二日問(wèn)題的判定測(cè)試1.代碼說(shuō)明函數(shù)computeNextDate()的代碼同捉蟲(chóng)實(shí)踐2,不再列出。該函數(shù)的流程圖如圖5.13所示。捉蟲(chóng)實(shí)踐3:第二日問(wèn)題的判定測(cè)試2.開(kāi)始測(cè)試由于computeNextDate函數(shù)的判定節(jié)點(diǎn)數(shù)較多,判定表達(dá)式較為復(fù)雜,導(dǎo)致包含的簡(jiǎn)單判定表達(dá)式多,且執(zhí)行分支數(shù)多,若選擇條件組合覆蓋或修正的判定/條件覆蓋,設(shè)計(jì)工作量太大。同時(shí),源代碼中不包含隱式分支,此時(shí)判定覆蓋等同于語(yǔ)句覆蓋指標(biāo)。(1)選擇判定覆蓋指標(biāo)為滿足判定覆蓋指標(biāo),可簡(jiǎn)單地選擇如下路徑:路徑1:pl+p7+p9路徑2:p2+p3+p7+p10路徑3:p2+p4+p5+p路徑4:p2+p4+p6+p8設(shè)計(jì)的測(cè)試用例見(jiàn)表5.13。捉蟲(chóng)實(shí)踐3:第二日問(wèn)題的判定測(cè)試(2)選擇條件覆蓋指標(biāo)為滿足條件覆蓋指標(biāo),針對(duì)前3個(gè)復(fù)合判定節(jié)點(diǎn)來(lái)考察涉及的11個(gè)簡(jiǎn)單判定條件的取值,并考慮到簡(jiǎn)單判定條件之間的約束關(guān)系,可得到各判定節(jié)點(diǎn)的取值情況見(jiàn)表5.14~表5.16。捉蟲(chóng)實(shí)踐3:第二日問(wèn)題的判定測(cè)試綜合表5.14~表5.16的分析結(jié)果,得到滿足條件覆蓋的測(cè)試用例如表5.17所示。表中“N/A”表示不執(zhí)行該分支,表中括號(hào)內(nèi)的數(shù)字表示表5.14~表5.16中的序號(hào)。捉蟲(chóng)實(shí)踐3:第二日問(wèn)題的判定測(cè)試3.測(cè)試分析從判定覆蓋和條件覆蓋的測(cè)試用例可以看出,判定覆蓋主要覆蓋了類(lèi)似6月末、2月末和年末的日期,但對(duì)于普通日期和類(lèi)似7月末的日期沒(méi)有覆蓋到,條件覆蓋測(cè)試則能覆蓋多種月末日期和年末的日期,盡管如此,其測(cè)試仍然是有漏洞的。例如,2000年2月29日、11月30日這樣的情況并沒(méi)有測(cè)試到。同時(shí),判定覆蓋、條件覆蓋這樣的指標(biāo)僅關(guān)注判定表達(dá)式本身,而并不關(guān)心這些判定節(jié)點(diǎn)的取值組合。換句話說(shuō),僅靠判定覆蓋或條件覆蓋指標(biāo)只能保證對(duì)應(yīng)這些分支能夠被測(cè)試到,但并不能深入理解各判定節(jié)點(diǎn)在實(shí)現(xiàn)函數(shù)功能方面所起到的關(guān)鍵作用,即由多個(gè)判定節(jié)點(diǎn)的嵌套、串聯(lián)等結(jié)構(gòu)而形成的不同路徑往往能反映函數(shù)設(shè)計(jì)的本質(zhì),通過(guò)判定覆蓋或條件覆蓋是無(wú)法測(cè)試到的,必須引入覆蓋相對(duì)更為全面的指標(biāo)——條件組合覆蓋,當(dāng)然,該指標(biāo)所導(dǎo)致的測(cè)試工作量的激增往往又是測(cè)試人員所難以承受的。不妨考慮一下,對(duì)于本例,若選擇條件組合覆蓋指標(biāo),將得到多少個(gè)測(cè)試用例。對(duì)判定的測(cè)試小結(jié)對(duì)判定的測(cè)試主要是通過(guò)考察源代碼中復(fù)合判定表達(dá)式或構(gòu)成復(fù)合判定表達(dá)式的各簡(jiǎn)單判定條件的所有取值情況,來(lái)保證判定表達(dá)式的正確性。常見(jiàn)的判定測(cè)試覆蓋指標(biāo)包括語(yǔ)句覆蓋、判定覆蓋、條件覆蓋、判定/條件覆蓋、條件組合覆蓋和修正的判定/條件覆蓋。其中前3個(gè)指標(biāo)是使用最為廣泛的。但通過(guò)測(cè)試實(shí)踐發(fā)現(xiàn),僅對(duì)判定表達(dá)式進(jìn)行測(cè)試只能保證覆蓋判定表達(dá)式的所有取值,但由函數(shù)功能需求所對(duì)應(yīng)的程序執(zhí)行路徑可能涉及多個(gè)判定節(jié)點(diǎn)的特殊取值組合,在這樣的測(cè)試中往往是無(wú)法全部覆蓋到的。根據(jù)覆蓋指標(biāo)設(shè)計(jì)測(cè)試用例時(shí),應(yīng)注意:(1)避免測(cè)試數(shù)據(jù)受到復(fù)合判定表達(dá)式中的“與”、“或”關(guān)系的屏蔽效應(yīng);(2)盡量結(jié)合邊界值選擇測(cè)試數(shù)據(jù)。04對(duì)路徑的測(cè)試彌諾陶洛斯迷宮的傳說(shuō)1.一個(gè)關(guān)于英雄的故事彌諾陶洛斯迷宮是大約4000年前以航海為生的富有的彌諾斯人在克里特島上搭建的諸多驚人建筑之一,用來(lái)關(guān)押一個(gè)人身牛頭的怪獸,即彌諾陶洛斯。根據(jù)希臘神話記載,當(dāng)彌諾斯在與其兄弟的王位之爭(zhēng)中獲勝而成為克里特島新任國(guó)王后,他請(qǐng)求海神波塞冬賜給自己一頭白色的公牛,以證明自己獲得王位是出自神意。于是,波塞冬果然賜給了彌諾斯一頭巨大的白色公牛,然而,這只公牛太美麗了,使彌諾斯最終將其藏匿起來(lái),宰殺了另外一頭公牛獻(xiàn)祭給波塞冬。憤怒的波塞冬為了報(bào)復(fù)而附體在公牛身上,勾引了彌諾斯的妻子帕西菲(Pasiphae),不久,王后生下一個(gè)牛頭人身的怪物彌諾陶洛斯(Minotaur,即彌諾斯的牛)。為了將怪物藏起來(lái)避免家丑外揚(yáng),彌諾斯王從德?tīng)柗粕裰I中獲得啟示,并命令島上最優(yōu)秀的工匠代達(dá)羅斯(Daedalus)建造了一座巨大的地下迷宮以供彌諾陶洛斯居住,房子的走廊離亮處越來(lái)越遠(yuǎn),根本找不到出口。且因彌諾斯的兒子安德洛革俄斯在泛雅典娜節(jié)運(yùn)動(dòng)會(huì)上獲勝,而被嫉妒的雅典國(guó)王埃勾斯殺死。彌諾斯為了給兒子復(fù)仇,遂向雅典開(kāi)戰(zhàn),并打敗雅典人。雅典只得投降,并許諾每9年向克里特進(jìn)貢7對(duì)童男童女,以供彌諾陶洛斯食用。傳說(shuō),彌諾陶洛斯給他的祭品提供了一個(gè)公平的機(jī)會(huì),在祭品被拋入迷宮的洞口邊存在另外一個(gè)出口,若作為祭品的人能在彌諾陶洛斯找到他們之前找到那個(gè)出口,他們就可得到赦免。彌諾陶洛斯迷宮的傳說(shuō)1.一個(gè)關(guān)于英雄的故事等到第3次進(jìn)貢的時(shí)候,希臘神話中的著名英雄、雅典國(guó)王埃勾斯之子忒修斯自愿作為童男之一前去克里特,以除掉怪物。當(dāng)英俊的忒修斯來(lái)到克里特島后,彌諾斯的女兒阿里阿德涅愛(ài)上了他,她偷偷向忒修斯吐露了愛(ài)慕之意,并交給他一只線團(tuán),教他把線團(tuán)的一端拴在迷宮的入口,以使他可以標(biāo)記走過(guò)的路,同時(shí)交給他一把利劍。忒修斯憑借兩件寶物成功地在迷宮中找到彌諾陶洛斯并將其殺死,然后召集其他童男童女跟隨線團(tuán)返回入口,等候在入口處的阿里阿德涅放下繩子,忒修斯與大家一起爬出迷宮獲得了自由,雅典人從此擺脫了這個(gè)恐怖的貢賦。彌諾陶洛斯迷宮的傳說(shuō)
2.軟件測(cè)試人員的迷宮迷宮是一個(gè)復(fù)雜的路徑排列問(wèn)題,它被設(shè)計(jì)成當(dāng)任何人進(jìn)入后都很難找到出來(lái)的路,而軟件就像一個(gè)迷宮,一個(gè)軟件系統(tǒng)的路徑就是軟件測(cè)試人員必須要通過(guò)的一個(gè)迷宮,且不只一次,每次軟件升級(jí)或修改都要面臨一次,單元測(cè)試中源代碼的路徑,功能測(cè)試業(yè)務(wù)流程形成的路徑,Web應(yīng)用測(cè)試中頁(yè)面間超鏈接形成的路徑,均是龐大的迷宮問(wèn)題。雖然測(cè)試人員面臨的問(wèn)題無(wú)須考慮受到生命威脅,但它充滿了其他危險(xiǎn)。其一,軟件中的Bug就像迷宮中的彌諾陶洛斯,而且遠(yuǎn)遠(yuǎn)不只一個(gè),可能是成百上千個(gè);其二,軟件中的Bug若落到最終用戶手中,無(wú)論對(duì)用戶造成怎樣的后果,測(cè)試人員肯定脫不開(kāi)干系,輕則績(jī)效考核受影響,重則丟掉飯碗,甚至可能會(huì)追究法律責(zé)任;其三,測(cè)試人員必須隨時(shí)準(zhǔn)備被扔進(jìn)迷宮,直至他們能確保已徹底檢查了這個(gè)系統(tǒng)。彌諾陶洛斯迷宮的傳說(shuō)
要走出彌諾陶洛斯迷宮,需要尋找3件法寶:(1)一張用于記錄迷宮路線的地圖;(2)迷宮內(nèi)的最少線性無(wú)關(guān)路徑數(shù),以避免走重復(fù)的路線;(3)找到所有可能迅速逃離迷宮的最佳獨(dú)立路徑。先來(lái)看看古人是如何做的。方法一:歐洲醫(yī)生的方法。據(jù)說(shuō)一個(gè)來(lái)自歐洲的聰明醫(yī)生進(jìn)入并走出了迷宮,成功秘訣在于他把一只手(左右手均可,但中途不可換手)始終放在墻壁上直至他走到出口,這樣可避免在迷宮內(nèi)繞圈子。方法二:英雄的方法。英雄忒修斯進(jìn)入迷宮后,完全靠直覺(jué)找到彌諾陶洛斯并殺死了他。英雄的方法是即興的,盡管他歷經(jīng)到彌諾陶洛斯的路徑只有一次,但即使讓他本人再次進(jìn)入迷宮,也無(wú)法保證他依靠相同的直覺(jué)走相同的路徑。相關(guān)概念對(duì)于一段程序源代碼,通過(guò)遵循如下的壓縮原則,可構(gòu)造其對(duì)應(yīng)的程序圖:(1)剔除注釋語(yǔ)句,注釋不參與實(shí)際程序執(zhí)行,對(duì)程序結(jié)構(gòu)不產(chǎn)生任何影響;(2)剔除數(shù)據(jù)變量的聲明語(yǔ)句,在此特指未進(jìn)行初始化、僅聲明了變量類(lèi)型的語(yǔ)句;(3)所有連續(xù)的串行語(yǔ)句壓縮為一個(gè)節(jié)點(diǎn),即忽略一條子路徑上經(jīng)過(guò)的語(yǔ)句條數(shù),無(wú)論某條子路徑包含多少語(yǔ)句,只要不存在執(zhí)行分支,一律壓縮為一個(gè)節(jié)點(diǎn),從而將關(guān)注重點(diǎn)放在程序結(jié)構(gòu)上,與變量無(wú)關(guān);(4)所有循環(huán)次數(shù)壓縮為一次循環(huán),即忽略循環(huán)次數(shù),無(wú)論某個(gè)循環(huán)結(jié)構(gòu)將循環(huán)多少次,僅考慮執(zhí)行循環(huán)體和不執(zhí)行循環(huán)體這兩種情況,與程序拓?fù)錈o(wú)關(guān)。1.程序圖
程序圖可以看做壓縮后的控制流圖,也是一種特殊形式的有向圖。對(duì)于源代碼的執(zhí)行來(lái)說(shuō),程序圖能夠反映所有的路徑,即測(cè)試的彌諾陶洛斯迷宮的地圖。圖5.14給出了著名的McCabe程序圖。圖中每個(gè)節(jié)點(diǎn)代表一段語(yǔ)句片段(可能僅包含一條語(yǔ)句,也可能包含多條語(yǔ)句),每條有向邊表示程序執(zhí)行的走向(也稱(chēng)控制流)。相關(guān)概念環(huán)復(fù)雜度的確定方式有3種:直觀觀察法、公式計(jì)算法和判定節(jié)點(diǎn)法。下面分別進(jìn)行討論。(1)直觀觀察法直觀觀察法是根據(jù)定義,觀察程序圖將二維平面分隔為封閉區(qū)域和開(kāi)放區(qū)域的個(gè)數(shù)。(2)公式計(jì)算法①基本原理。直觀觀察的方法不利于使用計(jì)算機(jī)程序自動(dòng)計(jì)算,為此,引入如下的公式法來(lái)計(jì)算環(huán)復(fù)雜度:V(G)=e-n+1(5.1)②程序圖的改造。為了滿足強(qiáng)連通條件,需對(duì)程序圖加以改造,策略是:在程序出口節(jié)點(diǎn)處增加一條指向程序入口節(jié)點(diǎn)的有向邊,強(qiáng)制生成一個(gè)死循環(huán)程序,如圖5.15中虛線邊el1所示。2.環(huán)復(fù)雜度
環(huán)復(fù)雜度(即McCabe復(fù)雜性度量)是一種程序結(jié)構(gòu)復(fù)雜度的度量模型,是由McCabe于1982年提出的。其基本思想是基于判定節(jié)點(diǎn)對(duì)程序圖封閉環(huán)數(shù)目造成的影響來(lái)衡量程序的復(fù)雜程度。相關(guān)概念(3)判定節(jié)點(diǎn)法利用代碼中獨(dú)立判定節(jié)點(diǎn)的數(shù)目來(lái)計(jì)算環(huán)復(fù)雜度,公式如下:V(G)=P+1(5.2)其中,P表示圖中獨(dú)立判定節(jié)點(diǎn)的數(shù)目,且要求程序圖中不包含孤立節(jié)點(diǎn)。圖5.14中的McCabe程序圖中有4個(gè)判定節(jié)點(diǎn),即A、B、C、D,因此,環(huán)復(fù)雜度為5。但應(yīng)注意的是,所謂獨(dú)立判定節(jié)點(diǎn)數(shù)不應(yīng)簡(jiǎn)單地視為程序圖中判定節(jié)點(diǎn)的個(gè)數(shù)。例如,如下的代碼段對(duì)應(yīng)的程序圖如圖5.16所示,圖中顯示為1個(gè)判定節(jié)點(diǎn),但由switch所引出的分支實(shí)際有13個(gè)。相關(guān)概念就理論上而言,由switch所引起的多分支的程序一定可以修改為if...elseif…else形式的判定結(jié)構(gòu)。如圖5.17所示的是一個(gè)4分支的switch結(jié)構(gòu)轉(zhuǎn)為3個(gè)兩分支判定節(jié)點(diǎn)的結(jié)構(gòu)。因此,13個(gè)分支的switch判定實(shí)際上對(duì)應(yīng)的是12個(gè)獨(dú)立判定節(jié)點(diǎn)。相關(guān)概念(4)多出口程序的處理圖5.14所示的McCabe程序圖是一個(gè)單入口單出口的程序,而編寫(xiě)程序時(shí),受個(gè)人編程習(xí)慣的影響,開(kāi)發(fā)人員往往會(huì)寫(xiě)出具有多出口的程序(例如多個(gè)return語(yǔ)句)。如圖5.18(a)所示,圖中節(jié)點(diǎn)G和H均為出口節(jié)點(diǎn)。相關(guān)概念對(duì)于多出口的程序,上述方法是否仍然有效呢?①直觀觀察法。②公式計(jì)算法。③判定節(jié)點(diǎn)法。3種方法的對(duì)比見(jiàn)表5.18。綜合來(lái)看,公式計(jì)算法較簡(jiǎn)單,且易于實(shí)現(xiàn)自動(dòng)計(jì)算,使用更為廣泛。相關(guān)概念基本復(fù)雜度關(guān)注的是程序中所有非結(jié)構(gòu)化設(shè)計(jì)的代碼(多由goto、break、continue,或return語(yǔ)句引起),包含一種測(cè)試優(yōu)化和設(shè)計(jì)優(yōu)化的思想。當(dāng)程序的環(huán)復(fù)雜度與基本復(fù)雜度差異很大時(shí),即使程序具有較高的環(huán)復(fù)雜度,但若經(jīng)結(jié)構(gòu)化壓縮后,基本復(fù)雜度并不高,則說(shuō)明該程序多為結(jié)構(gòu)化的設(shè)計(jì),設(shè)計(jì)本身較優(yōu),引入缺陷的風(fēng)險(xiǎn)更低,也更利于分別針對(duì)被壓縮的結(jié)構(gòu)化設(shè)計(jì)展開(kāi)獨(dú)立測(cè)試。3.基本復(fù)雜度
基本復(fù)雜度的基本思想:通過(guò)對(duì)程序圖中的結(jié)構(gòu)化設(shè)計(jì)節(jié)點(diǎn)進(jìn)行不斷壓縮,最終得到一個(gè)無(wú)法壓縮的程序圖,該圖的環(huán)復(fù)雜度稱(chēng)為基本復(fù)雜度。相關(guān)概念圖5.19給出了典型的4類(lèi)非結(jié)構(gòu)化程序結(jié)構(gòu)。對(duì)照?qǐng)D5.14所示的McCabe程序圖,可知該程序圖對(duì)應(yīng)的不是一個(gè)采用結(jié)構(gòu)化設(shè)計(jì)的程序,在判定節(jié)點(diǎn)B處是一個(gè)循環(huán)結(jié)構(gòu),但循環(huán)體內(nèi)部的C點(diǎn)存在強(qiáng)行跳出執(zhí)行CG分支的情況,如圖5.19(d)所示;而對(duì)于判定節(jié)點(diǎn)D,則在E點(diǎn)存在從外部強(qiáng)行跳入判定體內(nèi)的情況,如圖5.19(a)所示。這樣的結(jié)構(gòu)都是無(wú)法壓縮的,非結(jié)構(gòu)化設(shè)計(jì)導(dǎo)致流程混亂,增大了測(cè)試的難度?;驹碓诤诤袦y(cè)試中,等價(jià)類(lèi)測(cè)試是為了解決輸入或輸出數(shù)據(jù)太多,無(wú)法窮盡測(cè)試的問(wèn)題,其追求的目標(biāo)是測(cè)試的完備性和無(wú)冗余性,基本原理是通過(guò)等價(jià)劃分來(lái)將數(shù)據(jù)分片,再?gòu)拿總€(gè)分片中隨意抽取一個(gè)數(shù)據(jù)展開(kāi)測(cè)試(見(jiàn)圖5.20)。基本原理對(duì)于一段包含循環(huán)和多個(gè)串聯(lián)判定結(jié)構(gòu)的源代碼來(lái)說(shuō),可執(zhí)行路徑通常也是無(wú)法窮盡的,對(duì)路徑的測(cè)試基本原理是:將全路徑集合看做一個(gè)向量空間,并將從全路徑集合中抽取的一組線性無(wú)關(guān)的獨(dú)立路徑看做一組向量基,基于向量空間與向量基的理論可知,其他非獨(dú)立路徑均可由這組獨(dú)立路徑的某種組合方式來(lái)遍歷,因此,只要對(duì)這組獨(dú)立路徑進(jìn)行了測(cè)試,就不必測(cè)試其他非獨(dú)立路徑了。該法也稱(chēng)基路徑測(cè)試?;窂綔y(cè)試追求的目標(biāo)是:(1)測(cè)試的完備性,通過(guò)對(duì)獨(dú)立路徑的測(cè)試達(dá)到對(duì)所有路徑的測(cè)試覆蓋;(2)測(cè)試的無(wú)冗余性,每條路徑都是獨(dú)立的,針對(duì)每條路徑設(shè)計(jì)的測(cè)試用例之間不存在冗余。圖5.21給出了路徑測(cè)試的基本原理,其中,獨(dú)立路徑的抽取原則如下:(1)任意兩條路徑線性無(wú)關(guān);(2)所有獨(dú)立路徑的并是整個(gè)向量空間?;驹砘驹韽脑搱D可以看出,獨(dú)立路徑集合的抽取是直接從全路徑集合中進(jìn)行的,不需要先基于路徑做等價(jià)劃分。實(shí)際上,獨(dú)立路徑的抽取原則與等價(jià)劃分的原則非常相似,因此,獨(dú)立路徑的抽取完全可以看做等價(jià)劃分的過(guò)程,且得到獨(dú)立路徑后,根據(jù)路徑執(zhí)行的輸入/輸出就可以方便地設(shè)計(jì)測(cè)試用例了。然而,盡管二者追求的測(cè)試目標(biāo)相同,原理貌似很接近,實(shí)際上,基于等價(jià)劃分的測(cè)試與基于獨(dú)立路徑的測(cè)試過(guò)程是不同的,前者是根據(jù)共性分析得到一組具有共同特征的數(shù)據(jù)集,所有數(shù)據(jù)都將歸為某一個(gè)數(shù)據(jù)集,而后者是根據(jù)個(gè)性分析得到一組具有不同特征(即有別于其他路徑)的路徑集合,每條路徑代表的是一種對(duì)判定決策的新的訪問(wèn)方式,所有其他路徑對(duì)應(yīng)的是某一條或某幾條獨(dú)立路徑的組合遍歷方式。測(cè)試用例設(shè)計(jì)1.測(cè)試難點(diǎn)對(duì)路徑的測(cè)試,核心和難點(diǎn)問(wèn)題在于:(1)如何確定獨(dú)立路徑集合的規(guī)模;(2)如何從整個(gè)路徑集合中抽取獨(dú)立路徑的集合,以確保路徑的獨(dú)立性和獨(dú)立路徑集合的完備性;(3)如何保證每條獨(dú)立路徑的可行性;(4)如何從獨(dú)立路徑設(shè)計(jì)測(cè)試用例。2.獨(dú)立路徑集合的規(guī)模確定按照McCabe的環(huán)復(fù)雜度概念,對(duì)于指定的程序圖,對(duì)路徑的測(cè)試中所需獨(dú)立路徑集合的大小就等于其程序圖的環(huán)復(fù)雜度。測(cè)試用例設(shè)計(jì)3.獨(dú)立路徑的抽取面對(duì)具有龐大路徑數(shù)的彌諾陶洛斯迷宮,如何找到所有可能迅速逃離迷宮的最佳獨(dú)立路徑?下面仍以McCabe程序圖為例,根據(jù)McCabe的相關(guān)理論,抽取獨(dú)立路徑集合。(1)確定主路徑在所有路徑中找到一條最復(fù)雜的路徑作為基礎(chǔ)路徑(簡(jiǎn)稱(chēng)主路徑),所謂復(fù)雜體現(xiàn)在:①該路徑應(yīng)包含盡可能多的判定節(jié)點(diǎn)(包括條件判定和循環(huán)判定節(jié)點(diǎn))。②該路徑應(yīng)包含盡可能復(fù)雜的判定表達(dá)式。③該路徑應(yīng)對(duì)應(yīng)盡可能高的執(zhí)行概率。④該路徑應(yīng)包含盡可能多的語(yǔ)句。測(cè)試用例設(shè)計(jì)3.獨(dú)立路徑的抽取(2)根據(jù)基礎(chǔ)路徑抽取其他獨(dú)立路徑基于基礎(chǔ)路徑,依次在該路徑上的每個(gè)判定節(jié)點(diǎn)處執(zhí)行一個(gè)新的分支,構(gòu)建一條新的獨(dú)立路徑,直至找到足夠的獨(dú)立路徑數(shù),即獨(dú)立路徑數(shù)等于程序的環(huán)復(fù)雜度。注意,當(dāng)基礎(chǔ)路徑上所有的判定節(jié)點(diǎn)處的每個(gè)分支都已經(jīng)覆蓋,仍然不能達(dá)到指定數(shù)量的獨(dú)立路徑時(shí),應(yīng)查找程序中尚未完全覆蓋的判定分支并構(gòu)建獨(dú)立路徑。在確定其他獨(dú)立路徑的過(guò)程中,仍可根據(jù)判定表達(dá)式的復(fù)雜度、路徑執(zhí)行概率、路徑包含語(yǔ)句數(shù)等進(jìn)行路徑的構(gòu)建。測(cè)試用例設(shè)計(jì)4.不可行路徑的處理程序員設(shè)計(jì)程序時(shí)若存在缺陷,將導(dǎo)致得到的路徑是事實(shí)上完全不可能執(zhí)行到的路徑。造成這種情況的主要原因在于:構(gòu)成判定表達(dá)式的多個(gè)簡(jiǎn)單判定條件之間存在一定關(guān)聯(lián),體現(xiàn)在多個(gè)簡(jiǎn)單判定條件的取值相互約束,從而導(dǎo)致部分路徑不可行。5.測(cè)試用例設(shè)計(jì)測(cè)試路徑時(shí),測(cè)試用例設(shè)計(jì)的步驟如下:(1)根據(jù)程序源代碼生成程序圖;(2)計(jì)算程序圖的環(huán)復(fù)雜度,確定獨(dú)立路徑集合的大?。?3)以最復(fù)雜的路徑為基礎(chǔ)路徑,并在此基礎(chǔ)上通過(guò)覆蓋所有判定分支確定其他路徑,從而抽取獨(dú)立路徑集合;(4)抽取獨(dú)立路徑的同時(shí)應(yīng)注意剔除不可行路徑,必要時(shí)補(bǔ)充其他重要的路徑;(5)根據(jù)得到的路徑集合對(duì)應(yīng)設(shè)計(jì)測(cè)試用例。捉蟲(chóng)實(shí)踐4:第二日問(wèn)題的路徑測(cè)試1.環(huán)復(fù)雜度計(jì)算根據(jù)圖5.13的流程圖,可得到computeNextDate的程序圖如圖5.22所示,圖中A表示語(yǔ)句1~5,B表示語(yǔ)句23~24,其他數(shù)字對(duì)應(yīng)源代碼中的語(yǔ)句編號(hào)。從程序圖可知,e=22,n=17,計(jì)算得到其環(huán)復(fù)雜度為6。捉蟲(chóng)實(shí)踐4:第二日問(wèn)題的路徑測(cè)試2.獨(dú)立路徑抽取該程序圖包含5個(gè)判定節(jié)點(diǎn)6、8、12、18和21,則獨(dú)立路徑集合如下:Path1:A,6,8,12,13,16,18,20,21,B,34,35(經(jīng)過(guò)所有的判定節(jié)點(diǎn));Path2:A,6,7,16,18,20,21,B,34,35(在判定節(jié)點(diǎn)6處執(zhí)行e2分支);Path3:A,6,8,9,16,18,20,21,B,34,35(在判定節(jié)點(diǎn)8處執(zhí)行e5分支);Path4:A,6,8,12,15,16,18,20,21,B,34,35(在判定節(jié)點(diǎn)12處執(zhí)行e9分支);Path5:A,6,8,12,13,16,18,33,34,35(在判定節(jié)點(diǎn)18處執(zhí)行e14分支);Path6:A,6,8,12,13,16,18,20,21,28,34,35(在判定節(jié)點(diǎn)21處執(zhí)行e17分支)。捉蟲(chóng)實(shí)踐4:第二日問(wèn)題的路徑測(cè)試3.不可行路徑分析(1)不可行路徑的原因分析通過(guò)查看源代碼,發(fā)現(xiàn)當(dāng)程序執(zhí)行判定節(jié)點(diǎn)6的e3分支時(shí),意味著函數(shù)輸入為2、4、6、9或11月,此時(shí),程序不可能執(zhí)行判定節(jié)點(diǎn)21的e16分支,即對(duì)應(yīng)12月的情況,因此,Path1、Path3、Path4都是不可行路徑,導(dǎo)致不可行路徑的主要原因在于多個(gè)判定表達(dá)式中涉及的簡(jiǎn)單判定條件存在一定的約束關(guān)系。(2)路徑的補(bǔ)充不可行路徑通常意味著存在程序設(shè)計(jì)缺陷,可通過(guò)修改算法邏輯來(lái)避免判定節(jié)點(diǎn)之間的關(guān)聯(lián)關(guān)系,消除這種設(shè)計(jì)缺陷。捉蟲(chóng)實(shí)踐4:第二日問(wèn)題的路徑測(cè)試路徑的執(zhí)行概率可簡(jiǎn)單地按照該路徑包含的所有邊的執(zhí)行概率的乘積來(lái)表示,因非判定節(jié)點(diǎn)邊的執(zhí)行概率為1,對(duì)概率計(jì)算結(jié)果無(wú)影響,因此,一條路徑的執(zhí)行概率可用該路徑包含所有判定分支執(zhí)行概率的乘積來(lái)表示。計(jì)算得到已知獨(dú)立路徑的執(zhí)行概率如表5.20所示。捉蟲(chóng)實(shí)踐4:第二日問(wèn)題的路徑測(cè)試從以上路徑的執(zhí)行概率可以發(fā)現(xiàn),這些獨(dú)立路徑的執(zhí)行概率都不高,如果補(bǔ)充如表5.21所示的3條路徑,從執(zhí)行概率來(lái)說(shuō),測(cè)試重要度是很高的,可以起到很好的補(bǔ)充測(cè)試作用。捉蟲(chóng)實(shí)踐4:第二日問(wèn)題的路徑測(cè)試4.測(cè)試用例設(shè)計(jì)針對(duì)表5.20、表5.21列出的每條路徑,至少設(shè)計(jì)一個(gè)測(cè)試用例,得到最終測(cè)試用例集合如表5.22所示。捉蟲(chóng)實(shí)踐4:第二日問(wèn)題的路徑測(cè)試5.測(cè)試分析這種基于程序圖和環(huán)復(fù)雜度的路徑測(cè)試方法有效嗎?能保證測(cè)試的完備性和無(wú)冗余性嗎?從第二日問(wèn)題的測(cè)試結(jié)果來(lái)看,由于存在不可行路徑,使得最終得到的獨(dú)立路徑集合不能保證測(cè)試的完備性,補(bǔ)充了3條路徑后又不能保證測(cè)試的無(wú)冗余性。而且,所有獨(dú)立路徑的執(zhí)行概率都很低,任何一條獨(dú)立路徑的執(zhí)行概率都低于補(bǔ)充路徑的執(zhí)行概率,那么,如果不補(bǔ)充Path6~Path8,則所測(cè)試的獨(dú)立路徑都是小概率事件,反而不能保證大概率情況下程序的正常處理。捉蟲(chóng)實(shí)踐5:自動(dòng)柜員機(jī)問(wèn)題的路徑測(cè)試在第3章黑盒測(cè)試中談到,當(dāng)備選事件流太多時(shí),基于場(chǎng)景的測(cè)試往往會(huì)面臨場(chǎng)景爆增的問(wèn)題,為了滿足測(cè)試的完備性和無(wú)冗余性要求,可基于獨(dú)立路徑的思想,按如下原則抽取典型場(chǎng)景:(1)最少的場(chǎng)景數(shù)等于事件流的總數(shù),即基本流與備選流的總數(shù);(2)有且唯一有一個(gè)場(chǎng)景僅包含基本流;(3)對(duì)應(yīng)某個(gè)備選流,至少應(yīng)有一個(gè)場(chǎng)景覆蓋該備選流,且在該場(chǎng)景中應(yīng)盡量避免覆蓋其他的備選流。該原則真的能保證測(cè)試的完備性和無(wú)冗余性嗎?下面從獨(dú)立路徑測(cè)試的角度對(duì)自動(dòng)柜員機(jī)問(wèn)題進(jìn)行場(chǎng)景的抽取,并對(duì)之前的黑盒測(cè)試進(jìn)行對(duì)比,看效果有何不同。捉蟲(chóng)實(shí)踐5:自動(dòng)柜員機(jī)問(wèn)題的路徑測(cè)試將自動(dòng)柜員機(jī)問(wèn)題的場(chǎng)景圖(見(jiàn)圖3.12)改為程序圖見(jiàn)圖5.24,圖中節(jié)點(diǎn)含義不再列出。該圖有16條原始邊,13個(gè)原始節(jié)點(diǎn),其中,判定節(jié)點(diǎn)4個(gè),分別為2、4、8、10,經(jīng)程序圖改造后計(jì)算得到環(huán)復(fù)雜度為6,則獨(dú)立路徑及與對(duì)應(yīng)場(chǎng)景的關(guān)系如表5.27所示。捉蟲(chóng)實(shí)踐6:信息采集系統(tǒng)的路徑測(cè)試1.獨(dú)立路徑抽取根據(jù)信息采集系統(tǒng)的數(shù)據(jù)校驗(yàn)和數(shù)據(jù)導(dǎo)出節(jié)點(diǎn)的場(chǎng)景圖(見(jiàn)圖4.5),可得到程序圖見(jiàn)圖5.25。該程序圖的環(huán)復(fù)雜度為5,包含4個(gè)判定節(jié)點(diǎn):2,4,7,8,得到獨(dú)立路徑及與對(duì)應(yīng)場(chǎng)景的關(guān)系如表5.28所示。捉蟲(chóng)實(shí)踐6:信息采集系統(tǒng)的路徑測(cè)試(1)相同的主流程可得到不同的場(chǎng)景集合,且均滿足測(cè)試完備性和無(wú)冗余性(2)采用第3章討論的場(chǎng)景構(gòu)建原則得到的場(chǎng)景可滿足測(cè)試完備和無(wú)冗余,但使用難度大根據(jù)第3章構(gòu)建的場(chǎng)景對(duì)邊的訪問(wèn),得到表5.29。捉蟲(chóng)實(shí)踐6:信息采集系統(tǒng)的路徑測(cè)試2.不可行路徑問(wèn)題在第4章黑盒測(cè)試案例實(shí)踐中,針對(duì)信息采集系統(tǒng)的第二層基本流和備選流分析,曾經(jīng)遇到不可行場(chǎng)景問(wèn)題,即根據(jù)圖4.5分析得到的場(chǎng)景(基本流+備選流1)是一個(gè)不可行的場(chǎng)景。當(dāng)基于獨(dú)立路徑的思想抽取場(chǎng)景時(shí),仍然會(huì)產(chǎn)生不可行路徑(見(jiàn)表5.28中的Path4)。主要原因在于,在基本流和備選流中,每個(gè)發(fā)生狀態(tài)跳轉(zhuǎn)的判定節(jié)點(diǎn)之間會(huì)存在相互關(guān)聯(lián),例如,當(dāng)執(zhí)行備選流1時(shí),意味著文件中余留有錯(cuò)誤,因此,必然要執(zhí)行備選流3,即程序圖中的判定節(jié)點(diǎn)2執(zhí)行e3分支時(shí),判定節(jié)點(diǎn)7必須執(zhí)行c10分支。受到判定節(jié)點(diǎn)的關(guān)聯(lián)性影響,基于獨(dú)立路徑的測(cè)試會(huì)出現(xiàn)不可行路徑,即對(duì)應(yīng)不可行場(chǎng)景。不可行場(chǎng)景導(dǎo)致基于環(huán)復(fù)雜度計(jì)算得到的最少場(chǎng)景數(shù)失效,場(chǎng)景補(bǔ)充的原則與基于獨(dú)立路徑的測(cè)試非常相似,請(qǐng)讀者自行分析。總之,基于獨(dú)立路徑的測(cè)試方法的思想可以用于任何動(dòng)態(tài)模型中,只要有執(zhí)行路徑的概念,就可以使用該測(cè)試方法,實(shí)踐表明,在針對(duì)場(chǎng)景的測(cè)試中,使用該測(cè)試方法是完全可以的。對(duì)路徑的測(cè)試小結(jié)基于獨(dú)立路徑的測(cè)試是最重要的白盒測(cè)試方法之一,其思想可用于任何動(dòng)態(tài)模型中。在單元測(cè)試階段,基于獨(dú)立路徑的測(cè)試主要用于對(duì)程序源代碼的執(zhí)行測(cè)試;在集成測(cè)試或系統(tǒng)測(cè)試階段,該測(cè)試方法則主要用于對(duì)業(yè)務(wù)流程、頁(yè)面跳轉(zhuǎn)等類(lèi)似動(dòng)態(tài)執(zhí)行路徑的測(cè)試。基于獨(dú)立路徑的測(cè)試主要關(guān)注的是因判定而帶來(lái)的程序路徑爆增問(wèn)題,其追求的目標(biāo)是達(dá)到路徑測(cè)試的完備和無(wú)冗余性。該法以程序圖和環(huán)復(fù)雜度分析為基礎(chǔ),基本步驟包括:(1)從源代碼生成程序圖,即把注釋、不含初始化的數(shù)據(jù)變量聲明和串行語(yǔ)句壓縮后的控制流圖;(2)根據(jù)程序圖計(jì)算環(huán)復(fù)雜度,對(duì)于多出口程序需進(jìn)行程序圖的改造;(3)根據(jù)環(huán)復(fù)雜度,以一條最復(fù)雜的基礎(chǔ)路徑為基準(zhǔn),通過(guò)覆蓋該路徑上的每個(gè)新的判定分支來(lái)抽取一組獨(dú)立路徑集合;(4)在獨(dú)立路徑的抽取過(guò)程中,注意分析判定表達(dá)式的關(guān)聯(lián)性,避免不可行路徑;(5)當(dāng)存在不可行路徑時(shí),需根據(jù)執(zhí)行概率等其他風(fēng)險(xiǎn)評(píng)估方法來(lái)補(bǔ)充其他路徑;(6)對(duì)每條路徑設(shè)計(jì)至少一個(gè)測(cè)試用例。對(duì)路徑的測(cè)試小結(jié)當(dāng)代碼中存在循環(huán)結(jié)構(gòu)或串聯(lián)形式的條件判定,且判定表達(dá)式之間相互獨(dú)立時(shí),獨(dú)立路徑測(cè)試方法可以大大降低測(cè)試用例的數(shù)量,并保證測(cè)試的完備性和無(wú)冗余性。基于獨(dú)立路徑的測(cè)試更強(qiáng)調(diào)良好的程序設(shè)計(jì),體現(xiàn)在如下方面:(1)代碼設(shè)計(jì)應(yīng)盡量簡(jiǎn)單,保持程序的環(huán)復(fù)雜度不超過(guò)10,否則,需將程序中相對(duì)獨(dú)立的代碼改為函數(shù)調(diào)用的方式來(lái)降低單個(gè)函數(shù)的復(fù)雜度,這樣可以降低植入缺陷的可能性,同時(shí)降低測(cè)試的難度和工作量;(2)代碼中應(yīng)避免重復(fù)的判定條件或數(shù)據(jù)依賴性,保持判定節(jié)點(diǎn)的獨(dú)立性,以有效避免不可行路徑。注意,McCabe在1989年提出環(huán)復(fù)雜度指標(biāo),并認(rèn)為存在大量路徑的系統(tǒng)是不好的,一個(gè)典型程序的環(huán)復(fù)雜度不應(yīng)超過(guò)10,主要原因是:?jiǎn)栴}越復(fù)雜,人犯錯(cuò)或找不到解決方案的可能性越大,為了解決小于5條路徑、包含10條路徑、包含大于10條路徑的3個(gè)邏輯問(wèn)題,一個(gè)普通學(xué)生分別需花費(fèi)5分鐘、幾小時(shí)和幾天時(shí)間;且早期的Cobol、Fortran這類(lèi)語(yǔ)言常導(dǎo)致許多循環(huán)路徑的交結(jié)及循環(huán)結(jié)束的沖突等,這種“意大利面式代碼”必須限制復(fù)雜度,否則維護(hù)這些系統(tǒng)的代碼是不可忍受的。05對(duì)循環(huán)的測(cè)試基本原理
循環(huán)結(jié)構(gòu)是程序中除條件判定之外的另一類(lèi)重要的結(jié)構(gòu),重復(fù)多次循環(huán)可能導(dǎo)致內(nèi)存泄漏,可能存在邊界的錯(cuò)誤,因此,對(duì)循環(huán)的測(cè)試基本原理是:重點(diǎn)關(guān)注循環(huán)的過(guò)程正確性,即在循環(huán)的邊界和運(yùn)行界限內(nèi)對(duì)循環(huán)體的執(zhí)行過(guò)程進(jìn)行測(cè)試。測(cè)試用例設(shè)計(jì)1.循環(huán)結(jié)構(gòu)的分類(lèi)
循環(huán)結(jié)構(gòu)主要包括3類(lèi),即串聯(lián)、嵌套和非結(jié)構(gòu)化,如圖5.26所示。在串聯(lián)情況下,圖5.26(b)中由判定節(jié)點(diǎn)2和3分別形成的兩個(gè)循環(huán)結(jié)構(gòu)若存在相互關(guān)聯(lián)的變量,將對(duì)循環(huán)次數(shù)產(chǎn)生影響;圖5.26(c)中判定節(jié)點(diǎn)2和4分別形成兩個(gè)循環(huán)體,但從3號(hào)節(jié)點(diǎn)存在跳入4號(hào)節(jié)點(diǎn)處的循環(huán)結(jié)構(gòu)內(nèi)部的情況,是不符合結(jié)構(gòu)化程序設(shè)計(jì)思想的。測(cè)試用例設(shè)計(jì)2.測(cè)試難點(diǎn)
針對(duì)不同類(lèi)型的循環(huán)結(jié)構(gòu),測(cè)試難點(diǎn)問(wèn)題如下:(1)對(duì)于單個(gè)循環(huán)節(jié)點(diǎn),如何結(jié)合循環(huán)次數(shù)的邊界進(jìn)行測(cè)試;(2)對(duì)于單個(gè)循環(huán)節(jié)點(diǎn),如何設(shè)計(jì)測(cè)試用例來(lái)保證循環(huán)的完整性;(3)對(duì)于串聯(lián)的循環(huán)節(jié)點(diǎn),如何保證測(cè)試的全面性;(4)對(duì)于非結(jié)構(gòu)化的循環(huán),如何進(jìn)行測(cè)試。測(cè)試用例設(shè)計(jì)3.針對(duì)單個(gè)循環(huán)節(jié)點(diǎn)循環(huán)次數(shù)的測(cè)試
對(duì)于單個(gè)循環(huán)節(jié)點(diǎn)而言,循環(huán)次數(shù)的邊界應(yīng)為1和最大次數(shù)(不妨設(shè)為n次),則應(yīng)針對(duì)如下循環(huán)次數(shù)設(shè)計(jì)測(cè)試用例:(1)循環(huán)0次(即不執(zhí)行循環(huán)體);(2)循環(huán)1次;(3)循環(huán)2次;(4)循環(huán)正常次數(shù)(通常為最大次數(shù)的一半);(5)循環(huán)n-1次:(6)循環(huán)n次。測(cè)試用例設(shè)計(jì)當(dāng)被測(cè)循環(huán)體的循環(huán)次數(shù)固定時(shí),參照以上原則設(shè)計(jì)測(cè)試用例即可,然而,當(dāng)被測(cè)循環(huán)體的循環(huán)次數(shù)根據(jù)某些變量的取值變化而變化時(shí),測(cè)試用例的設(shè)計(jì)變得更加復(fù)雜。例如,在如下的函數(shù)SampleFunc4中,輸入?yún)?shù)為interation,函數(shù)內(nèi)部的for循環(huán)中,i為循環(huán)變量,初值為1,iteration是變量i的終止條件,因此,iteration和i的初值的大小關(guān)系將決定該循環(huán)體的循環(huán)次數(shù)。測(cè)試用例設(shè)計(jì)當(dāng)iteration=1時(shí),i的初值等于iteration,程序不執(zhí)行循環(huán)體;當(dāng)iteration<1時(shí),例如iteration=0時(shí),i的初值比iteration還大,程序也不會(huì)執(zhí)行循環(huán)體。此時(shí),僅測(cè)試循環(huán)0次的情況。當(dāng)iteration>1時(shí),i將進(jìn)入循環(huán)體執(zhí)行循環(huán),此時(shí),應(yīng)盡量測(cè)試到關(guān)于循環(huán)次數(shù)的所有典型情況,不妨取iteration=10,對(duì)應(yīng)最大循環(huán)次數(shù)為9。根據(jù)以上分析,對(duì)該函數(shù)的測(cè)試應(yīng)從如表5.30所示的各方面展開(kāi)。測(cè)試用例設(shè)計(jì)4.針對(duì)單個(gè)循環(huán)節(jié)點(diǎn)循環(huán)過(guò)程的測(cè)試結(jié)構(gòu)化設(shè)計(jì)的循環(huán)結(jié)構(gòu)的循環(huán)執(zhí)行過(guò)程包括如下3個(gè)步驟:(1)循環(huán)的初始化稱(chēng)控制循環(huán)過(guò)程的變量為循環(huán)變量,在每次循環(huán)中,通過(guò)循環(huán)變量的規(guī)律性變化來(lái)控制總的循環(huán)次數(shù)。(2)循環(huán)的迭代在每次進(jìn)入循環(huán)體內(nèi)部后,應(yīng)測(cè)試在循環(huán)體內(nèi)部包含的語(yǔ)句執(zhí)行過(guò)程中,循環(huán)變量的增量是否正確;每次循環(huán)中涉及的重要變量的取值是否按預(yù)期規(guī)律發(fā)生變化;重復(fù)多次循環(huán)是否導(dǎo)致誤差累積;多次循環(huán)是否對(duì)內(nèi)存造成壓力;是否存在continue、break等語(yǔ)句,從而導(dǎo)致在某些循環(huán)過(guò)程中強(qiáng)制跳過(guò)部分語(yǔ)句不執(zhí)行,從而注入代碼質(zhì)量的風(fēng)險(xiǎn)。(3)循環(huán)的終止循環(huán)的終止條件是否存在邊界錯(cuò)誤,即循環(huán)變量的最大值是否正確,退出循環(huán)的條件是否設(shè)置正確。測(cè)試用例設(shè)計(jì)5.針對(duì)多個(gè)循環(huán)結(jié)構(gòu)的測(cè)試
當(dāng)循環(huán)節(jié)點(diǎn)存在不同形式的組合時(shí),對(duì)循環(huán)的測(cè)試需要考慮更多內(nèi)容。(1)循環(huán)節(jié)點(diǎn)的串聯(lián)當(dāng)各循環(huán)節(jié)點(diǎn)為串聯(lián)形式時(shí),若各個(gè)判定節(jié)點(diǎn)相互獨(dú)立,則僅需根據(jù)單個(gè)循環(huán)體的測(cè)試原則進(jìn)行測(cè)試即可。當(dāng)串聯(lián)的各循環(huán)節(jié)點(diǎn)存在相互關(guān)聯(lián)時(shí),循環(huán)次數(shù)和循環(huán)過(guò)程存在一定的不確定性,此時(shí)不能孤立地測(cè)試每個(gè)循環(huán)節(jié)點(diǎn),而應(yīng)在參照單個(gè)循環(huán)節(jié)點(diǎn)的原則進(jìn)行測(cè)試的基礎(chǔ)上,結(jié)合對(duì)數(shù)據(jù)變量的測(cè)試來(lái)做補(bǔ)充測(cè)試。測(cè)試用例設(shè)計(jì)5.針對(duì)多個(gè)循環(huán)結(jié)構(gòu)的測(cè)試
(2)循環(huán)節(jié)點(diǎn)的嵌套當(dāng)循環(huán)節(jié)點(diǎn)為嵌套形式,且判定節(jié)點(diǎn)相互獨(dú)立時(shí),應(yīng)按照由內(nèi)向外的次序,先測(cè)試最內(nèi)層循環(huán)體,然后逐步外推,直至測(cè)試到最外層的循環(huán)體。在測(cè)試每層循環(huán)體時(shí),仍根據(jù)單個(gè)循環(huán)體的測(cè)試原則進(jìn)行測(cè)試,并考慮4種特殊組合:①內(nèi)層最小循環(huán)次數(shù),外層最小循環(huán)次數(shù),計(jì)算的結(jié)果;②內(nèi)層最小循環(huán)次數(shù),外層最大循環(huán)次數(shù),計(jì)算的結(jié)果;③內(nèi)層最大循環(huán)次數(shù),外層最小循環(huán)次數(shù),計(jì)算的結(jié)果;④內(nèi)層最大循環(huán)次數(shù),外層最大循環(huán)次數(shù),計(jì)算的結(jié)果。測(cè)試用例設(shè)計(jì)5.針對(duì)多個(gè)循環(huán)結(jié)構(gòu)的測(cè)試
(3)非結(jié)構(gòu)化的循環(huán)非結(jié)構(gòu)化的程序給測(cè)試帶來(lái)一定的難度,這樣的循環(huán)結(jié)構(gòu)通常無(wú)法測(cè)試,需重新設(shè)計(jì)成結(jié)構(gòu)化的程序再進(jìn)行測(cè)試。當(dāng)然,如果不是由開(kāi)發(fā)人員來(lái)做測(cè)試,而是由測(cè)試人員來(lái)做函數(shù)的單元測(cè)試,那么,測(cè)試人員是無(wú)權(quán)修改代碼的,此時(shí),測(cè)試人員只能參照單個(gè)循環(huán)體的測(cè)試原則設(shè)計(jì)測(cè)試用例,并兼顧循環(huán)嵌套條件下對(duì)循環(huán)次數(shù)的多種特殊組合情況。捉蟲(chóng)實(shí)踐7:B樣條曲線問(wèn)題的測(cè)試1.代碼說(shuō)明B樣條(B-Spline)曲線是最重要的自由曲線曲面類(lèi)型之一,B樣條曲線問(wèn)題是在二維平面內(nèi),根據(jù)給定的一組控制點(diǎn)坐標(biāo),在規(guī)定的精度下,按照指定冪次繪制與這組控制點(diǎn)對(duì)應(yīng)的B樣條曲線的函數(shù)。2.開(kāi)始測(cè)試這是一個(gè)包含3層嵌套循環(huán)的程序,測(cè)試執(zhí)行應(yīng)從內(nèi)向外進(jìn)行,但測(cè)試分析應(yīng)由外向內(nèi)進(jìn)行。表31列出了每層循環(huán)涉及的循環(huán)變量、初值、終值和循環(huán)累加量的情況。捉蟲(chóng)實(shí)踐7:B樣條曲線問(wèn)題的測(cè)試該表中ptsNum、oder、numofU均為取值不確定的變量,并滿足如下的約束條件:(1)order≥0,曲線冪次不應(yīng)小于零;(2)ptsNum≥2,控制點(diǎn)的個(gè)數(shù)至少應(yīng)能生成一條直線段;(3)numofU≥2,繪制B樣條曲線的點(diǎn)數(shù)應(yīng)保證至少包含起點(diǎn)和終點(diǎn)。為此,針對(duì)各層循環(huán)的邊界條件,并對(duì)應(yīng)循環(huán)次數(shù)的邊界組合進(jìn)行測(cè)試設(shè)計(jì),如表5.32所示。捉蟲(chóng)實(shí)踐7:B樣條曲線問(wèn)題的測(cè)試捉蟲(chóng)實(shí)踐7:B樣條曲線問(wèn)題的測(cè)試3.測(cè)試分析
該例共設(shè)計(jì)42個(gè)測(cè)試用例,其中,9個(gè)(21.4%)是不存在的情況,永遠(yuǎn)測(cè)試不到;18個(gè)(42.9%)是不符合約束條件的情況,僅需選擇少數(shù)幾個(gè)測(cè)試用例進(jìn)行測(cè)試;而在剩下的15個(gè)測(cè)試用例中,只有3個(gè)是可以得到光滑曲線的,其他均對(duì)應(yīng)測(cè)試的是特殊的曲線形式或特殊的顯示效果。因此,如果僅根據(jù)循環(huán)的類(lèi)型(串聯(lián)、嵌套等),并結(jié)合循環(huán)次數(shù)的邊界進(jìn)行測(cè)試,
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度店長(zhǎng)聘用合同特殊條款適用性分析
- 二零二五年度牛羊草料進(jìn)口代理服務(wù)合同樣本2篇
- 二零二五年度出國(guó)留學(xué)學(xué)費(fèi)支付及管理合同4篇
- 二零二五年度城市綠化打井工程監(jiān)理合同8篇
- 2025年度個(gè)人小型挖機(jī)租賃服務(wù)規(guī)范合同4篇
- 二零二五版嬰幼兒奶粉品牌授權(quán)及產(chǎn)品供應(yīng)鏈管理合同4篇
- 2025年度個(gè)人二手車(chē)轉(zhuǎn)讓及二手車(chē)增值服務(wù)合同
- 二零二五年度木工材料供應(yīng)鏈管理合同4篇
- 2025年度個(gè)人工程車(chē)租賃及道路救援服務(wù)合同2篇
- 2025年度個(gè)人車(chē)輛購(gòu)置貸款延期還款合同4篇
- 回收二手機(jī)免責(zé)協(xié)議書(shū)模板
- (正式版)JC∕T 60023-2024 石膏條板應(yīng)用技術(shù)規(guī)程
- 人教版高中生物學(xué)新舊教材知識(shí)差異盤(pán)點(diǎn)
- (權(quán)變)領(lǐng)導(dǎo)行為理論
- 2024屆上海市浦東新區(qū)高三二模英語(yǔ)卷
- 2024年智慧工地相關(guān)知識(shí)考試試題及答案
- YY/T 0681.2-2010無(wú)菌醫(yī)療器械包裝試驗(yàn)方法第2部分:軟性屏障材料的密封強(qiáng)度
- GB/T 8005.2-2011鋁及鋁合金術(shù)語(yǔ)第2部分:化學(xué)分析
- 不動(dòng)產(chǎn)登記實(shí)務(wù)培訓(xùn)教程課件
- 不銹鋼制作合同范本(3篇)
- 2023年系統(tǒng)性硬化病診斷及診療指南
評(píng)論
0/150
提交評(píng)論