本發(fā)明屬于軟件測試領(lǐng)域,具體是指一種輕量級的代碼分支覆蓋率檢測方法。
背景技術(shù):
白盒測試是軟件測試的一種重要的測試方法,在白盒測試中,主要有以下幾種代碼覆蓋率:語句覆蓋、分支覆蓋(也稱判定覆蓋)、條件覆蓋、判定/條件覆蓋、條件組合覆蓋、路徑覆蓋。
在語句覆蓋和分支覆蓋中,我們關(guān)心的是每一條語句或者每一條分支是否被執(zhí)行過,因此需要一種檢測方法來解決這一情況。
技術(shù)實現(xiàn)要素:
本發(fā)明提供了一種輕量級的代碼分支覆蓋率檢測方法,可以檢測每一條語句或分支在測試中是否被執(zhí)行過,完成在白盒測試中語句覆蓋率和分支覆蓋率的檢測。
本發(fā)明提供的輕量級的代碼分支覆蓋率檢測方法,實現(xiàn)步驟如下:
步驟1,輸入被測試函數(shù)的代碼,統(tǒng)計代碼中的分支總數(shù)N,并對各分支進(jìn)行編號0,1,…,N-1。
步驟2,在被測函數(shù)的入口插入代碼,定義數(shù)組branch[N/K+1],并設(shè)置數(shù)組中的元素均為0。K表示機(jī)器字長。
步驟3,對于每個分支i,插入代碼:branch[i/K]|=1<<(i%K)。i=0,1,…,N-1。
其中,branch是整型數(shù)組;|是按位或運算符,a|=b表示將變量a和b按位或運算后的結(jié)果賦值給變量a;<<是左移位運算符,c<<d的結(jié)果是將變量c對應(yīng)的二進(jìn)制位向左移動d位,右邊空缺部分補0。
步驟4,在被測函數(shù)的出口插入代碼,輸出數(shù)組branch[N/K+1]的值。
步驟5,輸入測試用例集合,執(zhí)行測試代碼,在測試完成后,統(tǒng)計數(shù)組branch[N/K+1]中所有元素對應(yīng)的二進(jìn)制位為1的個數(shù)n,獲得代碼分支覆蓋率為n/N。
本發(fā)明的優(yōu)點與積極效果在于:
(1)在本發(fā)明中,使用1個比特位即可記錄1個分支的執(zhí)行情況,數(shù)據(jù)量被大幅度的壓縮,減少了內(nèi)存資源的占用。
(2)在實際分支中需要插樁的代碼非常簡單,只需要將分支對應(yīng)的比特位置1即可。在測試程序運行過程中,不進(jìn)行數(shù)據(jù)輸出工作,測試程序運行完畢后,再一次性輸出記錄結(jié)果,這樣不僅可以大幅度提高測試的執(zhí)行速度,而且可以大大減少測試的數(shù)據(jù)量,減少了后期數(shù)據(jù)給分析的工作量。
(3)由于在測試程序執(zhí)行的過程中,并不產(chǎn)生數(shù)據(jù)的輸出,所以對于同一個程序測試輸出結(jié)果是固定的,不會隨著測試程序的輸入數(shù)據(jù)規(guī)模的擴(kuò)大而變大。
附圖說明
圖1是本發(fā)明提供的代碼分支覆蓋率檢測原理圖;
圖2是本發(fā)明的代碼分支覆蓋率檢測方法整體流程圖;
圖3是采用本發(fā)明方法在求最大值算法中的實際執(zhí)行流程圖。
具體實施方式
下面將結(jié)合附圖和實施例對本發(fā)明作進(jìn)一步的詳細(xì)說明。
本發(fā)明可以遵照所述原理由軟件編碼實現(xiàn)。其工作原理如圖1所示。
圖1中直角矩形表示測試過程中的數(shù)據(jù),圓角矩形表示各種處理和操作。代碼的覆蓋率檢測需要輸入兩種數(shù)據(jù),分別是被測代碼和測試所使用的用例集。設(shè)置有中間數(shù)據(jù)測試結(jié)果產(chǎn)生,經(jīng)過最后的分析和計算,即可產(chǎn)生本次測試的分支覆蓋率。
圖1中①是對被測代碼的初步處理,對被測代碼進(jìn)行靜態(tài)分析,對每一個分支和跳轉(zhuǎn)進(jìn)行編號,編號從0開始,設(shè)記錄的分支和跳轉(zhuǎn)的總數(shù)為N。下面將分支和跳轉(zhuǎn)統(tǒng)稱為分支。
圖1中②表示對被測代碼的插樁操作,這是本發(fā)明的關(guān)鍵操作。本發(fā)明只使用1個比特位來記錄每個分支的執(zhí)行情況。比如以32位機(jī)器為例,即K=32,使用數(shù)組branch[N/32+1]即可完成所需要的記錄,數(shù)組元素的類型是32位的整型。對于分支編號為i的分支,插入代碼
branch[i/32]|=1<<(i%32),
branch是整型數(shù)組,每個元素可以記錄32個分支的執(zhí)行情況。這段代碼意義就是找到分支對應(yīng)的比特位,并對其進(jìn)行置1操作,即將第i%32位置1。下面詳細(xì)說明這段代碼每一步的操作。
(1)i/32是做除法,并且結(jié)果保留整數(shù),比如33/32的結(jié)果是1。
(2)|是按位或運算符,a|b的結(jié)果是將變量a和b的每一個二進(jìn)制位進(jìn)行對應(yīng)位的或運算,比如3(二進(jìn)制是00000011)和5(二進(jìn)制是00000101),3|5的結(jié)果是7(二進(jìn)制00000111)。a|=b等同于a=a|b。即將a|b的結(jié)果賦值給變量a。
(3)<<是左移位運算符,c<<d的結(jié)果是將變量c對應(yīng)的二進(jìn)制位向左移動d位,右邊空缺部分補0。比如1<<2的結(jié)果是4,即將二進(jìn)制00000001左移2位的結(jié)果是二進(jìn)制00000100。這樣上面的代碼1<<(i%32)的意思是得到了標(biāo)號為i的分支對應(yīng)比特位的位置,比如i=33,1<<(i%32)得到的結(jié)果是2。其中的%表示模運算,即求余數(shù)。
例如,i=1時,1/32的值是0,對應(yīng)的代碼是branch[0]|=2,將branch數(shù)組下標(biāo)為0的元素第2位置為1,2的二進(jìn)制是00000010,右數(shù)第二位是1。當(dāng)i=33時,33/32的值是1,對應(yīng)的代碼是branch[1]|=2,是將branch數(shù)組下標(biāo)為1的元素的第2位置為1。對于32位機(jī)器,在用二進(jìn)制表示時為32個比特位,上面是以8位二進(jìn)制來舉例說明的。
這樣只要相應(yīng)的分支執(zhí)行過后,此分支對應(yīng)的比特位就會被置1。最后,在函數(shù)的每個出口,插入代碼,將本函數(shù)的branch數(shù)組的值全部輸出,供下一步計算使用。
圖1中③表示執(zhí)行插樁后的被測代碼,執(zhí)行結(jié)束后,可以獲得每個函數(shù)的branch數(shù)組的值。
圖1中④表示對于branch數(shù)組的進(jìn)一步計算。具體方法是統(tǒng)計數(shù)組branch的所有元素對應(yīng)二進(jìn)制位中1的個數(shù)n,最終可以得到代碼的分支覆蓋率BRC=n/N。
圖2為本發(fā)明的輕量級的代碼分支覆蓋率檢測方法的整體流程示意圖,各步驟如下。
步驟1,輸入被測試函數(shù)的代碼,統(tǒng)計代碼中的分支總數(shù)N,并對各分支進(jìn)行編號0,1,…,N-1。
步驟2,在被測函數(shù)的入口插入代碼,用于定義數(shù)組branch[N/32+1],并設(shè)置數(shù)組中的元素均為0。
步驟3,對于每個分支i,插入代碼:branch[i/32]|=1<<(i%32)。i=0,1,…,N-1。
步驟4,在被測函數(shù)的出口插入代碼,用于輸出數(shù)組branch[N/32+1]的值。
步驟5,輸入測試用例集合,執(zhí)行測試代碼,在測試完成后,統(tǒng)計數(shù)組branch[N/32+1]中比特位為1的個數(shù)n,獲得代碼分支覆蓋率為n/N。
圖3是以求最大值算法為例,展示了對代碼插樁后的流程圖。圖中黑色的框圖表示原被測代碼的執(zhí)行過程,帶點虛線的框圖表示根據(jù)本發(fā)明原理,插入的代碼執(zhí)行流程。因為本例中分支總數(shù)較少,為了表示方便,以branch變量代替了原理中的branch數(shù)組,基本原理是保持不變的。如圖3所示,設(shè)置變量branch,初始值為0,在求最大值的過程中一共有4個分支,標(biāo)號分別為0,1,2,3。當(dāng)執(zhí)行某個分支時,例如branch|=1<<1,則將變量branch的第1位置為1。
本發(fā)明方法先統(tǒng)計分支的個數(shù),再設(shè)置相應(yīng)的數(shù)組branch,然后使用數(shù)組branch中的每個元素的比特位來記錄分支的執(zhí)行情況,理論上使用了最少的變量,對于像在開發(fā)板或者單片機(jī)等內(nèi)存資源稀缺的環(huán)境中,這樣做是意義重大的。而且,在每次分支執(zhí)行的時候,只要對相應(yīng)的比特位進(jìn)行置位操作就可以,沒有信息的輸出。因為計算操作比輸出操作要快得多,這樣不僅大大加快了執(zhí)行速度,而且對于輸出信息的統(tǒng)計計算也非常簡單。相對于直觀的統(tǒng)計方法,本發(fā)明降低了內(nèi)存的使用量,同時避免了頻繁的輸出操作,如果使用在分支中輸出信息,將會大大增加程序的運行速度,而且對于輸出信息的計算統(tǒng)計也比較本發(fā)明的方法復(fù)雜。