亚洲狠狠干,亚洲国产福利精品一区二区,国产八区,激情文学亚洲色图

覆蓋率測試方法及系統(tǒng)的制作方法

文檔序號:6489376閱讀:391來源:國知局
覆蓋率測試方法及系統(tǒng)的制作方法
【專利摘要】本發(fā)明提出一種覆蓋率測試方法及系統(tǒng),其包括:編譯源代碼,在每一段代碼中均插入探針函數(shù);記錄所有探針函數(shù)的位置信息;運行程序,記錄探針函數(shù)的計數(shù)信息;根據(jù)已經(jīng)運行的程序中探針函數(shù)的位置信息以及相應(yīng)探針函數(shù)的計數(shù)信息,生成第一覆蓋信息;根據(jù)沒有調(diào)用到的程序中探針函數(shù)的位置信息,生成第二覆蓋信息;將所述第一覆蓋信息和所述第二覆蓋信息合并,計算獲得最終覆蓋率結(jié)果。本發(fā)明更準(zhǔn)確客觀地反映出程序代碼的真實覆蓋率,且適用于后臺服務(wù)類程序的測試。
【專利說明】覆蓋率測試方法及系統(tǒng)【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及軟件測試技術(shù),特別涉及一種軟件代碼的覆蓋率測試方法及系統(tǒng)。
【背景技術(shù)】
[0002]在C/C++軟件開發(fā)的質(zhì)量保證體系中,覆蓋率(軟件中代碼的運行比率)測試通常是一種有效發(fā)現(xiàn)問題的手段,通過代碼覆蓋率的分析,可以快速定位到哪些代碼是沒有運行的,從而構(gòu)造相應(yīng)的測試案例來覆蓋這些代碼,以發(fā)現(xiàn)軟件設(shè)計中的錯誤。
[0003]目前軟件代碼覆蓋率測試廣泛使用的是開源gcov工具,gcov工具是集成在gcc(GNU Compiler Collection, GUN編譯器套件)中的一個檢測代碼覆蓋率的工具,它通過編譯階段(即將源代碼編譯成可執(zhí)行代碼),在源代碼中插入探針函數(shù)(插入探針函數(shù)也稱為插樁,用來標(biāo)識代碼的運行次數(shù)),來記錄代碼是否運行,并根據(jù)記錄的運行信息分析出軟件代碼行、函數(shù)、分支的覆 蓋情況。
[0004]測試時,運行程序,首先將探針函數(shù)的位置信息記錄在一個文件中(例如通常將探針信息記錄在以.gcno結(jié)尾的文件中,后面簡稱為gcno文件)。
[0005]其次,在程序運行過程中對每段代碼的覆蓋率進行統(tǒng)計,覆蓋率的數(shù)值可以利用探針函數(shù)本身的計數(shù)功能來獲得,即運行過的代碼,相應(yīng)的探針函數(shù)便會計數(shù),并在程序優(yōu)雅退出(這里所述的優(yōu)雅退出是指程序正常退出,例如調(diào)用exit O函數(shù)退出程序)后將統(tǒng)計得到的覆蓋率寫入一個文件中(例如通常將覆蓋率記錄在以.gcda結(jié)尾的文件中,后面簡稱為gcda文件)。
[0006]最后,請參見圖1,從gcno文件和gcda文件中收集和匯總軟件的覆蓋率信息,產(chǎn)出
覆蓋率報告。
[0007]但是,現(xiàn)有的這種覆蓋率測試方法存在兩類問題:
[0008]( I)獲得覆蓋率結(jié)果準(zhǔn)確性低
[0009]生成gcda文件時候,有一個前提,就是對于源文件A,只有當(dāng)程序運行時使用或調(diào)用了源文件A中的代碼時,才會生成源文件A的gcda文件(A.gcda),而收集源文件A的覆蓋率信息時,必須A.gcno、A.gcda都存在時才可以收集得到。對于測試來說,考慮到測試時間,多數(shù)情況都沒有辦法保證測試案例可以將一個軟件程序完整地運行,因此很多時候只生成了部分源代碼的gcda文件,而測試過程中沒有運行的源代碼卻并沒有被納入計算范圍,所以會造成得出的覆蓋率結(jié)果不準(zhǔn)確。
[0010](2)對于不支持非優(yōu)雅退出的程序,無法獲取覆蓋率運行信息
[0011]gcda文件的生成,是在程序正常退出(即優(yōu)雅退出)后對覆蓋率統(tǒng)計得到的。但是對于后臺服務(wù)類程序來說,其程序運行是循環(huán)的,本身不提供優(yōu)雅退出機制,因而無法生成gcda文件,從而無法獲取覆蓋率信息。

【發(fā)明內(nèi)容】

[0012]本發(fā)明的目的是提供一種覆蓋率測試方法及系統(tǒng),以解決現(xiàn)有覆蓋率測試技術(shù)獲得的覆蓋率結(jié)果準(zhǔn)確性低的問題。
[0013]本發(fā)明提出一種覆蓋率測試方法,包括:
[0014]編譯源代碼,在每一段代碼中均插入探針函數(shù);
[0015]記錄所有探針函數(shù)的位置信息;
[0016]運行程序,記錄探針函數(shù)的計數(shù)信息;
[0017]根據(jù)已經(jīng)運行的程序中探針函數(shù)的位置信息以及相應(yīng)探針函數(shù)的計數(shù)信息,生成
第一覆蓋息;
[0018]根據(jù)沒有調(diào)用到的程序中探針函數(shù)的位置信息,生成第二覆蓋信息;
[0019]將所述第一覆蓋信息和所述第二覆蓋信息合并,計算獲得最終覆蓋率結(jié)果。
[0020]依照本發(fā)明較佳實施例所述的覆蓋率測試方法,還包括:
[0021]運行程序過程中,定時對已經(jīng)運行的程序中探針函數(shù)的計數(shù)信息進行記錄,并獲取已經(jīng)運行的程序中代碼的覆蓋信息。
[0022]依照本發(fā)明較佳實施例所述的覆蓋率測試方法,還包括:
[0023]注冊調(diào)用函數(shù)和信號處理函數(shù);
[0024]運行程序過程中,在所述調(diào)用函數(shù)接收到調(diào)用信號后,調(diào)用所述處理函數(shù)獲取已經(jīng)運行的程序中代碼的覆蓋信息。`
[0025]依照本發(fā)明較佳實施例所述的覆蓋率測試方法,所述注冊調(diào)用函數(shù)和信號處理函數(shù)的步驟包括:利用動態(tài)庫預(yù)加載的特性注冊所述注冊調(diào)用函數(shù)和所述信號處理函數(shù)。
[0026]依照本發(fā)明較佳實施例所述的覆蓋率測試方法,在程序運行正常退出時,對已經(jīng)運行的程序中探針函數(shù)的計數(shù)信息進行記錄。
[0027]依照本發(fā)明較佳實施例所述的覆蓋率測試方法,還包括:
[0028]將探針函數(shù)的位置信息寫入第一文件;
[0029]根據(jù)已經(jīng)運行的程序中探針函數(shù)的位置信息以及相應(yīng)探針函數(shù)的計數(shù)信息,獲得已經(jīng)運行的程序中代碼覆蓋信息,并寫入第二文件;
[0030]所述根據(jù)已經(jīng)運行的程序中探針函數(shù)的位置信息以及相應(yīng)探針函數(shù)的計數(shù)信息,生成第一覆蓋信息的步驟包括:掃描所述第一文件獲得已經(jīng)運行的程序中探針函數(shù)的位置信息,掃描所述第二文件獲得已經(jīng)運行的程序中探針函數(shù)的計數(shù)信息,并根據(jù)已經(jīng)運行的程序中探針函數(shù)的位置信息以及相應(yīng)探針函數(shù)的計數(shù)信息,生成第一覆蓋信息。
[0031]依照本發(fā)明較佳實施例所述的覆蓋率測試方法,所述根據(jù)沒有調(diào)用到的程序中探針函數(shù)的位置信息,生成第二覆蓋信息的步驟包括:
[0032]掃描所述第一文件,獲得沒有調(diào)用到的程序中探針函數(shù)的位置信息,并生成第二
覆蓋?目息。
[0033]依照本發(fā)明較佳實施例所述的覆蓋率測試方法,所述編譯源代碼的步驟還包括:去除源代碼中空行、注釋、括號行、聲明語句等無效、非邏輯的代碼行。
[0034]本發(fā)明另提出一種覆蓋率測試系統(tǒng),包括:
[0035]編譯模塊,用于編譯源代碼,并在每一段代碼中均插入探針函數(shù);
[0036]記錄模塊,用于記錄所有探針函數(shù)的位置信息,以及記錄探針函數(shù)的計數(shù)信息;
[0037]第一覆蓋信息生成模塊,用于根據(jù)已經(jīng)運行的程序中探針函數(shù)的位置信息以及相應(yīng)探針函數(shù)的計數(shù)信息,生成第一覆蓋信息;[0038]第二覆蓋信息生成模塊,用于根據(jù)沒有調(diào)用到的程序中探針函數(shù)的位置信息,生成第二覆蓋息;
[0039]合并模塊,用于將所述第一覆蓋信息和所述第二覆蓋信息合并,計算獲得最終覆蓋率結(jié)果。
[0040]依照本發(fā)明較佳實施例所述的覆蓋率測試系統(tǒng),所述記錄模塊在運行程序過程中,定時對已經(jīng)運行的程序中探針函數(shù)的計數(shù)信息進行記錄。
[0041]依照本發(fā)明較佳實施例所述的覆蓋率測試系統(tǒng),所述記錄模塊在程序運行正常退出時,對已經(jīng)運行的程序中探針函數(shù)的計數(shù)信息進行記錄。
[0042]依照本發(fā)明較佳實施例所述的覆蓋率測試系統(tǒng),所述記錄模塊將探針函數(shù)的位置信息寫入第一文件,以及根據(jù)已經(jīng)運行的程序中探針函數(shù)的位置信息以及相應(yīng)探針函數(shù)的計數(shù)信息,獲得已經(jīng)運行的程序中代碼覆蓋信息,并寫入第二文件;
[0043]所述第一覆蓋信息生成模塊通過掃描所述第一文件獲得已經(jīng)運行的程序中探針函數(shù)的位置信息,通過掃描所述第二文件獲得已經(jīng)運行的程序中探針函數(shù)的計數(shù)信息,并根據(jù)已經(jīng)運行的程序中探針函數(shù)的位置信息以及相應(yīng)探針函數(shù)的計數(shù)信息,生成第一覆蓋信息。
[0044]依照本發(fā)明較佳實施例所述的覆蓋率測試系統(tǒng),所述第二覆蓋信息生成模塊通過掃描所述第一文件,獲得沒有調(diào)用到的程序中探針函數(shù)的位置信息,并生成第二覆蓋信息。
[0045]依照本發(fā)明較佳實施例所述的覆蓋率測試系統(tǒng),所述編譯模塊在編譯源代碼時,去除源代碼中空行、注釋、括號行、聲明語句等無效、非邏輯的代碼行。
[0046]相對于現(xiàn)有技術(shù),本發(fā)明的有益效果是:本發(fā)明將測試過程中已經(jīng)運行的程序和沒有運行的程序都考慮在計算范圍內(nèi),不受測試數(shù)據(jù)變化的影響,即使在測試軟件沒有完全運行的情況下,也可以準(zhǔn)確客觀地反映出程序代碼的真實覆蓋率。此外,本發(fā)明可以在程序運行過程中對探針函數(shù)的動態(tài)計數(shù),支持覆蓋率數(shù)據(jù)的動態(tài)生成,同樣適用于后臺服務(wù)類程序的測試。
[0047]當(dāng)然,實施本發(fā)明的任一產(chǎn)品并不一定需要同時達到以上所述的所有優(yōu)點。
[0048]上述說明僅是本發(fā)明技術(shù)方案的概述,為了能夠更清楚了解本發(fā)明的技術(shù)手段,而可依照說明書的內(nèi)容予以實施,并且為了讓本發(fā)明的上述和其他目的、特征和優(yōu)點能夠更明顯易懂,以下特舉較佳實施例,并配合附圖,詳細說明如下。
【專利附圖】

【附圖說明】
[0049]圖1為現(xiàn)有的軟件代碼覆蓋率測試匯總示意圖;
[0050]圖2為本發(fā)明實施例的一種覆蓋率測試方法流程圖;
[0051]圖3為本發(fā)明實施例的一種動態(tài)生成第二文件的原理圖;
[0052]圖4為本發(fā)明實施例的一種獲得最終覆蓋率結(jié)果的原理圖;
[0053]圖5為本發(fā)明實施例的一種覆蓋率測試系統(tǒng)的結(jié)構(gòu)圖。
【具體實施方式】
[0054]為更進一步闡述本發(fā)明達成預(yù)定發(fā)明目的所采取的技術(shù)手段及功效,以下結(jié)合附圖及較佳實施例,對依據(jù)本發(fā)明提出的覆蓋率測試方法及系統(tǒng)其【具體實施方式】、方法、步驟及功效,詳細說明如后。
[0055]有關(guān)本發(fā)明的前述及其他技術(shù)內(nèi)容、特點及功效,在以下配合參考圖式的較佳實施例詳細說明中將可清楚的呈現(xiàn)。通過【具體實施方式】的說明,當(dāng)可對本發(fā)明為達成預(yù)定目的所采取的技術(shù)手段及功效得以更加深入且具體的了解,然而所附圖式僅是提供參考與說明之用,并非用來對本發(fā)明加以限制。
[0056]請參見圖2,其為本發(fā)明實施例的一種覆蓋率測試方法流程圖,其包括以下步驟:
[0057]S21,編譯源代碼,在每一段代碼中均插入探針函數(shù)。
[0058]編譯源代碼是將源代碼編譯成可執(zhí)行代碼的過程,其中包括去除源代碼中空行、注釋、括號行、聲明語句等無效、非邏輯的代碼行,也即是將源代碼編譯成有效代碼行。
[0059]在編譯源代碼的過程中,會在每一段代碼中均插入探針函數(shù)。這里所說的每一段代碼是指程序的基本塊。如果一段代碼的第一條語句被執(zhí)行過一次,這段代碼中的每一個都要執(zhí)行一次,稱為基本塊。一個基本塊中的所有語句的執(zhí)行次數(shù)一定是相同的。一般由多個順序執(zhí)行語句后邊跟一個跳轉(zhuǎn)語句組成。所以一般情況下基本塊的最后一條語句一定是一個跳轉(zhuǎn)語句,跳轉(zhuǎn)的目的地是另外一個基本塊的第一條語句,如果跳轉(zhuǎn)時有條件的,就產(chǎn)生了分支,該基本塊就有兩個基本塊作為目的地。
[0060]在每一段代碼中插入探針函數(shù)也稱為在代碼中插樁,代碼插樁技術(shù)是在保證被測程序原有邏輯完整性的基礎(chǔ)上,在代碼中插入一些探針(又稱為“探測儀”),通過探針的執(zhí)行并拋出代碼運行的特征數(shù)據(jù),通過對這些數(shù)據(jù)的分析,可以獲得程序的控制流和數(shù)據(jù)流信息,進而得到邏輯覆蓋等動態(tài)信息,從而實現(xiàn)測試目的的方法。這里所述的探針函數(shù)具有計數(shù)的功能,當(dāng)探針函數(shù)所在的一段代碼運行一次后,該探針函數(shù)便自動計數(shù)一次,也即表示該段代碼被覆蓋。
[0061]S22,記錄所有探針函數(shù)的位置信息。
[0062]在軟件程序測試運行過程中,有的代碼是被覆蓋的(會運行的),而有些代碼卻沒有被覆蓋(不會運行),這部分沒有被覆蓋的代碼會成為系統(tǒng)的負擔(dān),甚至?xí)?dǎo)致程序出錯,所以測試的目的就是通過計算軟件運行時代碼的覆蓋率,進而找出這些沒有覆蓋到的代碼。因為探針函數(shù)可以標(biāo)示出代碼的運行情況,所以為了計算覆蓋率,需要記錄所有探針函數(shù)的位置信息,探針函數(shù)的位置關(guān)系表現(xiàn)為一個樹狀的結(jié)構(gòu)。在實際操作中,可以將探針函數(shù)的位置信息寫入一個第一文件中,例如以.gcno結(jié)尾的文件(后面所述的gcno文件即指第一文件)。
[0063]S23,運行程序,記錄探針函數(shù)的計數(shù)信息。
[0064]在程序運行過程中,一段代碼被執(zhí)行后,對應(yīng)的探針函數(shù)便會有計數(shù),從而便能計算出已運行代碼的覆蓋信息,可以將這個已運行代碼的覆蓋信息寫入一個第二文件中,例如以.gcda結(jié)尾的文件(后面所述的gcda文件即指第二文件)。在實際操作中,可以在程序入口處,通過atexit函數(shù),注冊一個用于把運行階段的覆蓋信息寫入本地文件的函數(shù)gcov_exit O ,從而調(diào)用gcov_exit O函數(shù)時就會把覆蓋信息寫入gcda文件中。
[0065]其中,記錄已運行探針函數(shù)的計數(shù)信息(也即生成gcda文件)可以采用兩種方式:
[0066](I)在程序運行正常退出時,對已經(jīng)運行的程序中探針函數(shù)的計數(shù)信息進行記錄。程序運行正常退出也稱為優(yōu)雅退出,這種方式適合支持優(yōu)雅退出的程序,即程序優(yōu)雅退出時,調(diào)用gcov_exit()函數(shù)將已運行的覆蓋信息寫入gcda文件中。[0067](2)運行程序過程中,定時對已經(jīng)運行的程序中探針函數(shù)的計數(shù)信息進行記錄?;谟行┏绦虿恢С謨?yōu)雅退出(如后臺服務(wù)類程序),而且優(yōu)雅退出后程序的重新啟動往往較慢,所以也可以采用這種動態(tài)方式來對覆蓋信息進行記錄。
[0068]具體的實現(xiàn)方式可以是:利用動態(tài)庫預(yù)加載的特性,先在程序中注冊一個調(diào)用函數(shù)和一個信號處理函數(shù),然后在程序運行過程中,定時(當(dāng)然也可以在需要的時候)向調(diào)用函數(shù)發(fā)送一個調(diào)用信號,從而調(diào)用函數(shù)會調(diào)用處理函數(shù)獲取已運行的代碼的計數(shù)信息,從而獲得已經(jīng)運行的程序中代碼的覆蓋信息,并寫入gcda文件中。而每次調(diào)用信號處理函數(shù)而獲取的代碼計數(shù)信息,都會累加寫入gcda文件中。
[0069]請結(jié)合參見圖3,其為動態(tài)生成gcda文件的原理圖,其中_attribute_((constructor))void_ctorGcovRegister O 函數(shù)即為調(diào)用函數(shù),void_sigHandlerGcov (int status)函數(shù)即為信號處理函數(shù),USRl信號即為調(diào)用信號。當(dāng)_attribute—((constructor)) void_ctorGcovRegister O 函數(shù)捕獲 USRl 信號時,就會調(diào)用void_sigHandlerGcov (int status)函數(shù),該函數(shù)內(nèi)部會調(diào)用gcov_exit O函數(shù)把覆蓋信息寫入到gcda文件中。
[0070]S24,根據(jù)已經(jīng)運行的程序中探針函數(shù)的位置信息以及相應(yīng)探針函數(shù)的計數(shù)信息,
生成第一覆蓋信息。
[0071]所述的第一覆蓋信息是指已運行的程序中代碼的相關(guān)覆蓋信息,如已運行程序中代碼的覆蓋率結(jié)果、運行的代碼的數(shù)量位置、未運行代碼的數(shù)量位置等。
[0072]實際操作中,掃描gcno文件可以獲得已經(jīng)運行的程序中探針函數(shù)的位置信息,也即獲得了已經(jīng)運行的程序中代碼段的總數(shù)。掃描gcda文件可以獲得已經(jīng)運行的程序中代碼的計數(shù)信息,即哪些代碼運行過,哪些代碼沒有運行過。從而通過掃描gcno文件和gcda文件所得到的信息便能生成第一覆蓋信息。
[0073]S25,根據(jù)沒有調(diào)用到的程序中探針函數(shù)的位置信息,生成第二覆蓋信息。
[0074]所述第二覆蓋信息是指沒有運行的程序中代碼的相關(guān)信息,如這部分代碼的覆蓋率(為0),代碼的數(shù)量位置等。實際操作中,可以通過掃描gcno文件,獲得沒有調(diào)用到的程序中探針函數(shù)的位置信息,即可以獲得相應(yīng)代碼的數(shù)量和位置信息,從而并生成第二覆蓋信息。
[0075]S26,將所述第一覆蓋信息和所述第二覆蓋信息合并,計算獲得最終覆蓋率結(jié)果。
[0076]所述最終覆蓋率結(jié)果是指反映軟件測試真實的代碼覆蓋率。請結(jié)合參見圖4,其為獲得最終覆蓋率結(jié)果的原理圖,由于第一覆蓋信息中包含了已運行的程序中代碼的相關(guān)覆蓋信息,第二覆蓋信息中包含了沒有運行的程序中代碼的相關(guān)信息,由第一覆蓋信息和第二覆蓋信息合并匯總才能得到真實的代碼覆蓋率。
[0077]例如,假設(shè)一個軟件中包含10個文件,而每個文件包含1000段代碼,在測試過程中,由于程序冗長耗時過久而僅運行了 5個文件的程序代碼,假設(shè)運行的這5個文件中,每個文件均只覆蓋了 500段代碼。
[0078]如果按照現(xiàn)有的計算方法,則:
[0079]覆蓋率=覆蓋的有效代碼行/所有覆蓋到的源文件的有效代碼行之和
[0080]=5*500/5*1000 = 50%
[0081]可見,由于未將沒有運行的5個文件考慮在內(nèi),因而得出的覆蓋率是不準(zhǔn)確的。而如果按照本發(fā)明的計算方法,則:
[0082]覆蓋率=覆蓋的有效代碼行/所有源文件的有效代碼行之和
[0083]=5*500/10*1000 = 25%
[0084]顯然由于本發(fā)明將已經(jīng)運行的程序和未運行的程序都考慮在計算范圍內(nèi),可以更客觀更準(zhǔn)確地反映測試結(jié)果。
[0085]本發(fā)明另提出一種覆蓋率測試系統(tǒng),請參見圖5,其包括編譯模塊51、記錄模塊52、第一覆蓋信息生成模塊53、第二覆蓋信息生成模塊54以及合并模塊55。記錄模塊52與編譯模塊51相連,第一覆蓋信息生成模塊53和第二覆蓋信息生成模塊54均與記錄模塊52連接,合并模塊55分別與第一覆蓋信息生成模塊53和第二覆蓋信息生成模塊54相連。
[0086]進行測試時,首先由編譯模塊51對源代碼進行編譯,并在每一段代碼中均插入探針函數(shù)。編譯過程中,可以去除源代碼中空行、注釋、括號行、聲明語句等無效、非邏輯的代碼行。
[0087]編譯過程中,記錄模塊52會記錄下所有探針函數(shù)的位置信息,并將其寫入一個以.gcno結(jié)尾的文件(即第一文件)。探針函數(shù)的位置關(guān)系表現(xiàn)為一個樹狀的結(jié)構(gòu)。
[0088]編譯完成后,便開始執(zhí)行程序。在程序運行過程中,一段代碼被執(zhí)行后,對應(yīng)的探針函數(shù)便會有計數(shù),從而便能計算出已運行程序中代碼的覆蓋信息記錄模塊52還會記錄下這個已運行程序中代碼的覆蓋信息,并寫入一個以.gcda結(jié)尾的文件(即第二文件)。
[0089]其中,記錄模塊52記錄已運行探針函數(shù)的計數(shù)信息(也即生成gcda文件)可以采用兩種方式:
[0090](I)在程序運行正常退出時,對已經(jīng)運行的程序中探針函數(shù)的計數(shù)信息進行記錄。程序運行正常退出也稱為優(yōu)雅退出,這種方式適合支持優(yōu)雅退出的程序,即程序優(yōu)雅退出時,將已運行的覆蓋信息寫入gcda文件中。
[0091](2)運行程序過程中,定時對已經(jīng)運行的程序中探針函數(shù)的計數(shù)信息進行記錄?;谟行┏绦虿恢С謨?yōu)雅退出(如后臺服務(wù)類程序),而且優(yōu)雅退出后程序的重新啟動往往較慢,所以也可以采用這種動態(tài)方式來對覆蓋信息進行記錄。
[0092]具體的實現(xiàn)方式可以是:利用動態(tài)庫預(yù)加載的特性,在記錄模塊52中注冊一個調(diào)用函數(shù)和一個信號處理函數(shù),然后在程序運行過程中,定時(當(dāng)然也可以在需要的時候)向調(diào)用函數(shù)發(fā)送一個調(diào)用信號,從而調(diào)用函數(shù)會調(diào)用處理函數(shù)獲取已運行的代碼的計數(shù)信息,從而獲得已經(jīng)運行的程序中代碼的覆蓋信息,并寫入gcda文件中。而每次調(diào)用信號處理函數(shù)而獲取的代碼計數(shù)信息,都會累加寫入gcda文件中。
[0093]程序運行結(jié)束后(此時所執(zhí)行的程序可能是軟件的所有程序,也可能是軟件的一部分程序),第一覆蓋信息生成模塊53會根據(jù)已經(jīng)運行的程序中探針函數(shù)的位置信息以及相應(yīng)探針函數(shù)的計數(shù)信息,生成第一覆蓋信息。所述的第一覆蓋信息是指已運行的程序中代碼的相關(guān)覆蓋信息,如已運行程序中代碼的覆蓋率結(jié)果、運行的代碼的數(shù)量位置、未運行代碼的數(shù)量位置等。具體為:第一覆蓋信息生成模塊53通過掃描gcno文件可以獲得已經(jīng)運行的程序中探針函數(shù)的位置信息,也即獲得了已經(jīng)運行的程序中代碼段的總數(shù)。通過掃描gcda文件可以獲得已經(jīng)運行的程序中代碼的計數(shù)信息,即哪些代碼運行過,哪些代碼沒有運行過。從而通過掃描gcno文件和gcda文件所得到的信息便能生成第一覆蓋信息。
[0094]第二覆蓋信息生成模塊54會根據(jù)沒有調(diào)用到的程序中探針函數(shù)的位置信息,生成第二覆蓋信息。所述第二覆蓋信息是指沒有運行的程序中代碼的相關(guān)信息,如這部分代碼的覆蓋率(為0),代碼的數(shù)量位置等。具體為:第二覆蓋信息生成模塊54通過掃描gcno文件,可以獲得沒有調(diào)用到的程序中探針函數(shù)的位置信息,即可以獲得相應(yīng)代碼的數(shù)量和位置信息,從而并生成第二覆蓋信息。
[0095]最后,合并模塊55將第一覆蓋信息生成模塊53和第二覆蓋信息生成模塊54輸出的第一覆蓋信息和第二覆蓋信息進行匯總合并,并計算出最終覆蓋率結(jié)果。
[0096]本發(fā)明將測試過程中已經(jīng)運行的程序和沒有運行的程序都考慮在計算范圍內(nèi),不受測試數(shù)據(jù)變化的影響,即使在測試軟件沒有完全運行的情況下,也可以準(zhǔn)確客觀地反映出程序代碼的真實覆蓋率。此外,本發(fā)明可以在程序運行過程中對探針函數(shù)的動態(tài)計數(shù),支持覆蓋率數(shù)據(jù)的動態(tài)生成,同樣適用于后臺服務(wù)類程序的測試。
[0097]以上所述,僅是本發(fā)明的較佳實施例而已,并非對本發(fā)明作任何形式上的限制,雖然本發(fā)明已以較佳實施例揭露如上,然而并非用以限定本發(fā)明,任何熟悉本專業(yè)的技術(shù)人員,在不脫離本發(fā)明技術(shù)方案范圍內(nèi),當(dāng)可利用上述揭示的技術(shù)內(nèi)容作出些許更動或修飾為等同變化的等效實施例,但凡是未脫離本發(fā)明技術(shù)方案內(nèi)容,依據(jù)本發(fā)明的技術(shù)實質(zhì)對以上實施例所作的任何簡單修改、等同變化與修飾,均仍屬于本發(fā)明技術(shù)方案的范圍內(nèi)。
【權(quán)利要求】
1.一種覆蓋率測試方法,其特征在于,包括: 編譯源代碼,在每一段代碼中均插入探針函數(shù); 記錄所有探針函數(shù)的位置信息; 運行程序,記錄探針函數(shù)的計數(shù)信息; 根據(jù)已經(jīng)運行的程序中探針函數(shù)的位置信息以及相應(yīng)探針函數(shù)的計數(shù)信息,生成第一覆蓋信息; 根據(jù)沒有調(diào)用到的程序中探針函數(shù)的位置信息,生成第二覆蓋信息; 將所述第一覆蓋信息和所述第二覆蓋信息合并,計算獲得最終覆蓋率結(jié)果。
2.如權(quán)利要求1所述的覆蓋率測試方法,其特征在于,還包括: 運行程序過程中,定時對已經(jīng)運行的程序中探針函數(shù)的計數(shù)信息進行記錄,并獲取已經(jīng)運行的程序中代碼的覆蓋信息。
3.如權(quán)利要求2所述的覆蓋率測試方法,其特征在于,還包括: 注冊調(diào)用函數(shù)和信號處理函數(shù); 運行程序過程中,在所述調(diào)用函數(shù)接收到調(diào)用信號后,調(diào)用所述處理函數(shù)獲取已經(jīng)運行的程序中代碼的覆蓋信息。
4.如權(quán)利要求3所述的覆蓋率測試方法,其特征在于,所述注冊調(diào)用函數(shù)和信號處理函數(shù)的步驟包括:利用動態(tài)庫預(yù)加載的特性注冊所述注冊調(diào)用函數(shù)和所述信號處理函數(shù)。
5.如權(quán)利要求1所述的覆蓋率測試方法,其特征在于,在程序運行正常退出時,對已經(jīng)運行的程序中探針函數(shù)的計數(shù)信息進行記錄。
6.如權(quán)利要求1所述的覆蓋率測試方法,其特征在于,還包括: 將探針函數(shù)的位置信息寫入第一文件; 根據(jù)已經(jīng)運行的程序中探針函數(shù)的位置信息以及相應(yīng)探針函數(shù)的計數(shù)信息,獲得已經(jīng)運行的程序中代碼覆蓋信息,并寫入第二文件; 所述根據(jù)已經(jīng)運行的程序中探針函數(shù)的位置信息以及相應(yīng)探針函數(shù)的計數(shù)信息,生成第一覆蓋信息的步驟包括:掃描所述第一文件獲得已經(jīng)運行的程序中探針函數(shù)的位置信息,掃描所述第二文件獲得已經(jīng)運行的程序中探針函數(shù)的計數(shù)信息,并根據(jù)已經(jīng)運行的程序中探針函數(shù)的位置信息以及相應(yīng)探針函數(shù)的計數(shù)信息,生成第一覆蓋信息。
7.如權(quán)利要求6所述的覆蓋率測試方法,其特征在于,所述根據(jù)沒有調(diào)用到的程序中探針函數(shù)的位置信息,生成第二覆蓋信息的步驟包括: 掃描所述第一文件,獲得沒有調(diào)用到的程序中探針函數(shù)的位置信息,并生成第二覆蓋信息。
8.如權(quán)利要求1所述的覆蓋率測試方法,其特征在于,所述編譯源代碼的步驟還包括:去除源代碼中空行、注釋、括號行、聲明語句等無效、非邏輯的代碼行。
9.一種覆蓋率測試系統(tǒng),其特征在于,包括: 編譯模塊,用于編譯源代碼,并在每一段代碼中均插入探針函數(shù); 記錄模塊,用于記錄所有探針函數(shù)的位置信息,以及記錄探針函數(shù)的計數(shù)信息; 第一覆蓋信息生成模塊,用于根據(jù)已經(jīng)運行的程序中探針函數(shù)的位置信息以及相應(yīng)探針函數(shù)的計數(shù)信息,生成第一覆蓋信息; 第二覆蓋信息生成模塊,用于根據(jù)沒有調(diào)用到的程序中探針函數(shù)的位置信息,生成第二覆蓋信息; 合并模塊,用于將所述第一覆蓋信息和所述第二覆蓋信息合并,計算獲得最終覆蓋率結(jié)果。
10.如權(quán)利要求9所述的覆蓋率測試系統(tǒng),其特征在于,所述記錄模塊在運行程序過程中,定時對已經(jīng)運行的程序中探針函數(shù)的計數(shù)信息進行記錄。
11.如權(quán)利要求9所述的覆蓋率測試系統(tǒng),其特征在于,所述記錄模塊在程序運行正常退出時,對已經(jīng)運行的程序中探針函數(shù)的計數(shù)信息進行記錄。
12.如權(quán)利要求9所述的覆蓋率測試系統(tǒng),其特征在于, 所述記錄模塊將探針函數(shù)的位置信息寫入第一文件,以及根據(jù)已經(jīng)運行的程序中探針函數(shù)的位置信息以及相應(yīng)探針函數(shù)的計數(shù)信息,獲得已經(jīng)運行的程序中代碼覆蓋信息,并寫入第二文件; 所述第一覆蓋信息生成模塊通過掃描所述第一文件獲得已經(jīng)運行的程序中探針函數(shù)的位置信息,通過掃描所述第二文件獲得已經(jīng)運行的程序中探針函數(shù)的計數(shù)信息,并根據(jù)已經(jīng)運行的程序中探針函數(shù)的位置信息以及相應(yīng)探針函數(shù)的計數(shù)信息,生成第一覆蓋信息。
13.如權(quán)利要求12所述的覆蓋率測試系統(tǒng),其特征在于,所述第二覆蓋信息生成模塊通過掃描所述第一文件,獲得沒有調(diào)用到的程序中探針函數(shù)的位置信息,并生成第二覆蓋信息。
14.如權(quán)利要求9所述的覆蓋率測試系統(tǒng),其特征在于,所述編譯模塊在編譯源代碼時,去除源代碼中空行、注釋、括號行、聲明語句等無效、非邏輯的代碼行。
【文檔編號】G06F11/36GK103699476SQ201210369615
【公開日】2014年4月2日 申請日期:2012年9月27日 優(yōu)先權(quán)日:2012年9月27日
【發(fā)明者】吳云佳 申請人:騰訊科技(深圳)有限公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1