覆蓋率測(cè)試方法及系統(tǒng)的制作方法
【專(zhuān)利摘要】本發(fā)明提出一種覆蓋率測(cè)試方法及系統(tǒng),其包括:編譯源代碼,在每一段代碼中均插入探針函數(shù);記錄所有探針函數(shù)的位置信息;運(yùn)行程序,記錄探針函數(shù)的計(jì)數(shù)信息;根據(jù)已經(jīng)運(yùn)行的程序中探針函數(shù)的位置信息以及相應(yīng)探針函數(shù)的計(jì)數(shù)信息,生成第一覆蓋信息;根據(jù)沒(méi)有調(diào)用到的程序中探針函數(shù)的位置信息,生成第二覆蓋信息;將所述第一覆蓋信息和所述第二覆蓋信息合并,計(jì)算獲得最終覆蓋率結(jié)果。本發(fā)明更準(zhǔn)確客觀地反映出程序代碼的真實(shí)覆蓋率,且適用于后臺(tái)服務(wù)類(lèi)程序的測(cè)試。
【專(zhuān)利說(shuō)明】覆蓋率測(cè)試方法及系統(tǒng)【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及軟件測(cè)試技術(shù),特別涉及一種軟件代碼的覆蓋率測(cè)試方法及系統(tǒng)。
【背景技術(shù)】
[0002]在C/C++軟件開(kāi)發(fā)的質(zhì)量保證體系中,覆蓋率(軟件中代碼的運(yùn)行比率)測(cè)試通常是一種有效發(fā)現(xiàn)問(wèn)題的手段,通過(guò)代碼覆蓋率的分析,可以快速定位到哪些代碼是沒(méi)有運(yùn)行的,從而構(gòu)造相應(yīng)的測(cè)試案例來(lái)覆蓋這些代碼,以發(fā)現(xiàn)軟件設(shè)計(jì)中的錯(cuò)誤。
[0003]目前軟件代碼覆蓋率測(cè)試廣泛使用的是開(kāi)源gcov工具,gcov工具是集成在gcc(GNU Compiler Collection, GUN編譯器套件)中的一個(gè)檢測(cè)代碼覆蓋率的工具,它通過(guò)編譯階段(即將源代碼編譯成可執(zhí)行代碼),在源代碼中插入探針函數(shù)(插入探針函數(shù)也稱(chēng)為插樁,用來(lái)標(biāo)識(shí)代碼的運(yùn)行次數(shù)),來(lái)記錄代碼是否運(yùn)行,并根據(jù)記錄的運(yùn)行信息分析出軟件代碼行、函數(shù)、分支的覆 蓋情況。
[0004]測(cè)試時(shí),運(yùn)行程序,首先將探針函數(shù)的位置信息記錄在一個(gè)文件中(例如通常將探針信息記錄在以.gcno結(jié)尾的文件中,后面簡(jiǎn)稱(chēng)為gcno文件)。
[0005]其次,在程序運(yùn)行過(guò)程中對(duì)每段代碼的覆蓋率進(jìn)行統(tǒng)計(jì),覆蓋率的數(shù)值可以利用探針函數(shù)本身的計(jì)數(shù)功能來(lái)獲得,即運(yùn)行過(guò)的代碼,相應(yīng)的探針函數(shù)便會(huì)計(jì)數(shù),并在程序優(yōu)雅退出(這里所述的優(yōu)雅退出是指程序正常退出,例如調(diào)用exit O函數(shù)退出程序)后將統(tǒng)計(jì)得到的覆蓋率寫(xiě)入一個(gè)文件中(例如通常將覆蓋率記錄在以.gcda結(jié)尾的文件中,后面簡(jiǎn)稱(chēng)為gcda文件)。
[0006]最后,請(qǐng)參見(jiàn)圖1,從gcno文件和gcda文件中收集和匯總軟件的覆蓋率信息,產(chǎn)出
覆蓋率報(bào)告。
[0007]但是,現(xiàn)有的這種覆蓋率測(cè)試方法存在兩類(lèi)問(wèn)題:
[0008]( I)獲得覆蓋率結(jié)果準(zhǔn)確性低
[0009]生成gcda文件時(shí)候,有一個(gè)前提,就是對(duì)于源文件A,只有當(dāng)程序運(yùn)行時(shí)使用或調(diào)用了源文件A中的代碼時(shí),才會(huì)生成源文件A的gcda文件(A.gcda),而收集源文件A的覆蓋率信息時(shí),必須A.gcno、A.gcda都存在時(shí)才可以收集得到。對(duì)于測(cè)試來(lái)說(shuō),考慮到測(cè)試時(shí)間,多數(shù)情況都沒(méi)有辦法保證測(cè)試案例可以將一個(gè)軟件程序完整地運(yùn)行,因此很多時(shí)候只生成了部分源代碼的gcda文件,而測(cè)試過(guò)程中沒(méi)有運(yùn)行的源代碼卻并沒(méi)有被納入計(jì)算范圍,所以會(huì)造成得出的覆蓋率結(jié)果不準(zhǔn)確。
[0010](2)對(duì)于不支持非優(yōu)雅退出的程序,無(wú)法獲取覆蓋率運(yùn)行信息
[0011]gcda文件的生成,是在程序正常退出(即優(yōu)雅退出)后對(duì)覆蓋率統(tǒng)計(jì)得到的。但是對(duì)于后臺(tái)服務(wù)類(lèi)程序來(lái)說(shuō),其程序運(yùn)行是循環(huán)的,本身不提供優(yōu)雅退出機(jī)制,因而無(wú)法生成gcda文件,從而無(wú)法獲取覆蓋率信息。
【發(fā)明內(nèi)容】
[0012]本發(fā)明的目的是提供一種覆蓋率測(cè)試方法及系統(tǒng),以解決現(xiàn)有覆蓋率測(cè)試技術(shù)獲得的覆蓋率結(jié)果準(zhǔn)確性低的問(wèn)題。
[0013]本發(fā)明提出一種覆蓋率測(cè)試方法,包括:
[0014]編譯源代碼,在每一段代碼中均插入探針函數(shù);
[0015]記錄所有探針函數(shù)的位置信息;
[0016]運(yùn)行程序,記錄探針函數(shù)的計(jì)數(shù)信息;
[0017]根據(jù)已經(jīng)運(yùn)行的程序中探針函數(shù)的位置信息以及相應(yīng)探針函數(shù)的計(jì)數(shù)信息,生成
第一覆蓋息;
[0018]根據(jù)沒(méi)有調(diào)用到的程序中探針函數(shù)的位置信息,生成第二覆蓋信息;
[0019]將所述第一覆蓋信息和所述第二覆蓋信息合并,計(jì)算獲得最終覆蓋率結(jié)果。
[0020]依照本發(fā)明較佳實(shí)施例所述的覆蓋率測(cè)試方法,還包括:
[0021]運(yùn)行程序過(guò)程中,定時(shí)對(duì)已經(jīng)運(yùn)行的程序中探針函數(shù)的計(jì)數(shù)信息進(jìn)行記錄,并獲取已經(jīng)運(yùn)行的程序中代碼的覆蓋信息。
[0022]依照本發(fā)明較佳實(shí)施例所述的覆蓋率測(cè)試方法,還包括:
[0023]注冊(cè)調(diào)用函數(shù)和信號(hào)處理函數(shù);
[0024]運(yùn)行程序過(guò)程中,在所述調(diào)用函數(shù)接收到調(diào)用信號(hào)后,調(diào)用所述處理函數(shù)獲取已經(jīng)運(yùn)行的程序中代碼的覆蓋信息。`
[0025]依照本發(fā)明較佳實(shí)施例所述的覆蓋率測(cè)試方法,所述注冊(cè)調(diào)用函數(shù)和信號(hào)處理函數(shù)的步驟包括:利用動(dòng)態(tài)庫(kù)預(yù)加載的特性注冊(cè)所述注冊(cè)調(diào)用函數(shù)和所述信號(hào)處理函數(shù)。
[0026]依照本發(fā)明較佳實(shí)施例所述的覆蓋率測(cè)試方法,在程序運(yùn)行正常退出時(shí),對(duì)已經(jīng)運(yùn)行的程序中探針函數(shù)的計(jì)數(shù)信息進(jìn)行記錄。
[0027]依照本發(fā)明較佳實(shí)施例所述的覆蓋率測(cè)試方法,還包括:
[0028]將探針函數(shù)的位置信息寫(xiě)入第一文件;
[0029]根據(jù)已經(jīng)運(yùn)行的程序中探針函數(shù)的位置信息以及相應(yīng)探針函數(shù)的計(jì)數(shù)信息,獲得已經(jīng)運(yùn)行的程序中代碼覆蓋信息,并寫(xiě)入第二文件;
[0030]所述根據(jù)已經(jīng)運(yùn)行的程序中探針函數(shù)的位置信息以及相應(yīng)探針函數(shù)的計(jì)數(shù)信息,生成第一覆蓋信息的步驟包括:掃描所述第一文件獲得已經(jīng)運(yùn)行的程序中探針函數(shù)的位置信息,掃描所述第二文件獲得已經(jīng)運(yùn)行的程序中探針函數(shù)的計(jì)數(shù)信息,并根據(jù)已經(jīng)運(yùn)行的程序中探針函數(shù)的位置信息以及相應(yīng)探針函數(shù)的計(jì)數(shù)信息,生成第一覆蓋信息。
[0031]依照本發(fā)明較佳實(shí)施例所述的覆蓋率測(cè)試方法,所述根據(jù)沒(méi)有調(diào)用到的程序中探針函數(shù)的位置信息,生成第二覆蓋信息的步驟包括:
[0032]掃描所述第一文件,獲得沒(méi)有調(diào)用到的程序中探針函數(shù)的位置信息,并生成第二
覆蓋?目息。
[0033]依照本發(fā)明較佳實(shí)施例所述的覆蓋率測(cè)試方法,所述編譯源代碼的步驟還包括:去除源代碼中空行、注釋、括號(hào)行、聲明語(yǔ)句等無(wú)效、非邏輯的代碼行。
[0034]本發(fā)明另提出一種覆蓋率測(cè)試系統(tǒng),包括:
[0035]編譯模塊,用于編譯源代碼,并在每一段代碼中均插入探針函數(shù);
[0036]記錄模塊,用于記錄所有探針函數(shù)的位置信息,以及記錄探針函數(shù)的計(jì)數(shù)信息;
[0037]第一覆蓋信息生成模塊,用于根據(jù)已經(jīng)運(yùn)行的程序中探針函數(shù)的位置信息以及相應(yīng)探針函數(shù)的計(jì)數(shù)信息,生成第一覆蓋信息;[0038]第二覆蓋信息生成模塊,用于根據(jù)沒(méi)有調(diào)用到的程序中探針函數(shù)的位置信息,生成第二覆蓋息;
[0039]合并模塊,用于將所述第一覆蓋信息和所述第二覆蓋信息合并,計(jì)算獲得最終覆蓋率結(jié)果。
[0040]依照本發(fā)明較佳實(shí)施例所述的覆蓋率測(cè)試系統(tǒng),所述記錄模塊在運(yùn)行程序過(guò)程中,定時(shí)對(duì)已經(jīng)運(yùn)行的程序中探針函數(shù)的計(jì)數(shù)信息進(jìn)行記錄。
[0041]依照本發(fā)明較佳實(shí)施例所述的覆蓋率測(cè)試系統(tǒng),所述記錄模塊在程序運(yùn)行正常退出時(shí),對(duì)已經(jīng)運(yùn)行的程序中探針函數(shù)的計(jì)數(shù)信息進(jìn)行記錄。
[0042]依照本發(fā)明較佳實(shí)施例所述的覆蓋率測(cè)試系統(tǒng),所述記錄模塊將探針函數(shù)的位置信息寫(xiě)入第一文件,以及根據(jù)已經(jīng)運(yùn)行的程序中探針函數(shù)的位置信息以及相應(yīng)探針函數(shù)的計(jì)數(shù)信息,獲得已經(jīng)運(yùn)行的程序中代碼覆蓋信息,并寫(xiě)入第二文件;
[0043]所述第一覆蓋信息生成模塊通過(guò)掃描所述第一文件獲得已經(jīng)運(yùn)行的程序中探針函數(shù)的位置信息,通過(guò)掃描所述第二文件獲得已經(jīng)運(yùn)行的程序中探針函數(shù)的計(jì)數(shù)信息,并根據(jù)已經(jīng)運(yùn)行的程序中探針函數(shù)的位置信息以及相應(yīng)探針函數(shù)的計(jì)數(shù)信息,生成第一覆蓋信息。
[0044]依照本發(fā)明較佳實(shí)施例所述的覆蓋率測(cè)試系統(tǒng),所述第二覆蓋信息生成模塊通過(guò)掃描所述第一文件,獲得沒(méi)有調(diào)用到的程序中探針函數(shù)的位置信息,并生成第二覆蓋信息。
[0045]依照本發(fā)明較佳實(shí)施例所述的覆蓋率測(cè)試系統(tǒng),所述編譯模塊在編譯源代碼時(shí),去除源代碼中空行、注釋、括號(hào)行、聲明語(yǔ)句等無(wú)效、非邏輯的代碼行。
[0046]相對(duì)于現(xiàn)有技術(shù),本發(fā)明的有益效果是:本發(fā)明將測(cè)試過(guò)程中已經(jīng)運(yùn)行的程序和沒(méi)有運(yùn)行的程序都考慮在計(jì)算范圍內(nèi),不受測(cè)試數(shù)據(jù)變化的影響,即使在測(cè)試軟件沒(méi)有完全運(yùn)行的情況下,也可以準(zhǔn)確客觀地反映出程序代碼的真實(shí)覆蓋率。此外,本發(fā)明可以在程序運(yùn)行過(guò)程中對(duì)探針函數(shù)的動(dòng)態(tài)計(jì)數(shù),支持覆蓋率數(shù)據(jù)的動(dòng)態(tài)生成,同樣適用于后臺(tái)服務(wù)類(lèi)程序的測(cè)試。
[0047]當(dāng)然,實(shí)施本發(fā)明的任一產(chǎn)品并不一定需要同時(shí)達(dá)到以上所述的所有優(yōu)點(diǎn)。
[0048]上述說(shuō)明僅是本發(fā)明技術(shù)方案的概述,為了能夠更清楚了解本發(fā)明的技術(shù)手段,而可依照說(shuō)明書(shū)的內(nèi)容予以實(shí)施,并且為了讓本發(fā)明的上述和其他目的、特征和優(yōu)點(diǎn)能夠更明顯易懂,以下特舉較佳實(shí)施例,并配合附圖,詳細(xì)說(shuō)明如下。
【專(zhuān)利附圖】
【附圖說(shuō)明】
[0049]圖1為現(xiàn)有的軟件代碼覆蓋率測(cè)試匯總示意圖;
[0050]圖2為本發(fā)明實(shí)施例的一種覆蓋率測(cè)試方法流程圖;
[0051]圖3為本發(fā)明實(shí)施例的一種動(dòng)態(tài)生成第二文件的原理圖;
[0052]圖4為本發(fā)明實(shí)施例的一種獲得最終覆蓋率結(jié)果的原理圖;
[0053]圖5為本發(fā)明實(shí)施例的一種覆蓋率測(cè)試系統(tǒng)的結(jié)構(gòu)圖。
【具體實(shí)施方式】
[0054]為更進(jìn)一步闡述本發(fā)明達(dá)成預(yù)定發(fā)明目的所采取的技術(shù)手段及功效,以下結(jié)合附圖及較佳實(shí)施例,對(duì)依據(jù)本發(fā)明提出的覆蓋率測(cè)試方法及系統(tǒng)其【具體實(shí)施方式】、方法、步驟及功效,詳細(xì)說(shuō)明如后。
[0055]有關(guān)本發(fā)明的前述及其他技術(shù)內(nèi)容、特點(diǎn)及功效,在以下配合參考圖式的較佳實(shí)施例詳細(xì)說(shuō)明中將可清楚的呈現(xiàn)。通過(guò)【具體實(shí)施方式】的說(shuō)明,當(dāng)可對(duì)本發(fā)明為達(dá)成預(yù)定目的所采取的技術(shù)手段及功效得以更加深入且具體的了解,然而所附圖式僅是提供參考與說(shuō)明之用,并非用來(lái)對(duì)本發(fā)明加以限制。
[0056]請(qǐng)參見(jiàn)圖2,其為本發(fā)明實(shí)施例的一種覆蓋率測(cè)試方法流程圖,其包括以下步驟:
[0057]S21,編譯源代碼,在每一段代碼中均插入探針函數(shù)。
[0058]編譯源代碼是將源代碼編譯成可執(zhí)行代碼的過(guò)程,其中包括去除源代碼中空行、注釋、括號(hào)行、聲明語(yǔ)句等無(wú)效、非邏輯的代碼行,也即是將源代碼編譯成有效代碼行。
[0059]在編譯源代碼的過(guò)程中,會(huì)在每一段代碼中均插入探針函數(shù)。這里所說(shuō)的每一段代碼是指程序的基本塊。如果一段代碼的第一條語(yǔ)句被執(zhí)行過(guò)一次,這段代碼中的每一個(gè)都要執(zhí)行一次,稱(chēng)為基本塊。一個(gè)基本塊中的所有語(yǔ)句的執(zhí)行次數(shù)一定是相同的。一般由多個(gè)順序執(zhí)行語(yǔ)句后邊跟一個(gè)跳轉(zhuǎn)語(yǔ)句組成。所以一般情況下基本塊的最后一條語(yǔ)句一定是一個(gè)跳轉(zhuǎn)語(yǔ)句,跳轉(zhuǎn)的目的地是另外一個(gè)基本塊的第一條語(yǔ)句,如果跳轉(zhuǎn)時(shí)有條件的,就產(chǎn)生了分支,該基本塊就有兩個(gè)基本塊作為目的地。
[0060]在每一段代碼中插入探針函數(shù)也稱(chēng)為在代碼中插樁,代碼插樁技術(shù)是在保證被測(cè)程序原有邏輯完整性的基礎(chǔ)上,在代碼中插入一些探針(又稱(chēng)為“探測(cè)儀”),通過(guò)探針的執(zhí)行并拋出代碼運(yùn)行的特征數(shù)據(jù),通過(guò)對(duì)這些數(shù)據(jù)的分析,可以獲得程序的控制流和數(shù)據(jù)流信息,進(jìn)而得到邏輯覆蓋等動(dòng)態(tài)信息,從而實(shí)現(xiàn)測(cè)試目的的方法。這里所述的探針函數(shù)具有計(jì)數(shù)的功能,當(dāng)探針函數(shù)所在的一段代碼運(yùn)行一次后,該探針函數(shù)便自動(dòng)計(jì)數(shù)一次,也即表示該段代碼被覆蓋。
[0061]S22,記錄所有探針函數(shù)的位置信息。
[0062]在軟件程序測(cè)試運(yùn)行過(guò)程中,有的代碼是被覆蓋的(會(huì)運(yùn)行的),而有些代碼卻沒(méi)有被覆蓋(不會(huì)運(yùn)行),這部分沒(méi)有被覆蓋的代碼會(huì)成為系統(tǒng)的負(fù)擔(dān),甚至?xí)?dǎo)致程序出錯(cuò),所以測(cè)試的目的就是通過(guò)計(jì)算軟件運(yùn)行時(shí)代碼的覆蓋率,進(jìn)而找出這些沒(méi)有覆蓋到的代碼。因?yàn)樘结樅瘮?shù)可以標(biāo)示出代碼的運(yùn)行情況,所以為了計(jì)算覆蓋率,需要記錄所有探針函數(shù)的位置信息,探針函數(shù)的位置關(guān)系表現(xiàn)為一個(gè)樹(shù)狀的結(jié)構(gòu)。在實(shí)際操作中,可以將探針函數(shù)的位置信息寫(xiě)入一個(gè)第一文件中,例如以.gcno結(jié)尾的文件(后面所述的gcno文件即指第一文件)。
[0063]S23,運(yùn)行程序,記錄探針函數(shù)的計(jì)數(shù)信息。
[0064]在程序運(yùn)行過(guò)程中,一段代碼被執(zhí)行后,對(duì)應(yīng)的探針函數(shù)便會(huì)有計(jì)數(shù),從而便能計(jì)算出已運(yùn)行代碼的覆蓋信息,可以將這個(gè)已運(yùn)行代碼的覆蓋信息寫(xiě)入一個(gè)第二文件中,例如以.gcda結(jié)尾的文件(后面所述的gcda文件即指第二文件)。在實(shí)際操作中,可以在程序入口處,通過(guò)atexit函數(shù),注冊(cè)一個(gè)用于把運(yùn)行階段的覆蓋信息寫(xiě)入本地文件的函數(shù)gcov_exit O ,從而調(diào)用gcov_exit O函數(shù)時(shí)就會(huì)把覆蓋信息寫(xiě)入gcda文件中。
[0065]其中,記錄已運(yùn)行探針函數(shù)的計(jì)數(shù)信息(也即生成gcda文件)可以采用兩種方式:
[0066](I)在程序運(yùn)行正常退出時(shí),對(duì)已經(jīng)運(yùn)行的程序中探針函數(shù)的計(jì)數(shù)信息進(jìn)行記錄。程序運(yùn)行正常退出也稱(chēng)為優(yōu)雅退出,這種方式適合支持優(yōu)雅退出的程序,即程序優(yōu)雅退出時(shí),調(diào)用gcov_exit()函數(shù)將已運(yùn)行的覆蓋信息寫(xiě)入gcda文件中。[0067](2)運(yùn)行程序過(guò)程中,定時(shí)對(duì)已經(jīng)運(yùn)行的程序中探針函數(shù)的計(jì)數(shù)信息進(jìn)行記錄?;谟行┏绦虿恢С謨?yōu)雅退出(如后臺(tái)服務(wù)類(lèi)程序),而且優(yōu)雅退出后程序的重新啟動(dòng)往往較慢,所以也可以采用這種動(dòng)態(tài)方式來(lái)對(duì)覆蓋信息進(jìn)行記錄。
[0068]具體的實(shí)現(xiàn)方式可以是:利用動(dòng)態(tài)庫(kù)預(yù)加載的特性,先在程序中注冊(cè)一個(gè)調(diào)用函數(shù)和一個(gè)信號(hào)處理函數(shù),然后在程序運(yùn)行過(guò)程中,定時(shí)(當(dāng)然也可以在需要的時(shí)候)向調(diào)用函數(shù)發(fā)送一個(gè)調(diào)用信號(hào),從而調(diào)用函數(shù)會(huì)調(diào)用處理函數(shù)獲取已運(yùn)行的代碼的計(jì)數(shù)信息,從而獲得已經(jīng)運(yùn)行的程序中代碼的覆蓋信息,并寫(xiě)入gcda文件中。而每次調(diào)用信號(hào)處理函數(shù)而獲取的代碼計(jì)數(shù)信息,都會(huì)累加寫(xiě)入gcda文件中。
[0069]請(qǐng)結(jié)合參見(jiàn)圖3,其為動(dòng)態(tài)生成gcda文件的原理圖,其中_attribute_((constructor))void_ctorGcovRegister O 函數(shù)即為調(diào)用函數(shù),void_sigHandlerGcov (int status)函數(shù)即為信號(hào)處理函數(shù),USRl信號(hào)即為調(diào)用信號(hào)。當(dāng)_attribute—((constructor)) void_ctorGcovRegister O 函數(shù)捕獲 USRl 信號(hào)時(shí),就會(huì)調(diào)用void_sigHandlerGcov (int status)函數(shù),該函數(shù)內(nèi)部會(huì)調(diào)用gcov_exit O函數(shù)把覆蓋信息寫(xiě)入到gcda文件中。
[0070]S24,根據(jù)已經(jīng)運(yùn)行的程序中探針函數(shù)的位置信息以及相應(yīng)探針函數(shù)的計(jì)數(shù)信息,
生成第一覆蓋信息。
[0071]所述的第一覆蓋信息是指已運(yùn)行的程序中代碼的相關(guān)覆蓋信息,如已運(yùn)行程序中代碼的覆蓋率結(jié)果、運(yùn)行的代碼的數(shù)量位置、未運(yùn)行代碼的數(shù)量位置等。
[0072]實(shí)際操作中,掃描gcno文件可以獲得已經(jīng)運(yùn)行的程序中探針函數(shù)的位置信息,也即獲得了已經(jīng)運(yùn)行的程序中代碼段的總數(shù)。掃描gcda文件可以獲得已經(jīng)運(yùn)行的程序中代碼的計(jì)數(shù)信息,即哪些代碼運(yùn)行過(guò),哪些代碼沒(méi)有運(yùn)行過(guò)。從而通過(guò)掃描gcno文件和gcda文件所得到的信息便能生成第一覆蓋信息。
[0073]S25,根據(jù)沒(méi)有調(diào)用到的程序中探針函數(shù)的位置信息,生成第二覆蓋信息。
[0074]所述第二覆蓋信息是指沒(méi)有運(yùn)行的程序中代碼的相關(guān)信息,如這部分代碼的覆蓋率(為0),代碼的數(shù)量位置等。實(shí)際操作中,可以通過(guò)掃描gcno文件,獲得沒(méi)有調(diào)用到的程序中探針函數(shù)的位置信息,即可以獲得相應(yīng)代碼的數(shù)量和位置信息,從而并生成第二覆蓋信息。
[0075]S26,將所述第一覆蓋信息和所述第二覆蓋信息合并,計(jì)算獲得最終覆蓋率結(jié)果。
[0076]所述最終覆蓋率結(jié)果是指反映軟件測(cè)試真實(shí)的代碼覆蓋率。請(qǐng)結(jié)合參見(jiàn)圖4,其為獲得最終覆蓋率結(jié)果的原理圖,由于第一覆蓋信息中包含了已運(yùn)行的程序中代碼的相關(guān)覆蓋信息,第二覆蓋信息中包含了沒(méi)有運(yùn)行的程序中代碼的相關(guān)信息,由第一覆蓋信息和第二覆蓋信息合并匯總才能得到真實(shí)的代碼覆蓋率。
[0077]例如,假設(shè)一個(gè)軟件中包含10個(gè)文件,而每個(gè)文件包含1000段代碼,在測(cè)試過(guò)程中,由于程序冗長(zhǎng)耗時(shí)過(guò)久而僅運(yùn)行了 5個(gè)文件的程序代碼,假設(shè)運(yùn)行的這5個(gè)文件中,每個(gè)文件均只覆蓋了 500段代碼。
[0078]如果按照現(xiàn)有的計(jì)算方法,則:
[0079]覆蓋率=覆蓋的有效代碼行/所有覆蓋到的源文件的有效代碼行之和
[0080]=5*500/5*1000 = 50%
[0081]可見(jiàn),由于未將沒(méi)有運(yùn)行的5個(gè)文件考慮在內(nèi),因而得出的覆蓋率是不準(zhǔn)確的。而如果按照本發(fā)明的計(jì)算方法,則:
[0082]覆蓋率=覆蓋的有效代碼行/所有源文件的有效代碼行之和
[0083]=5*500/10*1000 = 25%
[0084]顯然由于本發(fā)明將已經(jīng)運(yùn)行的程序和未運(yùn)行的程序都考慮在計(jì)算范圍內(nèi),可以更客觀更準(zhǔn)確地反映測(cè)試結(jié)果。
[0085]本發(fā)明另提出一種覆蓋率測(cè)試系統(tǒng),請(qǐng)參見(jiàn)圖5,其包括編譯模塊51、記錄模塊52、第一覆蓋信息生成模塊53、第二覆蓋信息生成模塊54以及合并模塊55。記錄模塊52與編譯模塊51相連,第一覆蓋信息生成模塊53和第二覆蓋信息生成模塊54均與記錄模塊52連接,合并模塊55分別與第一覆蓋信息生成模塊53和第二覆蓋信息生成模塊54相連。
[0086]進(jìn)行測(cè)試時(shí),首先由編譯模塊51對(duì)源代碼進(jìn)行編譯,并在每一段代碼中均插入探針函數(shù)。編譯過(guò)程中,可以去除源代碼中空行、注釋、括號(hào)行、聲明語(yǔ)句等無(wú)效、非邏輯的代碼行。
[0087]編譯過(guò)程中,記錄模塊52會(huì)記錄下所有探針函數(shù)的位置信息,并將其寫(xiě)入一個(gè)以.gcno結(jié)尾的文件(即第一文件)。探針函數(shù)的位置關(guān)系表現(xiàn)為一個(gè)樹(shù)狀的結(jié)構(gòu)。
[0088]編譯完成后,便開(kāi)始執(zhí)行程序。在程序運(yùn)行過(guò)程中,一段代碼被執(zhí)行后,對(duì)應(yīng)的探針函數(shù)便會(huì)有計(jì)數(shù),從而便能計(jì)算出已運(yùn)行程序中代碼的覆蓋信息記錄模塊52還會(huì)記錄下這個(gè)已運(yùn)行程序中代碼的覆蓋信息,并寫(xiě)入一個(gè)以.gcda結(jié)尾的文件(即第二文件)。
[0089]其中,記錄模塊52記錄已運(yùn)行探針函數(shù)的計(jì)數(shù)信息(也即生成gcda文件)可以采用兩種方式:
[0090](I)在程序運(yùn)行正常退出時(shí),對(duì)已經(jīng)運(yùn)行的程序中探針函數(shù)的計(jì)數(shù)信息進(jìn)行記錄。程序運(yùn)行正常退出也稱(chēng)為優(yōu)雅退出,這種方式適合支持優(yōu)雅退出的程序,即程序優(yōu)雅退出時(shí),將已運(yùn)行的覆蓋信息寫(xiě)入gcda文件中。
[0091](2)運(yùn)行程序過(guò)程中,定時(shí)對(duì)已經(jīng)運(yùn)行的程序中探針函數(shù)的計(jì)數(shù)信息進(jìn)行記錄?;谟行┏绦虿恢С謨?yōu)雅退出(如后臺(tái)服務(wù)類(lèi)程序),而且優(yōu)雅退出后程序的重新啟動(dòng)往往較慢,所以也可以采用這種動(dòng)態(tài)方式來(lái)對(duì)覆蓋信息進(jìn)行記錄。
[0092]具體的實(shí)現(xiàn)方式可以是:利用動(dòng)態(tài)庫(kù)預(yù)加載的特性,在記錄模塊52中注冊(cè)一個(gè)調(diào)用函數(shù)和一個(gè)信號(hào)處理函數(shù),然后在程序運(yùn)行過(guò)程中,定時(shí)(當(dāng)然也可以在需要的時(shí)候)向調(diào)用函數(shù)發(fā)送一個(gè)調(diào)用信號(hào),從而調(diào)用函數(shù)會(huì)調(diào)用處理函數(shù)獲取已運(yùn)行的代碼的計(jì)數(shù)信息,從而獲得已經(jīng)運(yùn)行的程序中代碼的覆蓋信息,并寫(xiě)入gcda文件中。而每次調(diào)用信號(hào)處理函數(shù)而獲取的代碼計(jì)數(shù)信息,都會(huì)累加寫(xiě)入gcda文件中。
[0093]程序運(yùn)行結(jié)束后(此時(shí)所執(zhí)行的程序可能是軟件的所有程序,也可能是軟件的一部分程序),第一覆蓋信息生成模塊53會(huì)根據(jù)已經(jīng)運(yùn)行的程序中探針函數(shù)的位置信息以及相應(yīng)探針函數(shù)的計(jì)數(shù)信息,生成第一覆蓋信息。所述的第一覆蓋信息是指已運(yùn)行的程序中代碼的相關(guān)覆蓋信息,如已運(yùn)行程序中代碼的覆蓋率結(jié)果、運(yùn)行的代碼的數(shù)量位置、未運(yùn)行代碼的數(shù)量位置等。具體為:第一覆蓋信息生成模塊53通過(guò)掃描gcno文件可以獲得已經(jīng)運(yùn)行的程序中探針函數(shù)的位置信息,也即獲得了已經(jīng)運(yùn)行的程序中代碼段的總數(shù)。通過(guò)掃描gcda文件可以獲得已經(jīng)運(yùn)行的程序中代碼的計(jì)數(shù)信息,即哪些代碼運(yùn)行過(guò),哪些代碼沒(méi)有運(yùn)行過(guò)。從而通過(guò)掃描gcno文件和gcda文件所得到的信息便能生成第一覆蓋信息。
[0094]第二覆蓋信息生成模塊54會(huì)根據(jù)沒(méi)有調(diào)用到的程序中探針函數(shù)的位置信息,生成第二覆蓋信息。所述第二覆蓋信息是指沒(méi)有運(yùn)行的程序中代碼的相關(guān)信息,如這部分代碼的覆蓋率(為0),代碼的數(shù)量位置等。具體為:第二覆蓋信息生成模塊54通過(guò)掃描gcno文件,可以獲得沒(méi)有調(diào)用到的程序中探針函數(shù)的位置信息,即可以獲得相應(yīng)代碼的數(shù)量和位置信息,從而并生成第二覆蓋信息。
[0095]最后,合并模塊55將第一覆蓋信息生成模塊53和第二覆蓋信息生成模塊54輸出的第一覆蓋信息和第二覆蓋信息進(jìn)行匯總合并,并計(jì)算出最終覆蓋率結(jié)果。
[0096]本發(fā)明將測(cè)試過(guò)程中已經(jīng)運(yùn)行的程序和沒(méi)有運(yùn)行的程序都考慮在計(jì)算范圍內(nèi),不受測(cè)試數(shù)據(jù)變化的影響,即使在測(cè)試軟件沒(méi)有完全運(yùn)行的情況下,也可以準(zhǔn)確客觀地反映出程序代碼的真實(shí)覆蓋率。此外,本發(fā)明可以在程序運(yùn)行過(guò)程中對(duì)探針函數(shù)的動(dòng)態(tài)計(jì)數(shù),支持覆蓋率數(shù)據(jù)的動(dòng)態(tài)生成,同樣適用于后臺(tái)服務(wù)類(lèi)程序的測(cè)試。
[0097]以上所述,僅是本發(fā)明的較佳實(shí)施例而已,并非對(duì)本發(fā)明作任何形式上的限制,雖然本發(fā)明已以較佳實(shí)施例揭露如上,然而并非用以限定本發(fā)明,任何熟悉本專(zhuān)業(yè)的技術(shù)人員,在不脫離本發(fā)明技術(shù)方案范圍內(nèi),當(dāng)可利用上述揭示的技術(shù)內(nèi)容作出些許更動(dòng)或修飾為等同變化的等效實(shí)施例,但凡是未脫離本發(fā)明技術(shù)方案內(nèi)容,依據(jù)本發(fā)明的技術(shù)實(shí)質(zhì)對(duì)以上實(shí)施例所作的任何簡(jiǎn)單修改、等同變化與修飾,均仍屬于本發(fā)明技術(shù)方案的范圍內(nèi)。
【權(quán)利要求】
1.一種覆蓋率測(cè)試方法,其特征在于,包括: 編譯源代碼,在每一段代碼中均插入探針函數(shù); 記錄所有探針函數(shù)的位置信息; 運(yùn)行程序,記錄探針函數(shù)的計(jì)數(shù)信息; 根據(jù)已經(jīng)運(yùn)行的程序中探針函數(shù)的位置信息以及相應(yīng)探針函數(shù)的計(jì)數(shù)信息,生成第一覆蓋信息; 根據(jù)沒(méi)有調(diào)用到的程序中探針函數(shù)的位置信息,生成第二覆蓋信息; 將所述第一覆蓋信息和所述第二覆蓋信息合并,計(jì)算獲得最終覆蓋率結(jié)果。
2.如權(quán)利要求1所述的覆蓋率測(cè)試方法,其特征在于,還包括: 運(yùn)行程序過(guò)程中,定時(shí)對(duì)已經(jīng)運(yùn)行的程序中探針函數(shù)的計(jì)數(shù)信息進(jìn)行記錄,并獲取已經(jīng)運(yùn)行的程序中代碼的覆蓋信息。
3.如權(quán)利要求2所述的覆蓋率測(cè)試方法,其特征在于,還包括: 注冊(cè)調(diào)用函數(shù)和信號(hào)處理函數(shù); 運(yùn)行程序過(guò)程中,在所述調(diào)用函數(shù)接收到調(diào)用信號(hào)后,調(diào)用所述處理函數(shù)獲取已經(jīng)運(yùn)行的程序中代碼的覆蓋信息。
4.如權(quán)利要求3所述的覆蓋率測(cè)試方法,其特征在于,所述注冊(cè)調(diào)用函數(shù)和信號(hào)處理函數(shù)的步驟包括:利用動(dòng)態(tài)庫(kù)預(yù)加載的特性注冊(cè)所述注冊(cè)調(diào)用函數(shù)和所述信號(hào)處理函數(shù)。
5.如權(quán)利要求1所述的覆蓋率測(cè)試方法,其特征在于,在程序運(yùn)行正常退出時(shí),對(duì)已經(jīng)運(yùn)行的程序中探針函數(shù)的計(jì)數(shù)信息進(jìn)行記錄。
6.如權(quán)利要求1所述的覆蓋率測(cè)試方法,其特征在于,還包括: 將探針函數(shù)的位置信息寫(xiě)入第一文件; 根據(jù)已經(jīng)運(yùn)行的程序中探針函數(shù)的位置信息以及相應(yīng)探針函數(shù)的計(jì)數(shù)信息,獲得已經(jīng)運(yùn)行的程序中代碼覆蓋信息,并寫(xiě)入第二文件; 所述根據(jù)已經(jīng)運(yùn)行的程序中探針函數(shù)的位置信息以及相應(yīng)探針函數(shù)的計(jì)數(shù)信息,生成第一覆蓋信息的步驟包括:掃描所述第一文件獲得已經(jīng)運(yùn)行的程序中探針函數(shù)的位置信息,掃描所述第二文件獲得已經(jīng)運(yùn)行的程序中探針函數(shù)的計(jì)數(shù)信息,并根據(jù)已經(jīng)運(yùn)行的程序中探針函數(shù)的位置信息以及相應(yīng)探針函數(shù)的計(jì)數(shù)信息,生成第一覆蓋信息。
7.如權(quán)利要求6所述的覆蓋率測(cè)試方法,其特征在于,所述根據(jù)沒(méi)有調(diào)用到的程序中探針函數(shù)的位置信息,生成第二覆蓋信息的步驟包括: 掃描所述第一文件,獲得沒(méi)有調(diào)用到的程序中探針函數(shù)的位置信息,并生成第二覆蓋信息。
8.如權(quán)利要求1所述的覆蓋率測(cè)試方法,其特征在于,所述編譯源代碼的步驟還包括:去除源代碼中空行、注釋、括號(hào)行、聲明語(yǔ)句等無(wú)效、非邏輯的代碼行。
9.一種覆蓋率測(cè)試系統(tǒng),其特征在于,包括: 編譯模塊,用于編譯源代碼,并在每一段代碼中均插入探針函數(shù); 記錄模塊,用于記錄所有探針函數(shù)的位置信息,以及記錄探針函數(shù)的計(jì)數(shù)信息; 第一覆蓋信息生成模塊,用于根據(jù)已經(jīng)運(yùn)行的程序中探針函數(shù)的位置信息以及相應(yīng)探針函數(shù)的計(jì)數(shù)信息,生成第一覆蓋信息; 第二覆蓋信息生成模塊,用于根據(jù)沒(méi)有調(diào)用到的程序中探針函數(shù)的位置信息,生成第二覆蓋信息; 合并模塊,用于將所述第一覆蓋信息和所述第二覆蓋信息合并,計(jì)算獲得最終覆蓋率結(jié)果。
10.如權(quán)利要求9所述的覆蓋率測(cè)試系統(tǒng),其特征在于,所述記錄模塊在運(yùn)行程序過(guò)程中,定時(shí)對(duì)已經(jīng)運(yùn)行的程序中探針函數(shù)的計(jì)數(shù)信息進(jìn)行記錄。
11.如權(quán)利要求9所述的覆蓋率測(cè)試系統(tǒng),其特征在于,所述記錄模塊在程序運(yùn)行正常退出時(shí),對(duì)已經(jīng)運(yùn)行的程序中探針函數(shù)的計(jì)數(shù)信息進(jìn)行記錄。
12.如權(quán)利要求9所述的覆蓋率測(cè)試系統(tǒng),其特征在于, 所述記錄模塊將探針函數(shù)的位置信息寫(xiě)入第一文件,以及根據(jù)已經(jīng)運(yùn)行的程序中探針函數(shù)的位置信息以及相應(yīng)探針函數(shù)的計(jì)數(shù)信息,獲得已經(jīng)運(yùn)行的程序中代碼覆蓋信息,并寫(xiě)入第二文件; 所述第一覆蓋信息生成模塊通過(guò)掃描所述第一文件獲得已經(jīng)運(yùn)行的程序中探針函數(shù)的位置信息,通過(guò)掃描所述第二文件獲得已經(jīng)運(yùn)行的程序中探針函數(shù)的計(jì)數(shù)信息,并根據(jù)已經(jīng)運(yùn)行的程序中探針函數(shù)的位置信息以及相應(yīng)探針函數(shù)的計(jì)數(shù)信息,生成第一覆蓋信息。
13.如權(quán)利要求12所述的覆蓋率測(cè)試系統(tǒng),其特征在于,所述第二覆蓋信息生成模塊通過(guò)掃描所述第一文件,獲得沒(méi)有調(diào)用到的程序中探針函數(shù)的位置信息,并生成第二覆蓋信息。
14.如權(quán)利要求9所述的覆蓋率測(cè)試系統(tǒng),其特征在于,所述編譯模塊在編譯源代碼時(shí),去除源代碼中空行、注釋、括號(hào)行、聲明語(yǔ)句等無(wú)效、非邏輯的代碼行。
【文檔編號(hào)】G06F11/36GK103699476SQ201210369615
【公開(kāi)日】2014年4月2日 申請(qǐng)日期:2012年9月27日 優(yōu)先權(quán)日:2012年9月27日
【發(fā)明者】吳云佳 申請(qǐng)人:騰訊科技(深圳)有限公司