專(zhuān)利名稱(chēng):基于覆蓋率量化指標(biāo)確定軟件測(cè)試過(guò)程充分性的方法
技術(shù)領(lǐng)域:
本發(fā)明涉及軟件測(cè)試技術(shù),尤其涉及一種基于覆蓋率量化指標(biāo)確定軟件測(cè)試過(guò)程充分性的方法,即利用代碼覆蓋率作為量化指標(biāo)來(lái)確定軟件測(cè)試中的測(cè)試是否充分。
背景技術(shù):
在軟件單元測(cè)試的各個(gè)階段中,人們總是期望用一個(gè)統(tǒng)一的量化指標(biāo)來(lái)確定測(cè)試過(guò)程和方法的充分性,并以此來(lái)指導(dǎo)何時(shí)結(jié)束測(cè)試。這里,覆蓋率是軟件單元測(cè)試中常見(jiàn)的量化評(píng)價(jià)標(biāo)準(zhǔn),常見(jiàn)的覆蓋準(zhǔn)則包括語(yǔ)句覆蓋、判定覆蓋、條件覆蓋、判定/條件覆蓋、修改的判定條件覆蓋、組合覆蓋以及路徑覆蓋等。但,現(xiàn)有的傳統(tǒng)覆蓋準(zhǔn)則,并不適用于軟件測(cè)試的各個(gè)階段。所述測(cè)試階段,包括單元測(cè)試、集成測(cè)試和系統(tǒng)測(cè)試。另外,傳統(tǒng)的覆蓋準(zhǔn)則也有待進(jìn)一步擴(kuò)展,以解決軟件測(cè)試技術(shù)發(fā)展過(guò)程中的新問(wèn)題。
發(fā)明內(nèi)容
有鑒于此,本發(fā)明的主要目的在于提供一種基于覆蓋率量化指標(biāo)確定軟件測(cè)試過(guò)程充分性的方法,擴(kuò)展傳統(tǒng)覆蓋準(zhǔn)則的使用階段,以適用評(píng)估不同測(cè)試階段中的多種動(dòng)態(tài)測(cè)試方法;并擴(kuò)展傳統(tǒng)單元測(cè)試的覆蓋準(zhǔn)則,提出文件覆蓋、方法覆蓋和類(lèi)覆蓋等新的準(zhǔn)則;以及能夠按照給定的覆蓋準(zhǔn)則,對(duì)被測(cè)單元進(jìn)行靜態(tài)分析,得到待覆蓋元素集合,根據(jù)用戶測(cè)試需求,進(jìn)行動(dòng)態(tài)測(cè)試執(zhí)行,統(tǒng)計(jì)被覆蓋元素,并計(jì)算覆蓋率,從而根據(jù)覆蓋率量化指標(biāo)來(lái)確定軟件測(cè)試過(guò)程和方法的充分性,使用多種覆蓋準(zhǔn)則統(tǒng)計(jì)的覆蓋率進(jìn)行衡量,提高評(píng)估測(cè)試的效率和準(zhǔn)確性。為達(dá)到上述目的,本發(fā)明的技術(shù)方案是這樣實(shí)現(xiàn)的
一種基于覆蓋率量化指標(biāo)確定軟件測(cè)試過(guò)程充分性的方法,該方法主要包括
A、對(duì)被測(cè)程序進(jìn)行預(yù)編譯、詞法分析和語(yǔ)法分析,得到程序的抽象語(yǔ)法樹(shù)、控制流圖和函數(shù)之間的調(diào)用關(guān)系圖,并根據(jù)用戶測(cè)試需求,自動(dòng)生成被測(cè)單元;
B、根據(jù)覆蓋準(zhǔn)則,從所述抽象語(yǔ)法樹(shù)和控制流圖中提取被測(cè)單元中相應(yīng)的待覆蓋元素集合;
C、根據(jù)所述的覆蓋準(zhǔn)則,在被測(cè)單元的程序中插入相應(yīng)的探針函數(shù);
D、根據(jù)用戶測(cè)試需求,選擇系統(tǒng)自動(dòng)執(zhí)行或用戶手動(dòng)執(zhí)行的方式對(duì)插入探針函數(shù)的被測(cè)單元進(jìn)行動(dòng)態(tài)測(cè)試;
E、根據(jù)動(dòng)態(tài)測(cè)試執(zhí)行的返回信息,得到測(cè)試單元的被覆蓋元素集合,并計(jì)算被測(cè)單元
的覆蓋率。其中,所述步驟A包括
根據(jù)被測(cè)程序中的函數(shù)調(diào)用關(guān)系,對(duì)被測(cè)程序進(jìn)行單元?jiǎng)澐?,得到被測(cè)單元;所述被測(cè)單元為根據(jù)用戶測(cè)試需求,將被測(cè)試程序劃分成的獨(dú)立的測(cè)試對(duì)象,其為一個(gè)或多個(gè)函數(shù)、 類(lèi)、文件。所述步驟B包括對(duì)于語(yǔ)句覆蓋準(zhǔn)則,提取被測(cè)試單元的函數(shù)中每一個(gè)可達(dá)語(yǔ)句塊作為語(yǔ)句覆蓋元素, 組成語(yǔ)句覆蓋元素集合;
對(duì)于分支覆蓋準(zhǔn)則,提取被測(cè)試單元的函數(shù)中,每一個(gè)可達(dá)分支作為分支覆蓋元素,組成分支覆蓋元素集合;
對(duì)于C/DC覆蓋準(zhǔn)則,提取被測(cè)試單元的函數(shù)中,每個(gè)覆蓋元素包括可被執(zhí)行的判定表達(dá)式;判定表達(dá)式中,所有取值既可以為真又可以為假的簡(jiǎn)單條件,由此遍歷整個(gè)被測(cè)單元,組成C/DC覆蓋元素集合;
對(duì)于MC/DC覆蓋準(zhǔn)則,提取被測(cè)試單元的函數(shù)中,每個(gè)覆蓋元素包括可被執(zhí)行的判定表達(dá)式;判定表達(dá)式中,所有可以獨(dú)立影響判定表達(dá)式結(jié)果的簡(jiǎn)單條件,由此遍歷整個(gè)被測(cè)單元,組成MC/DC覆蓋元素集合;
對(duì)于路徑覆蓋準(zhǔn)則,提取被測(cè)試單元的函數(shù)中,所有可達(dá)路徑作為覆蓋元素,組成路徑覆蓋元素集合;
對(duì)于函數(shù)覆蓋準(zhǔn)則,提取被測(cè)試單元的類(lèi)(對(duì)于函數(shù)直接構(gòu)成類(lèi)的情況)或者文件(對(duì)于函數(shù)直接構(gòu)成文件的情況)中,所有可被執(zhí)行的函數(shù)作為函數(shù)覆蓋元素,組成函數(shù)覆蓋元素集合;假設(shè)函數(shù)中只要有一條路徑可被執(zhí)行,就認(rèn)為該函數(shù)可被執(zhí)行;
對(duì)于類(lèi)覆蓋準(zhǔn)則,提取被測(cè)試單元的文件中所有可被執(zhí)行的類(lèi)作為類(lèi)覆蓋元素,構(gòu)成類(lèi)覆蓋元素集合;
對(duì)于文件覆蓋準(zhǔn)則,提取被測(cè)試單元中所有可被執(zhí)行的文件作為文件覆蓋元素,組成文件覆蓋元素集合;對(duì)于由類(lèi)直接組成文件的情況,該文件中只要有一個(gè)類(lèi)可被執(zhí)行,就認(rèn)為該文件可被執(zhí)行;對(duì)于由函數(shù)直接組成文件的情況,該文件中只要有一個(gè)函數(shù)可被執(zhí)行, 就認(rèn)為該文件可被執(zhí)行。所述步驟C包括
對(duì)于語(yǔ)句覆蓋準(zhǔn)則,在語(yǔ)句覆蓋元素集合的每個(gè)元素中插入探針函數(shù),以便記錄執(zhí)行測(cè)試用例過(guò)程中語(yǔ)句塊的被覆蓋情況;
對(duì)于分支覆蓋準(zhǔn)則,在分支覆蓋元素集合每個(gè)元素中插入分支探針函數(shù),以便記錄執(zhí)行測(cè)試用例過(guò)程中分支的被覆蓋情況;
對(duì)于C/DC覆蓋準(zhǔn)則,在C/DC覆蓋元素集合的每個(gè)元素中插入探針函數(shù),即在每個(gè)可執(zhí)行判定中插入分支探針函數(shù),在對(duì)應(yīng)判定中所有取值既可以為真又可以為假的簡(jiǎn)單條件處插入條件探針函數(shù),以便記錄執(zhí)行測(cè)試用例過(guò)程中C/DC元素的被覆蓋情況;
對(duì)于MC/DC覆蓋準(zhǔn)則,在MC/DC覆蓋元素集合中的每個(gè)元素內(nèi)插入探針函數(shù);即在每個(gè)可執(zhí)行判定處插入分支探針函數(shù),在對(duì)應(yīng)判定中的所有可獨(dú)立影響判定的簡(jiǎn)單條件處插入條件探針函數(shù),以便記錄執(zhí)行測(cè)試用例過(guò)程中MC/DC元素的被覆蓋情況;
對(duì)于路徑覆蓋準(zhǔn)則,基于語(yǔ)句覆蓋進(jìn)行統(tǒng)計(jì),所以不用額外插入探針函數(shù); 對(duì)于函數(shù)覆蓋準(zhǔn)則,基于路徑覆蓋進(jìn)行統(tǒng)計(jì),所以不用額外插入探針函數(shù); 對(duì)于類(lèi)覆蓋準(zhǔn)則,基于函數(shù)覆蓋進(jìn)行統(tǒng)計(jì),所以不用額外插入探針函數(shù); 對(duì)于文件覆蓋準(zhǔn)側(cè),基于類(lèi)或者函數(shù)覆蓋進(jìn)行統(tǒng)計(jì),所以不用額外插入探針函數(shù)。所述步驟D包括
對(duì)于系統(tǒng)自動(dòng)執(zhí)行,系統(tǒng)自動(dòng)生成被測(cè)單元的測(cè)試用例,生成驅(qū)動(dòng)文件,逐個(gè)調(diào)用測(cè)試用例,將驅(qū)動(dòng)文件和插入探針函數(shù)之后的被測(cè)單元所在文件鏈接生成可執(zhí)行文件,然后運(yùn)行可執(zhí)行文件,進(jìn)行測(cè)試執(zhí)行;
對(duì)于用戶手動(dòng)執(zhí)行,由用戶手動(dòng)對(duì)預(yù)處理后的待測(cè)程序生成可能的樁函數(shù)、測(cè)試用例和驅(qū)動(dòng)文件,并將驅(qū)動(dòng)文件和所述的插入探針函數(shù)之后的被測(cè)單元所在文件進(jìn)行鏈接,生成可執(zhí)行文件并運(yùn)行,進(jìn)行測(cè)試執(zhí)行。所述步驟E具體包括
E1、利用被測(cè)試程序的探針函數(shù)的返回信息,得到被覆蓋元素集合; E2、分析覆蓋結(jié)果,通過(guò)圖形界面的方式標(biāo)識(shí)出源代碼中已覆蓋元素和未覆蓋元素,并計(jì)算出被測(cè)單元的語(yǔ)句覆蓋率、分支覆蓋率、C/DC覆蓋率、MC/DC覆蓋率、路徑覆蓋率、函數(shù)覆蓋率、類(lèi)覆蓋率、文件覆蓋率。進(jìn)一步地,所述步驟El包括
E11、對(duì)于語(yǔ)句覆蓋準(zhǔn)則,探針函數(shù)返回測(cè)試過(guò)程中被測(cè)單元語(yǔ)句覆蓋集合的所有被覆蓋語(yǔ)句塊對(duì)應(yīng)的數(shù)字;
E12、對(duì)于分支覆蓋準(zhǔn)則,探針函數(shù)返回測(cè)試過(guò)程中被測(cè)單元分支覆蓋集合的所有被覆蓋的分支對(duì)應(yīng)的數(shù)字;
E13、對(duì)于C/DC覆蓋準(zhǔn)則,探針函數(shù)返回測(cè)試過(guò)程中被測(cè)單元C/DC覆蓋集合的被覆蓋元素(所有被覆蓋的判定以及判定中所有被覆蓋的簡(jiǎn)單條件)對(duì)應(yīng)的數(shù)字;
E14、對(duì)于MC/DC覆蓋準(zhǔn)則,探針函數(shù)返回測(cè)試過(guò)程中被測(cè)單元MC/DC覆蓋集合的被覆蓋元素(所有被覆蓋的判定,以及判定中所有被覆蓋的可獨(dú)立影響判定的簡(jiǎn)單條件)對(duì)應(yīng)的數(shù)字;
E15、對(duì)于路徑覆蓋準(zhǔn)則,根據(jù)步驟Ell中獲得的語(yǔ)句覆蓋集合的被覆蓋語(yǔ)句塊,按照一條路徑被覆蓋當(dāng)且僅當(dāng)此路徑上的所有語(yǔ)句塊被覆蓋的原則,提取出被測(cè)試單元的所有被覆蓋路徑;
E16、對(duì)于函數(shù)覆蓋準(zhǔn)則,根據(jù)步驟E15中獲得的路徑覆蓋集合中被覆蓋路徑,按照一個(gè)函數(shù)被覆蓋當(dāng)且僅當(dāng)此函數(shù)中至少有一條路徑被覆蓋的原則,提取出被測(cè)試類(lèi)的所有被覆蓋函數(shù)(對(duì)于文件直接由類(lèi)構(gòu)成的情況)或文件中的所有被覆蓋函數(shù)(對(duì)于文件直接由函數(shù)構(gòu)成的情況);
E17、對(duì)于類(lèi)覆蓋準(zhǔn)則,根據(jù)步驟E16中獲得的被覆蓋函數(shù),按照一個(gè)類(lèi)被覆蓋當(dāng)且僅當(dāng)此類(lèi)中至少有一個(gè)函數(shù)被覆蓋的原則,提取出被測(cè)試文件的所有被覆蓋類(lèi);
E18、對(duì)于文件覆蓋準(zhǔn)則,如果文件直接由類(lèi)構(gòu)成,根據(jù)步驟E17中獲得的被覆蓋類(lèi),按照一個(gè)文件被覆蓋當(dāng)且僅當(dāng)此文件中至少有一個(gè)類(lèi)被覆蓋的原則,或者根據(jù)E16中獲得的被覆蓋函數(shù),按照一個(gè)文件被覆蓋當(dāng)且僅當(dāng)此文件中至少有一個(gè)函數(shù)被覆蓋的原則,提取出被測(cè)試工程的所有被覆蓋文件。本發(fā)明所提供的基于覆蓋率量化指標(biāo)確定軟件測(cè)試過(guò)程充分性的方法,具有以下優(yōu)點(diǎn)
該方法一方面擴(kuò)展了傳統(tǒng)覆蓋率的使用階段,適用于評(píng)估不同測(cè)試階段中的多種動(dòng)態(tài)測(cè)試方法,測(cè)試階段包括單元測(cè)試、集成測(cè)試和系統(tǒng)測(cè)試;另一方面擴(kuò)展了傳統(tǒng)單元測(cè)試的覆蓋準(zhǔn)則,提出文件覆蓋、方法覆蓋和類(lèi)覆蓋等準(zhǔn)則。并能夠按照給定的覆蓋準(zhǔn)則,對(duì)被測(cè)單元進(jìn)行靜態(tài)分析,得到待覆蓋元素集合,也能夠根據(jù)用戶測(cè)試需求,進(jìn)行動(dòng)態(tài)測(cè)試執(zhí)行, 統(tǒng)計(jì)被覆蓋元素,并計(jì)算覆蓋率,從而能夠根據(jù)覆蓋率量化指標(biāo)來(lái)確定軟件測(cè)試過(guò)程和方法的充分性,通過(guò)使用多種覆蓋準(zhǔn)則統(tǒng)計(jì)的覆蓋率進(jìn)行衡量,提高了評(píng)估測(cè)試的效率和準(zhǔn)確性。
圖1為本發(fā)明基于覆蓋率量化指標(biāo)確定軟件測(cè)試過(guò)程充分性的方法流程示意圖; 圖2為本發(fā)明軟件測(cè)試過(guò)程進(jìn)行自動(dòng)單元?jiǎng)澐值姆椒鞒淌疽鈭D3為本發(fā)明軟件測(cè)試過(guò)程進(jìn)行自動(dòng)測(cè)試執(zhí)行的方法流程示意圖。
具體實(shí)施例方式下面結(jié)合附圖及本發(fā)明的實(shí)施例對(duì)本發(fā)明的方法作進(jìn)一步詳細(xì)的說(shuō)明。白盒自動(dòng)化軟件測(cè)試中多種覆蓋率的統(tǒng)一計(jì)算方法可以采用不同的測(cè)試工具及測(cè)試方法動(dòng)態(tài)執(zhí)行被測(cè)程序,本發(fā)明提供的確定軟件測(cè)試過(guò)程充分性的方法,是一種借助自動(dòng)化軟件測(cè)試的覆蓋率作為量化指標(biāo)來(lái)確定所進(jìn)行的軟件測(cè)試過(guò)程是否充分的手段,其基本思想是讀取待測(cè)程序,對(duì)其進(jìn)行靜態(tài)分析,根據(jù)用戶測(cè)試需求,將被測(cè)程序劃分成測(cè)試單元。其中,當(dāng)選擇系統(tǒng)自動(dòng)執(zhí)行時(shí),系統(tǒng)將單個(gè)函數(shù)作為一個(gè)被測(cè)單元,當(dāng)選擇人工手動(dòng)執(zhí)行時(shí),由用戶選擇需要測(cè)試的一個(gè)或多個(gè)函數(shù)、類(lèi)或者文件,系統(tǒng)將其作為一個(gè)被測(cè)單元。然后由用戶選擇覆蓋準(zhǔn)則,根據(jù)生成的被測(cè)單元的抽象語(yǔ)法樹(shù)和控制流圖,提取待覆蓋的元素集合,對(duì)被測(cè)單元的程序插入相應(yīng)的探針函數(shù),可采用自動(dòng)和人工兩種方式進(jìn)行動(dòng)態(tài)測(cè)試執(zhí)行,根據(jù)執(zhí)行返回結(jié)果,得到被覆蓋元素,進(jìn)而計(jì)算出被測(cè)單元的覆蓋率。圖1為本發(fā)明基于覆蓋率量化指標(biāo)確定軟件測(cè)試過(guò)程充分性的方法流程示意圖, 如圖1所示,主要包括如下步驟
步驟1、對(duì)被測(cè)程序進(jìn)行預(yù)編譯、詞法分析和語(yǔ)法分析,得到程序的抽象語(yǔ)法樹(shù)、控制流圖和函數(shù)之間的調(diào)用關(guān)系圖,并根據(jù)用戶測(cè)試需求,自動(dòng)生成被測(cè)單元。所述步驟1,具體包括
步驟11、根據(jù)被測(cè)程序中的函數(shù)調(diào)用關(guān)系,對(duì)被測(cè)程序進(jìn)行單元?jiǎng)澐?,得到被測(cè)單元。所述被測(cè)單元是指根據(jù)用戶測(cè)試需求,將被測(cè)試程序劃分成的獨(dú)立的測(cè)試對(duì)象, 可以是一個(gè)或多個(gè)函數(shù)、類(lèi)、文件等。被測(cè)工程以被測(cè)單元為單位進(jìn)行劃分,采用自動(dòng)劃分時(shí),單個(gè)的函數(shù)作為一個(gè)被測(cè)單元,采用人工干預(yù)劃分時(shí),由用戶指定每個(gè)被測(cè)單元的組成,可以是若干個(gè)函數(shù)、類(lèi)、文件,或者它們的任意組合。所述步驟11進(jìn)一步包括
步驟111、自動(dòng)劃分時(shí),系統(tǒng)將單個(gè)的函數(shù)作為一個(gè)被測(cè)單元。自動(dòng)單元?jiǎng)澐值牧鞒淌疽鈭D,如圖2所示
以被測(cè)程序S為例,其包含3個(gè)函數(shù)fl(typel vl),f2(type2 v2), f 3 (type3 v3), typel、type2、type3為參數(shù)類(lèi)型,對(duì)其進(jìn)行靜態(tài)分析后,得到函數(shù)調(diào)用關(guān)系,提取每個(gè)函數(shù)的輸入和輸出,將每一個(gè)有輸入的函數(shù)作為一個(gè)被測(cè)單元,由此可知,自動(dòng)劃分的被測(cè)單元有3個(gè),即爐11213},其中被測(cè)單元?1表示為< f Ktypel vl),f 1的輸入輸出信息〉,被測(cè)單元F2表示為< f2 (type2 v2),f2的輸入輸出信息 >,被測(cè)單元F3表示為< f3 (type3 v3),f3的輸入輸出信息〉。步驟112、人工干預(yù)劃分時(shí),由用戶指定每個(gè)被測(cè)單元包括的若干個(gè)函數(shù)、類(lèi)、文件,或者它們的任意組合,并循環(huán)執(zhí)行,直到測(cè)試工程全部被劃分完畢,得到測(cè)試工程的被測(cè)單元集合。步驟2、根據(jù)覆蓋準(zhǔn)則(包括語(yǔ)句、分支、C/DC、MC/DC、路徑、函數(shù)、類(lèi)、文件等),從抽象語(yǔ)法樹(shù)和控制流圖中提取被測(cè)單元中相應(yīng)的待覆蓋元素集合。其具體包括
步驟21、對(duì)于語(yǔ)句覆蓋準(zhǔn)則,提取被測(cè)試單元的函數(shù)中每一個(gè)可達(dá)語(yǔ)句塊作為語(yǔ)句覆蓋元素,組成語(yǔ)句覆蓋元素集合。屬于同一個(gè)塊的語(yǔ)句若其中的某一語(yǔ)句被覆蓋,則該塊所有的語(yǔ)句均能被執(zhí)行。步驟22、對(duì)于分支覆蓋準(zhǔn)則,提取被測(cè)試單元的函數(shù)中,每一個(gè)可達(dá)分支(與可被執(zhí)行判定的結(jié)果一一對(duì)應(yīng))作為分支覆蓋元素,組成分支覆蓋元素集合。例如,對(duì)應(yīng)在被測(cè)單元的控制流圖上,所有有向邊即為分支覆蓋元素集合。步驟23、對(duì)于C/DC覆蓋準(zhǔn)則,提取被測(cè)試單元的函數(shù)中,每個(gè)覆蓋元素包括
1)可被執(zhí)行的判定表達(dá)式;
2)判定表達(dá)式中,所有取值既可以為真又可以為假的簡(jiǎn)單條件,由此遍歷整個(gè)被測(cè)單元,組成C/DC覆蓋元素集合。例如對(duì)應(yīng)在被測(cè)單元的控制流圖上,表示為
1)有向邊E作為一個(gè)C/DC覆蓋元素;
2)當(dāng)E為判斷節(jié)點(diǎn)N的一條分支時(shí),<v>為一個(gè)C/DC覆蓋元素,其中ν是N的判定表達(dá)式的一組謂詞取值,它是由判定表達(dá)式滿足C/DC覆蓋準(zhǔn)則的要求所確定的。步驟對(duì)、對(duì)于MC/DC覆蓋準(zhǔn)則,提取被測(cè)試單元的函數(shù)中,每個(gè)覆蓋元素包括
1)可被執(zhí)行的判定表達(dá)式;
2)判定表達(dá)式中,所有可以獨(dú)立影響判定的簡(jiǎn)單條件,由此遍歷整個(gè)被測(cè)單元,組成 MC/DC覆蓋元素集合。例如對(duì)應(yīng)在被測(cè)單元的控制流圖上,表示為取控制流圖上一條有向邊E
1)當(dāng)E為非判斷節(jié)點(diǎn)的分支時(shí),E作為一個(gè)MC/DC覆蓋元素;
2)當(dāng)E為判斷節(jié)點(diǎn)N的一條分支時(shí),<E,v>作為一個(gè)MC/DC覆蓋元素,其中ν是N的判定表達(dá)式的一組謂詞取值,它是由判定表達(dá)式滿足MC/DC覆蓋準(zhǔn)則的要求所確定的。步驟25、對(duì)于路徑覆蓋準(zhǔn)則,提取被測(cè)試單元的函數(shù)中,所有可達(dá)路徑作為覆蓋元素,組成路徑覆蓋元素集合。例如對(duì)應(yīng)在被測(cè)單元的控制流圖上,表示為提取控制流圖上一個(gè)有序節(jié)點(diǎn)序列和一個(gè)有序有向邊序列,使得該子圖具有唯一輸入節(jié)點(diǎn)和唯一輸出節(jié)點(diǎn),且輸入節(jié)點(diǎn)為函數(shù)入口,輸出節(jié)點(diǎn)為函數(shù)出口。步驟沈、對(duì)于函數(shù)覆蓋準(zhǔn)則,提取被測(cè)試單元的類(lèi)(對(duì)于函數(shù)直接構(gòu)成類(lèi)的情況) 或者文件(對(duì)于函數(shù)直接構(gòu)成文件的情況)中,所有可被執(zhí)行函數(shù)作為函數(shù)覆蓋元素,組成函數(shù)覆蓋元素集合。假設(shè)函數(shù)中只要有一條路徑可被執(zhí)行,就認(rèn)為該函數(shù)可被執(zhí)行。步驟27、對(duì)于類(lèi)覆蓋準(zhǔn)則,提取被測(cè)試單元的文件中所有可被執(zhí)行的類(lèi)作為元素, 構(gòu)成類(lèi)覆蓋元素集合。假設(shè)類(lèi)中只要有一個(gè)函數(shù)被執(zhí)行,就認(rèn)為該類(lèi)被執(zhí)行。步驟觀、對(duì)于文件覆蓋準(zhǔn)則,提取被測(cè)試單元中所有可被執(zhí)行文件作為元素,組成文件覆蓋元素集合。對(duì)于由類(lèi)直接組成文件的情況,假設(shè)文件中只要有一個(gè)類(lèi)可被執(zhí)行,就認(rèn)為該文件可被執(zhí)行。對(duì)于由函數(shù)直接組成文件的情況,假設(shè)文件中只要有一個(gè)函數(shù)可被執(zhí)行,就認(rèn)為該文件可被執(zhí)行。步驟3、根據(jù)上述覆蓋準(zhǔn)則,在被測(cè)單元的程序中插入相應(yīng)的探針函數(shù)。下面以典型程序statistics, c具體說(shuō)明如何根據(jù)不同覆蓋準(zhǔn)則插入探針函數(shù)。 程序功能為輸入一行字符,分別統(tǒng)計(jì)出其中英文字母、空格、數(shù)字和其它字符的個(gè)數(shù)。源程序如下
#include 〃stdio. h〃
void statistics(char c)
{
int Ietters=Ojspace=0,digit=0,others=0;
if (c!=,V)
{
if (c>=,a,&&c〈=,z,I I c>=,A,&&c〈=,Z,)
letters++; else if (c==,,)
space++; else if(c>=,0,&&c〈=,9,) digit++; else
others++;
ι
printf("all in all :char = %d space = %d digit = %d others=%d\
η〃,letters, space, digit, others); }·
該步驟3具體包括
步驟31、對(duì)于語(yǔ)句覆蓋準(zhǔn)則,在語(yǔ)句覆蓋元素集合的每個(gè)元素(均為可達(dá)語(yǔ)句塊)中插入語(yǔ)句探針函數(shù)。語(yǔ)句采用以“塊”為單位的語(yǔ)句插裝,這里,所謂塊就是邏輯上連續(xù)執(zhí)行的相鄰最大的語(yǔ)句集?,F(xiàn)在在以下結(jié)點(diǎn)處插入語(yǔ)句探針函數(shù)函數(shù)的開(kāi)始處、if語(yǔ)句塊、else語(yǔ)句塊、case語(yǔ)句塊、default語(yǔ)句塊、label語(yǔ)句塊、for語(yǔ)句塊、while語(yǔ)句塊、do-while語(yǔ)句塊、catch語(yǔ)句塊、finally語(yǔ)句塊、跳轉(zhuǎn)語(yǔ)句前。語(yǔ)句探針函數(shù)void _Block_Cov(int blockNum)表示在插裝點(diǎn)對(duì)應(yīng)的語(yǔ)句塊的所有語(yǔ)句得到執(zhí)行。其中blockNum唯一標(biāo)識(shí)一個(gè)語(yǔ)句塊的抽象語(yǔ)法樹(shù)根結(jié)點(diǎn),當(dāng)語(yǔ)句塊被執(zhí)行時(shí),語(yǔ)句塊對(duì)應(yīng)的標(biāo)識(shí)符被記錄。語(yǔ)句探針函數(shù)實(shí)現(xiàn)如下
void_Block_Cov(int blockNum)
{
cppTestSendData(blockNum);
ι
源代碼為a=d+b ;
10插裝后的代碼為 a=d+b;
—Block—Cov(Num);
由上述分析可得到被測(cè)程序statistics, c在語(yǔ)句覆蓋準(zhǔn)則下的探針函數(shù)插入結(jié)果 #include 〃stdio· h〃
void statistics(char c)
{
int Ietters=O, space=0, digit=0, Others=O; _Block_Cov(0);
if (c!=,\n')
{
_Block_Cov(l);{
if (c>=' a,&&c<=' z' I I c>=,A,&&c<=' Z')
{
_Block_Cov(2);letters++;
}
else {
_Block_Cov(3) ; if (c==',)
{
—Block—Cov(4);space++;
ι
else {
_Block_Cov (5) ; if (c>=' O,&&c<=' 9,)
{
—Block—Cov(6);digit++;
ι
else {
—Block—Cov(7);others++;
ι ι ι ι ι
printf("all in all :char = %d space = %d digit = %d others=%d\ η〃,letters, space, digit, others);
ι
記為instrumentjtatistics. c,其中探針函數(shù)的正負(fù)返回取值的上下限可人為設(shè)置。步驟32、對(duì)于分支覆蓋準(zhǔn)則,在分支覆蓋元素集合每個(gè)元素中插入分支探針函數(shù)。分支探針函數(shù) bool _Bran_Cov(bool exp, Int PositiveBranchId, intnegitiveBranchld)獲取運(yùn)行時(shí)分支情況,并且不改變?cè)创a的執(zhí)行邏輯。在運(yùn)行時(shí)根據(jù)接收到的數(shù)字是正數(shù)還是負(fù)數(shù),來(lái)判別相應(yīng)分支的取值。其中返回值PositiveBranchld和 negitiveBranchld分別表示分支取值為真和假。分支探針函數(shù)的實(shí)現(xiàn)如下
bool _Bran_Cov(bool exp, Int PositiveBranchld, int negitiveBranchld)
{
if (exp)
cppTestSendData (PositiveBranchld);
else
cppTestSendData (negitiveBranchld); return exp;//不改變程序的執(zhí)行邏輯
}
源代碼if(a&&b)
插裝后代碼if (_Branch_Cov (a&&b, trueNum, FalseNum))
由上述分析可得到被測(cè)程序statistics, c在分支覆蓋準(zhǔn)則下的探針函數(shù)插入結(jié)果
void statistics(char c)
{
int Ietters=Ojspace=0,digit=0,others=0; —Block—Cov(O);
if (—Bran—Co ν (c!=,\n,,-2147483647,1))
{
if(—Bran—Cov(c>=’a’&&c〈=’z’ | | c>=’ A’ &&c〈=’ Z’,-2147483646,2)) letters++;
else if (_Bran_Cov(c== \-2147483645,3)) space++;
else if (—Bran—Cov (c>=,O,&&c〈=,9,,-2147483644,4)) digit++;
else
others++;
ι
printf(〃all in all:char=%d space=%d digit=%d others=%d\n〃,letters, space, digit, others);
ι
記為instrumentjtatistics. c,其中探針函數(shù)的正負(fù)返回取值的上下限可人為設(shè)置。步驟33、對(duì)于C/DC覆蓋準(zhǔn)則,在C/DC覆蓋元素集合的每個(gè)元素中插入探針函數(shù), 即在每個(gè)可被執(zhí)行判定中插入分支探針函數(shù),在對(duì)應(yīng)判定中所有取值既可以為真又可以為假的簡(jiǎn)單條件處插入條件探針函數(shù)。# ^ # 0 ^ bool _Cond_Cov(bool exp, int positiveCondld, int negitiveCondld)獲取運(yùn)行階段被執(zhí)行簡(jiǎn)單條件的取值情況,并且不改變?cè)创a的執(zhí)行邏
12輯。在運(yùn)行時(shí)根據(jù)接收到的數(shù)字是正數(shù)還是負(fù)數(shù),來(lái)判別相應(yīng)判定的取值。其中返回值 positiveCondld和negitiveCondld分別表示條件取值為真和假。條件探針的實(shí)現(xiàn)如下
bool _Cond_Cov(bool exp, Int positiveCondld, int negitiveCondld)
{
if (exp)
cppTestSendData (positiveCondld);
else
cppTestSendData (negitiveCondld); return exp;//不改變程序的執(zhí)行邏輯
}
在判定表達(dá)式上插入分支探針并為判定表達(dá)式內(nèi)的每個(gè)條件表達(dá)式插入條件探針。在動(dòng)態(tài)運(yùn)行時(shí),根據(jù)接收到的插裝信息,得到分支取值真假和分支內(nèi)條件的取值真假。源代碼if(a&&b),
插入分支探針和條件探針后的代碼
if (_Branch_C0V(if(_Cond_Cov(a, trueNum,falseNum)&&—Cond_Cov(b,trueNum, falseNum)),trueNum, FalseNum))
由上述分析可得到被測(cè)程序statistics, c在C/DC覆蓋準(zhǔn)則下的探針函數(shù)插入結(jié)果
void statistics(char c)
{
int Ietters=O, space=0, digit=0, others=0; _Block_Cov(0);
if(_Bran_Cov(_Cond_Cov(c!=,\n',-2147483647,1),-2147483646,2))
{
if(_Bran_Cov(_Cond_Cov(c> = ' a',-2 1 47483645, 3)&&_Cond_ Cov (c<=' z',-2147483644,4) | | _Cond_Cov (c>=,A,,-2147483643,5) &&_Cond_Cov (c<=' Z', -2147483642,6),-2147483641,7)) letters++;
else if(_Bran_Cov(_Cond_Cov(c==',,-2147483640,8),-2147483639,9)) space++;
else if(_Bran_Cov (_Cond_Cov(c>=' O,,-2147483638,10)&&_Cond_Cov(c<=' 9,,-2 147483637, 11),-2147483636, 12)) digit++;
else
others++;
}
printf("all in all :char = %d space = %d digit = %d others = %d\ η〃,letters, space, digit, others);
ι
13記為instrumentjtatistics. c,其中探針函數(shù)的正負(fù)返回取值的上下限可人為設(shè)置。步驟34、對(duì)于MC/DC覆蓋準(zhǔn)則,在MC/DC覆蓋元素集合中的每個(gè)元素內(nèi)插入探針函數(shù)。即在每個(gè)可被執(zhí)行判定處插入分支探針函數(shù),在對(duì)應(yīng)判定中的所有可獨(dú)立影響判定的簡(jiǎn)單條件處插入條件探針函數(shù),方法同步驟32和步驟33。步驟35、對(duì)于路徑覆蓋準(zhǔn)則,基于語(yǔ)句覆蓋進(jìn)行統(tǒng)計(jì),所以不用額外插入探針函數(shù)。步驟36、對(duì)于函數(shù)覆蓋準(zhǔn)則,基于路徑覆蓋進(jìn)行統(tǒng)計(jì),所以不用額外插入探針函數(shù)。步驟37、對(duì)于類(lèi)覆蓋準(zhǔn)則,基于函數(shù)覆蓋進(jìn)行統(tǒng)計(jì),所以不用額外插入探針函數(shù)。步驟38、對(duì)于文件覆蓋準(zhǔn)側(cè),基于類(lèi)或者函數(shù)覆蓋進(jìn)行統(tǒng)計(jì),所以不用額外插入探針函數(shù)。步驟4、根據(jù)用戶測(cè)試需求,選擇采用系統(tǒng)自動(dòng)執(zhí)行方式或用戶手動(dòng)執(zhí)行方式對(duì)插入探針函數(shù)的被測(cè)單元進(jìn)行動(dòng)態(tài)測(cè)試。 其中,所述步驟4具體包括
步驟41、對(duì)于系統(tǒng)自動(dòng)執(zhí)行,系統(tǒng)自動(dòng)生成被測(cè)單元的測(cè)試用例,并將其生成可執(zhí)行文件,進(jìn)行測(cè)試執(zhí)行。自動(dòng)測(cè)試執(zhí)行的過(guò)程如圖3所示,對(duì)于一個(gè)測(cè)試單元,生成對(duì)應(yīng)的測(cè)試用例庫(kù),用來(lái)保存所有有效的測(cè)試用例。該步驟41進(jìn)一步包括
步驟411、系統(tǒng)根據(jù)覆蓋準(zhǔn)則以及被測(cè)單元的輸入?yún)?shù)生成相應(yīng)的測(cè)試用例; 步驟412、生成驅(qū)動(dòng)文件,用于逐個(gè)調(diào)用測(cè)試用例;
步驟413、將驅(qū)動(dòng)文件和步驟3中插入探針函數(shù)之后的被測(cè)單元所在文件鏈接生成可執(zhí)行文件;
步驟414、運(yùn)行可執(zhí)行文件,同時(shí)測(cè)試結(jié)果將被記錄和分析,并最終生成一個(gè)結(jié)果分析報(bào)告,將所有有效的測(cè)試用例生成測(cè)試用例庫(kù)。例如對(duì)于被測(cè)程序statistics, c,系統(tǒng)根據(jù)其輸入?yún)?shù)類(lèi)型和范圍生成一個(gè)測(cè)試用例(‘b,),并生成驅(qū)動(dòng)文件 driverFile_statistics. c,將 driverFile_statistics. c 與插入探針函數(shù)之后的被測(cè)單元文件instrumentstatistics. c進(jìn)行鏈接,生成可執(zhí)行文件 test_statistics. exe,然后運(yùn)行可執(zhí)行文件,并得到測(cè)試用例庫(kù)testcase_statistics. mdb0步驟步驟42、對(duì)于用戶手動(dòng)執(zhí)行,由用戶手動(dòng)對(duì)預(yù)處理后的待測(cè)程序生成可能的樁函數(shù)、測(cè)試用例和驅(qū)動(dòng)文件,并將驅(qū)動(dòng)文件和步驟3中插入探針函數(shù)之后的被測(cè)單元所在文件進(jìn)行鏈接,生成可執(zhí)行文件并運(yùn)行,進(jìn)行測(cè)試執(zhí)行。以源程序statistics, c為例,預(yù)處理后用戶根據(jù)函數(shù)信息,生成樁函數(shù)_STUB_ statistics,進(jìn)而生成樁代碼,然后根據(jù)指定的測(cè)試用例(例如‘b’),生成驅(qū)動(dòng)函數(shù)_ DRIVEILstatistics,調(diào)用測(cè)試用例,最后將樁代碼、驅(qū)動(dòng)函數(shù)、插入探針函數(shù)之后的被測(cè)程序進(jìn)行鏈接,生成可執(zhí)行文件testjtatistics. exe,運(yùn)行可執(zhí)行文件,進(jìn)行測(cè)試執(zhí)行。步驟5、根據(jù)動(dòng)態(tài)測(cè)試執(zhí)行的返回信息,得到測(cè)試單元的被覆蓋元素集合,并計(jì)算被測(cè)單元的覆蓋率。其具體包括
步驟51、利用被測(cè)試程序的探針函數(shù)的返回信息,得到被覆蓋元素集合。其中步驟51進(jìn)一步包括步驟511、對(duì)于語(yǔ)句覆蓋準(zhǔn)則,探針函數(shù)返回測(cè)試過(guò)程中被測(cè)單元語(yǔ)句覆蓋集合的所有被覆蓋語(yǔ)句塊對(duì)應(yīng)的數(shù)字。例如在步驟4中執(zhí)行的測(cè)試用例(‘b’),被測(cè)單元statistics, c的探針函數(shù)返回結(jié)果為0,1,2,由此可知探針函數(shù) _Block_Cov (0),_Block_Cov (1),_Block_Cov (2)所標(biāo)識(shí)的語(yǔ)句塊被覆蓋。步驟512、對(duì)于分支覆蓋準(zhǔn)則,探針函數(shù)返回測(cè)試過(guò)程中被測(cè)單元分支覆蓋集合的所有被覆蓋的分支對(duì)應(yīng)的數(shù)字。例如在步驟4中執(zhí)行的測(cè)試用例(‘b’),被測(cè)單元statistics, c的探針函數(shù)返回結(jié)果為0,-2147483647,-2147483646,由此可知探針函數(shù) _Bran_Cov (0),_Bran_Cov (-2147483647), _Bran_Co ν (-2147483646)所標(biāo)識(shí)的分支被覆蓋。步驟513、對(duì)于C/DC覆蓋準(zhǔn)則,探針函數(shù)返回測(cè)試過(guò)程中被測(cè)單元C/DC覆蓋集合的被覆蓋元素(所有被覆蓋的判定,以及判定中被覆蓋的所有簡(jiǎn)單條件)對(duì)應(yīng)的數(shù)字。步驟514、對(duì)于MC/DC覆蓋準(zhǔn)則,探針函數(shù)返回測(cè)試過(guò)程中被測(cè)單元MC/DC覆蓋集合的被覆蓋元素(所有被覆蓋的判定,以及判定中所有被覆蓋的可獨(dú)立影響判定的簡(jiǎn)單條件)對(duì)應(yīng)的數(shù)字。步驟515、對(duì)于路徑覆蓋準(zhǔn)則,根據(jù)步驟Ell中獲得的語(yǔ)句覆蓋集合的被覆蓋語(yǔ)句塊,按照一條路徑被覆蓋當(dāng)且僅當(dāng)此路徑上的所有語(yǔ)句塊被覆蓋的原則,提取出被測(cè)試單元的所有被覆蓋路徑。步驟516、對(duì)于函數(shù)覆蓋準(zhǔn)則,根據(jù)步驟E15中獲得的路徑覆蓋集合中被覆蓋路徑,按照一個(gè)函數(shù)被覆蓋當(dāng)且僅當(dāng)此函數(shù)中至少有一條路徑被覆蓋的原則,提取出被測(cè)試類(lèi)的所有被覆蓋函數(shù)(對(duì)于文件直接由類(lèi)構(gòu)成的情況)或文件中的所有被覆蓋函數(shù)(對(duì)于文件直接由函數(shù)構(gòu)成的情況)。步驟517、對(duì)于類(lèi)覆蓋準(zhǔn)則,根據(jù)步驟E16中獲得的被覆蓋函數(shù),按照一個(gè)類(lèi)被覆蓋當(dāng)且僅當(dāng)此類(lèi)中至少有一個(gè)函數(shù)被覆蓋的原則,提取出被測(cè)試文件的所有被覆蓋類(lèi)。步驟518、對(duì)于文件覆蓋準(zhǔn)則,根據(jù)步驟E17中獲得的被覆蓋類(lèi)(對(duì)于文件直接由類(lèi)構(gòu)成的情況),按照一個(gè)文件被覆蓋當(dāng)且僅當(dāng)此文件中至少有一個(gè)類(lèi)被覆蓋的原則,或者根據(jù)E16中獲得的被覆蓋函數(shù)(對(duì)于文件直接由函數(shù)構(gòu)成的情況),按照一個(gè)文件被覆蓋當(dāng)且僅當(dāng)此文件中至少有一個(gè)函數(shù)被覆蓋的原則,提取出被測(cè)試工程的所有被覆蓋文件。步驟52、分析覆蓋結(jié)果,通過(guò)圖形界面的方式標(biāo)識(shí)出源代碼中已覆蓋元素和未覆蓋元素,并計(jì)算出被測(cè)單元的語(yǔ)句覆蓋率、分支覆蓋率、C/DC覆蓋率、MC/DC覆蓋率、路徑覆蓋率、函數(shù)覆蓋率、類(lèi)覆蓋率、文件覆蓋率。其中步驟52進(jìn)一步包括
步驟521、統(tǒng)計(jì)語(yǔ)句覆蓋的覆蓋率,首先統(tǒng)計(jì)步驟511中得到的語(yǔ)句覆蓋元素集合被覆
蓋的語(yǔ)句塊元素個(gè)數(shù)。通過(guò)圖形界面的方式標(biāo)識(shí)出源代碼中已被覆蓋的語(yǔ)句塊元素和未被
覆蓋的語(yǔ)句塊元素。然后統(tǒng)計(jì)步驟21中提取出的語(yǔ)句覆蓋元素集合的元素總個(gè)數(shù),用被覆
蓋的語(yǔ)句塊元素個(gè)數(shù)除以語(yǔ)句覆蓋元素集合的元素總個(gè)數(shù),即可計(jì)算出語(yǔ)句覆蓋率。
_ , CoveredBIockEkmeniMim CoveredRate _ Block =-* 1 U0%
ToialBlock EhmmtiNum上述公式中變量含義如下CoveredP^iie _Block .語(yǔ)句覆蓋率
CoveredBlo ckEhmsniNum 語(yǔ)句覆蓋元素集合中被覆蓋的元素個(gè)數(shù) TotalBhck EkmentNum 語(yǔ)句覆蓋元素集合的元素總個(gè)數(shù)
步驟522、統(tǒng)計(jì)分支覆蓋的覆蓋率,首先統(tǒng)計(jì)步驟512中得到的分支覆蓋元素集合被覆
蓋的分支元素個(gè)數(shù)。通過(guò)圖形界面的方式標(biāo)識(shí)出源代碼中已被覆蓋的分支元素和未被覆蓋
的分支元素。然后統(tǒng)計(jì)步驟22中提取出的分支覆蓋元素集合的元素總個(gè)數(shù),用已被覆蓋的
分支元素個(gè)數(shù)除以分支覆蓋元素集合的總元素個(gè)數(shù),即可計(jì)算出分支覆蓋率。
權(quán)利要求
1.一種基于覆蓋率量化指標(biāo)確定軟件測(cè)試過(guò)程充分性的方法,其特征在于,該方法主要包括A、對(duì)被測(cè)程序進(jìn)行預(yù)編譯、詞法分析和語(yǔ)法分析,得到程序的抽象語(yǔ)法樹(shù)、控制流圖和函數(shù)之間的調(diào)用關(guān)系圖,并根據(jù)用戶測(cè)試需求,自動(dòng)生成被測(cè)單元;B、根據(jù)覆蓋準(zhǔn)則,從所述抽象語(yǔ)法樹(shù)和控制流圖中提取被測(cè)單元中相應(yīng)的待覆蓋元素集合;C、根據(jù)所述的覆蓋準(zhǔn)則,在被測(cè)單元的程序中插入相應(yīng)的探針函數(shù);D、根據(jù)用戶測(cè)試需求,選擇系統(tǒng)自動(dòng)執(zhí)行或用戶手動(dòng)執(zhí)行的方式對(duì)插入探針函數(shù)的被測(cè)單元進(jìn)行動(dòng)態(tài)測(cè)試;E、根據(jù)動(dòng)態(tài)測(cè)試執(zhí)行的返回信息,得到測(cè)試單元的被覆蓋元素集合,并計(jì)算被測(cè)單元的覆蓋率。
2.根據(jù)權(quán)利要求1所述的基于覆蓋率量化指標(biāo)確定軟件測(cè)試過(guò)程充分性的方法,其特征在于,所述步驟A包括根據(jù)被測(cè)程序中的函數(shù)調(diào)用關(guān)系,對(duì)被測(cè)程序進(jìn)行單元?jiǎng)澐?,得到被測(cè)單元;所述被測(cè)單元為根據(jù)用戶測(cè)試需求,將被測(cè)試程序劃分成的獨(dú)立的測(cè)試對(duì)象,其為一個(gè)或多個(gè)函數(shù)、 類(lèi)、文件。
3.根據(jù)權(quán)利要求1所述的基于覆蓋率量化指標(biāo)確定軟件測(cè)試過(guò)程充分性的方法,其特征在于,所述步驟B包括對(duì)于語(yǔ)句覆蓋準(zhǔn)則,提取被測(cè)試單元的函數(shù)中每一個(gè)可達(dá)語(yǔ)句塊作為語(yǔ)句覆蓋元素, 組成語(yǔ)句覆蓋元素集合;對(duì)于分支覆蓋準(zhǔn)則,提取被測(cè)試單元的函數(shù)中,每一個(gè)可達(dá)分支作為分支覆蓋元素,組成分支覆蓋元素集合;對(duì)于C/DC覆蓋準(zhǔn)則,提取被測(cè)試單元的函數(shù)中,每個(gè)覆蓋元素包括可被執(zhí)行的判定表達(dá)式;判定表達(dá)式中,所有取值既可以為真又可以為假的簡(jiǎn)單條件,由此遍歷整個(gè)被測(cè)單元,組成C/DC覆蓋元素集合;對(duì)于MC/DC覆蓋準(zhǔn)則,提取被測(cè)試單元的函數(shù)中,每個(gè)覆蓋元素包括可被執(zhí)行的判定表達(dá)式;判定表達(dá)式中,所有可以獨(dú)立影響判定表達(dá)式結(jié)果的簡(jiǎn)單條件,由此遍歷整個(gè)被測(cè)單元,組成MC/DC覆蓋元素集合;對(duì)于路徑覆蓋準(zhǔn)則,提取被測(cè)試單元的函數(shù)中,所有可達(dá)路徑作為覆蓋元素,組成路徑覆蓋元素集合;對(duì)于函數(shù)覆蓋準(zhǔn)則,提取被測(cè)試單元的類(lèi)(對(duì)于函數(shù)直接構(gòu)成類(lèi)的情況)或者文件(對(duì)于函數(shù)直接構(gòu)成文件的情況)中,所有可被執(zhí)行的函數(shù)作為函數(shù)覆蓋元素,組成函數(shù)覆蓋元素集合;假設(shè)函數(shù)中只要有一條路徑可被執(zhí)行,就認(rèn)為該函數(shù)可被執(zhí)行;對(duì)于類(lèi)覆蓋準(zhǔn)則,提取被測(cè)試單元的文件中所有可被執(zhí)行的類(lèi)作為類(lèi)覆蓋元素,構(gòu)成類(lèi)覆蓋元素集合;對(duì)于文件覆蓋準(zhǔn)則,提取被測(cè)試單元中所有可被執(zhí)行的文件作為文件覆蓋元素,組成文件覆蓋元素集合;對(duì)于由類(lèi)直接組成文件的情況,該文件中只要有一個(gè)類(lèi)可被執(zhí)行,就認(rèn)為該文件可被執(zhí)行;對(duì)于由函數(shù)直接組成文件的情況,該文件中只要有一個(gè)函數(shù)可被執(zhí)行, 就認(rèn)為該文件可被執(zhí)行。
4.根據(jù)權(quán)利要求1所述的基于覆蓋率量化指標(biāo)確定軟件測(cè)試過(guò)程充分性的方法,其特征在于,所述步驟C包括對(duì)于語(yǔ)句覆蓋準(zhǔn)則,在語(yǔ)句覆蓋元素集合的每個(gè)元素中插入探針函數(shù),以便記錄執(zhí)行測(cè)試用例過(guò)程中語(yǔ)句塊的被覆蓋情況;對(duì)于分支覆蓋準(zhǔn)則,在分支覆蓋元素集合每個(gè)元素中插入分支探針函數(shù),以便記錄執(zhí)行測(cè)試用例過(guò)程中分支的被覆蓋情況;對(duì)于C/DC覆蓋準(zhǔn)則,在C/DC覆蓋元素集合的每個(gè)元素中插入探針函數(shù),即在每個(gè)可執(zhí)行判定中插入分支探針函數(shù),在對(duì)應(yīng)判定中所有取值既可以為真又可以為假的簡(jiǎn)單條件處插入條件探針函數(shù),以便記錄執(zhí)行測(cè)試用例過(guò)程中C/DC元素的被覆蓋情況;對(duì)于MC/DC覆蓋準(zhǔn)則,在MC/DC覆蓋元素集合中的每個(gè)元素內(nèi)插入探針函數(shù);即在每個(gè)可執(zhí)行判定處插入分支探針函數(shù),在對(duì)應(yīng)判定中的所有可獨(dú)立影響判定的簡(jiǎn)單條件處插入條件探針函數(shù),以便記錄執(zhí)行測(cè)試用例過(guò)程中MC/DC元素的被覆蓋情況;對(duì)于路徑覆蓋準(zhǔn)則,基于語(yǔ)句覆蓋進(jìn)行統(tǒng)計(jì),所以不用額外插入探針函數(shù); 對(duì)于函數(shù)覆蓋準(zhǔn)則,基于路徑覆蓋進(jìn)行統(tǒng)計(jì),所以不用額外插入探針函數(shù); 對(duì)于類(lèi)覆蓋準(zhǔn)則,基于函數(shù)覆蓋進(jìn)行統(tǒng)計(jì),所以不用額外插入探針函數(shù); 對(duì)于文件覆蓋準(zhǔn)側(cè),基于類(lèi)或者函數(shù)覆蓋進(jìn)行統(tǒng)計(jì),所以不用額外插入探針函數(shù)。
5.根據(jù)權(quán)利要求1或4所述的基于覆蓋率量化指標(biāo)確定軟件測(cè)試過(guò)程充分性的方法, 其特征在于,所述步驟D包括對(duì)于系統(tǒng)自動(dòng)執(zhí)行,系統(tǒng)自動(dòng)生成被測(cè)單元的測(cè)試用例,生成驅(qū)動(dòng)文件,逐個(gè)調(diào)用測(cè)試用例,將驅(qū)動(dòng)文件和插入探針函數(shù)之后的被測(cè)單元所在文件鏈接生成可執(zhí)行文件,然后運(yùn)行可執(zhí)行文件,進(jìn)行測(cè)試執(zhí)行;對(duì)于用戶手動(dòng)執(zhí)行,由用戶手動(dòng)對(duì)預(yù)處理后的待測(cè)程序生成可能的樁函數(shù)、測(cè)試用例和驅(qū)動(dòng)文件,并將驅(qū)動(dòng)文件和所述的插入探針函數(shù)之后的被測(cè)單元所在文件進(jìn)行鏈接,生成可執(zhí)行文件并運(yùn)行,進(jìn)行測(cè)試執(zhí)行。
6.根據(jù)權(quán)利要求1所述的基于覆蓋率量化指標(biāo)確定軟件測(cè)試過(guò)程充分性的方法,其特征在于,所述步驟E具體包括E1、利用被測(cè)試程序的探針函數(shù)的返回信息,得到被覆蓋元素集合; E2、分析覆蓋結(jié)果,通過(guò)圖形界面的方式標(biāo)識(shí)出源代碼中已覆蓋元素和未覆蓋元素,并計(jì)算出被測(cè)單元的語(yǔ)句覆蓋率、分支覆蓋率、C/DC覆蓋率、MC/DC覆蓋率、路徑覆蓋率、函數(shù)覆蓋率、類(lèi)覆蓋率、文件覆蓋率。
7.根據(jù)權(quán)利要求1所述的基于覆蓋率量化指標(biāo)確定軟件測(cè)試過(guò)程充分性的方法,其特征在于,所述步驟El包括E11、對(duì)于語(yǔ)句覆蓋準(zhǔn)則,探針函數(shù)返回測(cè)試過(guò)程中被測(cè)單元語(yǔ)句覆蓋集合的所有被覆蓋語(yǔ)句塊對(duì)應(yīng)的數(shù)字;E12、對(duì)于分支覆蓋準(zhǔn)則,探針函數(shù)返回測(cè)試過(guò)程中被測(cè)單元分支覆蓋集合的所有被覆蓋的分支對(duì)應(yīng)的數(shù)字;E13、對(duì)于C/DC覆蓋準(zhǔn)則,探針函數(shù)返回測(cè)試過(guò)程中被測(cè)單元C/DC覆蓋集合的被覆蓋元素(所有被覆蓋的判定以及判定中所有被覆蓋的簡(jiǎn)單條件)對(duì)應(yīng)的數(shù)字;E14、對(duì)于MC/DC覆蓋準(zhǔn)則,探針函數(shù)返回測(cè)試過(guò)程中被測(cè)單元MC/DC覆蓋集合的被覆蓋元素(所有被覆蓋的判定,以及判定中所有被覆蓋的可獨(dú)立影響判定的簡(jiǎn)單條件)對(duì)應(yīng)的數(shù)字;E15、對(duì)于路徑覆蓋準(zhǔn)則,根據(jù)步驟Ell中獲得的語(yǔ)句覆蓋集合的被覆蓋語(yǔ)句塊,按照一條路徑被覆蓋當(dāng)且僅當(dāng)此路徑上的所有語(yǔ)句塊被覆蓋的原則,提取出被測(cè)試單元的所有被覆蓋路徑;E16、對(duì)于函數(shù)覆蓋準(zhǔn)則,根據(jù)步驟E15中獲得的路徑覆蓋集合中被覆蓋路徑,按照一個(gè)函數(shù)被覆蓋當(dāng)且僅當(dāng)此函數(shù)中至少有一條路徑被覆蓋的原則,提取出被測(cè)試類(lèi)的所有被覆蓋函數(shù)(對(duì)于文件直接由類(lèi)構(gòu)成的情況)或文件中的所有被覆蓋函數(shù)(對(duì)于文件直接由函數(shù)構(gòu)成的情況);E17、對(duì)于類(lèi)覆蓋準(zhǔn)則,根據(jù)步驟E16中獲得的被覆蓋函數(shù),按照一個(gè)類(lèi)被覆蓋當(dāng)且僅當(dāng)此類(lèi)中至少有一個(gè)函數(shù)被覆蓋的原則,提取出被測(cè)試文件的所有被覆蓋類(lèi);E18、對(duì)于文件覆蓋準(zhǔn)則,如果文件直接由類(lèi)構(gòu)成,根據(jù)步驟E17中獲得的被覆蓋類(lèi),按照一個(gè)文件被覆蓋當(dāng)且僅當(dāng)此文件中至少有一個(gè)類(lèi)被覆蓋的原則,或者根據(jù)E16中獲得的被覆蓋函數(shù),按照一個(gè)文件被覆蓋當(dāng)且僅當(dāng)此文件中至少有一個(gè)函數(shù)被覆蓋的原則,提取出被測(cè)試工程的所有被覆蓋文件。
全文摘要
本發(fā)明提供一種基于覆蓋率量化指標(biāo)確定軟件測(cè)試過(guò)程充分性的方法,包括A、對(duì)被測(cè)程序進(jìn)行預(yù)編譯、詞法分析和語(yǔ)法分析,得到程序的抽象語(yǔ)法樹(shù)、控制流圖和函數(shù)之間的調(diào)用關(guān)系圖,并根據(jù)用戶測(cè)試需求,自動(dòng)生成被測(cè)單元;B、根據(jù)覆蓋準(zhǔn)則,從所述抽象語(yǔ)法樹(shù)和控制流圖中提取被測(cè)單元中相應(yīng)的待覆蓋元素集合;C、根據(jù)所述的覆蓋準(zhǔn)則,在被測(cè)單元的程序中插入相應(yīng)的探針函數(shù);D、根據(jù)用戶測(cè)試需求,選擇系統(tǒng)自動(dòng)執(zhí)行或用戶手動(dòng)執(zhí)行的方式對(duì)插入探針函數(shù)的被測(cè)單元進(jìn)行動(dòng)態(tài)測(cè)試;E、根據(jù)動(dòng)態(tài)測(cè)試執(zhí)行的返回信息,得到測(cè)試單元的被覆蓋元素集合,并計(jì)算被測(cè)單元的覆蓋率。應(yīng)用該方法,能夠提高軟件評(píng)估測(cè)試的效率和準(zhǔn)確性。
文檔編號(hào)G06F11/36GK102419728SQ20111033891
公開(kāi)日2012年4月18日 申請(qǐng)日期2011年11月1日 優(yōu)先權(quán)日2011年11月1日
發(fā)明者周傲, 宮云戰(zhàn), 王思嵐, 王雅文, 譚立力, 賴思佳, 韓春曉 申請(qǐng)人:北京郵電大學(xué)