作者 |李偉 上??匕舶踩珳y(cè)評(píng)部總監(jiān)
來源 |鑒源實(shí)驗(yàn)室
社群 |添加微信號(hào)“TICPShanghai”加入“上??匕?1fusa安全社區(qū)”
引言:上一篇開始我們介紹白盒的代碼結(jié)構(gòu)覆蓋率測(cè)試,已經(jīng)完成了語句覆蓋測(cè)試的講解,本篇我們介紹分支覆蓋。
01
關(guān)于定義
從測(cè)試技術(shù)對(duì)代碼的測(cè)試程度上來說,在復(fù)雜代碼中,分支覆蓋比語句覆蓋效果要好。很多時(shí)候分支覆蓋也被叫做判定覆蓋。語句覆蓋是要求設(shè)計(jì)的測(cè)試用例可以讓所有的語句都能夠被執(zhí)行測(cè)試。分支覆蓋是要求設(shè)計(jì)用例對(duì)代碼中所有的邏輯判定分支都被執(zhí)行測(cè)試,也就是每次判定邏輯上真假兩種的分支執(zhí)行情況都覆蓋。從定義上我們就可以看出兩種方法的測(cè)試度量角度是不一樣的。計(jì)算方法上,語句覆蓋的分母是代碼總行數(shù),分支覆蓋的分母是代碼中所有判斷的分支總數(shù)。
02
分支覆蓋測(cè)試的舉例
我們使用下面一段簡(jiǎn)單代碼來舉例說明:
這段代碼總共11行,一個(gè)邏輯判斷的條件,即x<10為真或假,我們可以看到輸入的變量a和b決定了輸出值y。對(duì)于這段代碼的分支覆蓋測(cè)試設(shè)計(jì),我們令a=5或a=15,對(duì)應(yīng)x<10為真或假兩種情況。a=5時(shí)x<10為真,測(cè)試用例執(zhí)行了代碼的第1-6行進(jìn)入了邏輯真的分支,a=15時(shí)x<10為假,代碼執(zhí)行了第1、2和8至11行,執(zhí)行了邏輯為假的分支。這兩條測(cè)試用例覆蓋全部的兩個(gè)判定分支,分支覆蓋率為100%。
這上面這段代碼中,我們針對(duì)分支覆蓋設(shè)計(jì)了兩條測(cè)試用例,達(dá)到了覆蓋率100%,我們可以發(fā)現(xiàn)同樣是這兩條測(cè)試設(shè)計(jì),語句覆蓋率一樣達(dá)到了100%,那語句覆蓋跟分支覆蓋的區(qū)別如何體現(xiàn)呢,同樣是這段代碼我們實(shí)際中很多時(shí)候是用下面的習(xí)慣編寫,如:
這段代碼的效果跟前面舉例中代碼的效果是一樣的,對(duì)于分支覆蓋設(shè)計(jì)也是一樣,因?yàn)橥瑯又挥幸粋€(gè)判定條件,需要分別測(cè)試x<10為真或假的兩種分支情況,但是語句覆蓋設(shè)計(jì)就不一樣了,語句覆蓋設(shè)計(jì)只需要設(shè)計(jì)一條用例,令a=5即可以覆蓋所有的代碼語句。這里我們就可以看出分支覆蓋的結(jié)構(gòu)化程度高于語句覆蓋。
上面的例子相對(duì)簡(jiǎn)單,我們把這段代碼稍微變動(dòng),來深入探討一下分支覆蓋。示例代碼如下:
我們可以看到這段代碼的邏輯判斷了一次,代碼同樣有兩個(gè)分支,針對(duì)分支覆蓋測(cè)試我們只需要針對(duì)x < 10 && y > 10 == 0 為真或假兩種情況,即我們可以令a=15或b=5時(shí)代碼判斷進(jìn)入條件真的分支,令a=5且b=15代碼判斷進(jìn)入條件假的分支。
上面的例子我們也可以看出,分支覆蓋測(cè)試我們僅在if后面的整體判定語句上取了真和假兩種情況,并未深入到該行代碼語句中每個(gè)判定條件來取真假。
03
使用工具來進(jìn)行分支覆蓋測(cè)試
本章節(jié)我們繼續(xù)使用SmartRocket TestGrid這款工具進(jìn)行代碼的分支覆蓋測(cè)試分析,給大家介紹工具是如何生成測(cè)試用例完成測(cè)試任務(wù)的。
3.1工具測(cè)試舉例
針對(duì)如下代碼:
這段代碼我們可以看到函數(shù)的形參有兩個(gè),分別是lua_State *L、init idx,代碼邏輯也較為簡(jiǎn)單,當(dāng)more為真時(shí)執(zhí)行api_incr_top(L),為假時(shí)執(zhí)行L->top -= 1。more為代碼塊中定義的局部變量,被賦值為luaH_next(L, hvalue(t), L->top - 1)。
工具自動(dòng)分析后會(huì)生產(chǎn)控制流圖如下:
控制流圖可以直觀地看到在本例中兩條分支情況,我們可以設(shè)計(jì)測(cè)試用例令more分別為真和假,分別覆蓋兩條分支,這樣就可以完成分支100%覆蓋。
我們通過查看項(xiàng)目頭文件可以得到函數(shù)luaH_next()的形參hvalue(t)已有定義,通過宏替換變?yōu)閘uaH_next (L, ((&((((union GCUnion *)((((t)->value_).gc))))->h))), L->top - 1),可以通過工具來生成用例中的樁函數(shù),下圖為工具自動(dòng)生成的測(cè)試用例1:
本條用例中樁函數(shù)的返回值控制了判斷條件的真或假,本條測(cè)試用例覆蓋的是代碼中為真的分支語句。代碼中函數(shù)的最終返回值也是由more變量決定,我們?cè)谟美妮敵鲆部梢钥吹綄?shí)際返回值跟樁函數(shù)的返回值是一樣的。
下圖為測(cè)試用例2:
本例中樁函數(shù)luaH_next()的返回值設(shè)置為0,所以覆蓋的是代碼中判斷結(jié)果為假語句分支代碼。對(duì)于用例中的輸入形參,在執(zhí)行過程中影響了樁函數(shù)和執(zhí)行語句,間接影響本例中的判斷條件取值。
我們可以看到工具通過這兩條測(cè)試用例分別覆蓋了兩個(gè)判斷的分支,所以這段代碼的測(cè)試分支覆蓋率就是100%。
04
測(cè)試小結(jié)
在執(zhí)行分支覆蓋測(cè)試時(shí)我們有以下建議供大家參考。
1. 通常sil等級(jí)不同要求執(zhí)行的結(jié)構(gòu)覆蓋方法會(huì)不一樣,但是語句覆蓋通常會(huì)和分支覆蓋一起出現(xiàn)在低sil等級(jí)的測(cè)試要求中。
2. 語句覆蓋和分支覆蓋的覆蓋率統(tǒng)計(jì)維度是不一樣的,語句覆蓋是以代碼行數(shù)為分母,分支覆蓋是以代碼中邏輯判斷的分支總數(shù)為分母。
3. 在合并執(zhí)行語句覆蓋和分支覆蓋時(shí)測(cè)試用例是可以復(fù)用的,我們可以在語句覆蓋的基礎(chǔ)上疊加用例來完成未被測(cè)試的分支部分覆蓋。
審核編輯 黃宇
-
測(cè)試
+關(guān)注
關(guān)注
8文章
5303瀏覽量
126656 -
代碼
+關(guān)注
關(guān)注
30文章
4788瀏覽量
68616
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論