0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

軟件代碼結(jié)構(gòu)化覆蓋測(cè)試-分支覆蓋

上??匕?/a> ? 來(lái)源:上海控安 ? 作者:上??匕?/span> ? 2023-09-01 11:34 ? 次閱讀

作者 |李偉 上海控安安全測(cè)評(píng)部總監(jiān)

來(lái)源 |鑒源實(shí)驗(yàn)室

社群 |添加微信號(hào)TICPShanghai”加入“上??匕?1fusa安全社區(qū)”

引言:上一篇開(kāi)始我們介紹白盒的代碼結(jié)構(gòu)覆蓋率測(cè)試,已經(jīng)完成了語(yǔ)句覆蓋測(cè)試的講解,本篇我們介紹分支覆蓋。

01

關(guān)于定義

從測(cè)試技術(shù)對(duì)代碼的測(cè)試程度上來(lái)說(shuō),在復(fù)雜代碼中,分支覆蓋比語(yǔ)句覆蓋效果要好。很多時(shí)候分支覆蓋也被叫做判定覆蓋。語(yǔ)句覆蓋是要求設(shè)計(jì)的測(cè)試用例可以讓所有的語(yǔ)句都能夠被執(zhí)行測(cè)試。分支覆蓋是要求設(shè)計(jì)用例對(duì)代碼中所有的邏輯判定分支都被執(zhí)行測(cè)試,也就是每次判定邏輯上真假兩種的分支執(zhí)行情況都覆蓋。從定義上我們就可以看出兩種方法的測(cè)試度量角度是不一樣的。計(jì)算方法上,語(yǔ)句覆蓋的分母是代碼總行數(shù),分支覆蓋的分母是代碼中所有判斷的分支總數(shù)。

02

分支覆蓋測(cè)試的舉例

我們使用下面一段簡(jiǎn)單代碼來(lái)舉例說(shuō)明:

wKgaomTxW8uAIw73AABErXYC5tE096.jpg

這段代碼總共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ì),語(yǔ)句覆蓋率一樣達(dá)到了100%,那語(yǔ)句覆蓋跟分支覆蓋的區(qū)別如何體現(xiàn)呢,同樣是這段代碼我們實(shí)際中很多時(shí)候是用下面的習(xí)慣編寫(xiě),如:

wKgZomTxW8uAbVhoAAAdr5PILNY156.jpg

這段代碼的效果跟前面舉例中代碼的效果是一樣的,對(duì)于分支覆蓋設(shè)計(jì)也是一樣,因?yàn)橥瑯又挥幸粋€(gè)判定條件,需要分別測(cè)試x<10為真或假的兩種分支情況,但是語(yǔ)句覆蓋設(shè)計(jì)就不一樣了,語(yǔ)句覆蓋設(shè)計(jì)只需要設(shè)計(jì)一條用例,令a=5即可以覆蓋所有的代碼語(yǔ)句。這里我們就可以看出分支覆蓋的結(jié)構(gòu)化程度高于語(yǔ)句覆蓋。

上面的例子相對(duì)簡(jiǎn)單,我們把這段代碼稍微變動(dòng),來(lái)深入探討一下分支覆蓋。示例代碼如下:

wKgaomTxW8uAcHACAAASnIQxQ1E489.png

我們可以看到這段代碼的邏輯判斷了一次,代碼同樣有兩個(gè)分支,針對(duì)分支覆蓋測(cè)試我們只需要針對(duì)x < 10 && y > 10 == 0 為真或假兩種情況,即我們可以令a=15或b=5時(shí)代碼判斷進(jìn)入條件真的分支,令a=5且b=15代碼判斷進(jìn)入條件假的分支。

上面的例子我們也可以看出,分支覆蓋測(cè)試我們僅在if后面的整體判定語(yǔ)句上取了真和假兩種情況,并未深入到該行代碼語(yǔ)句中每個(gè)判定條件來(lái)取真假。

03

使用工具來(lái)進(jìn)行分支覆蓋測(cè)試

本章節(jié)我們繼續(xù)使用SmartRocket TestGrid這款工具進(jìn)行代碼的分支覆蓋測(cè)試分析,給大家介紹工具是如何生成測(cè)試用例完成測(cè)試任務(wù)的。

3.1工具測(cè)試舉例

針對(duì)如下代碼:

wKgZomTxW8yAbsDOAAA_7UbaBkI087.png

這段代碼我們可以看到函數(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)控制流圖如下:

wKgaomTxW8yAS4x8AAAi4Zjw-Fw702.png

控制流圖可以直觀地看到在本例中兩條分支情況,我們可以設(shè)計(jì)測(cè)試用例令more分別為真和假,分別覆蓋兩條分支,這樣就可以完成分支100%覆蓋。

我們通過(guò)查看項(xiàng)目頭文件可以得到函數(shù)luaH_next()的形參hvalue(t)已有定義,通過(guò)宏替換變?yōu)閘uaH_next (L, ((&((((union GCUnion *)((((t)->value_).gc))))->h))), L->top - 1),可以通過(guò)工具來(lái)生成用例中的樁函數(shù),下圖為工具自動(dòng)生成的測(cè)試用例1:

wKgZomTxW82AF5wPAADwTUvg-jg608.png

本條用例中樁函數(shù)的返回值控制了判斷條件的真或假,本條測(cè)試用例覆蓋的是代碼中為真的分支語(yǔ)句。代碼中函數(shù)的最終返回值也是由more變量決定,我們?cè)谟美妮敵鲆部梢钥吹綄?shí)際返回值跟樁函數(shù)的返回值是一樣的。

下圖為測(cè)試用例2:

wKgaomTxW82AOJaXAADw5LZvUO4972.png

本例中樁函數(shù)luaH_next()的返回值設(shè)置為0,所以覆蓋的是代碼中判斷結(jié)果為假語(yǔ)句分支代碼。對(duì)于用例中的輸入形參,在執(zhí)行過(guò)程中影響了樁函數(shù)和執(zhí)行語(yǔ)句,間接影響本例中的判斷條件取值。

我們可以看到工具通過(guò)這兩條測(cè)試用例分別覆蓋了兩個(gè)判斷的分支,所以這段代碼的測(cè)試分支覆蓋率就是100%。

04

測(cè)試小結(jié)

在執(zhí)行分支覆蓋測(cè)試時(shí)我們有以下建議供大家參考。

1. 通常sil等級(jí)不同要求執(zhí)行的結(jié)構(gòu)覆蓋方法會(huì)不一樣,但是語(yǔ)句覆蓋通常會(huì)和分支覆蓋一起出現(xiàn)在低sil等級(jí)的測(cè)試要求中。

2. 語(yǔ)句覆蓋和分支覆蓋的覆蓋率統(tǒng)計(jì)維度是不一樣的,語(yǔ)句覆蓋是以代碼行數(shù)為分母,分支覆蓋是以代碼中邏輯判斷的分支總數(shù)為分母。

3. 在合并執(zhí)行語(yǔ)句覆蓋和分支覆蓋時(shí)測(cè)試用例是可以復(fù)用的,我們可以在語(yǔ)句覆蓋的基礎(chǔ)上疊加用例來(lái)完成未被測(cè)試的分支部分覆蓋。

審核編輯 黃宇


聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 測(cè)試
    +關(guān)注

    關(guān)注

    8

    文章

    5043

    瀏覽量

    126231
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4698

    瀏覽量

    68100
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    代碼覆蓋測(cè)試工具BullseyeCoverage在嵌入式軟件系統(tǒng)中的應(yīng)用研究

    代碼覆蓋分析是一種白盒測(cè)試方法,因?yàn)?b class='flag-5'>覆蓋分析需要訪問(wèn)測(cè)試代碼本身,且經(jīng)常需要重新編譯程序,以程序
    的頭像 發(fā)表于 09-21 17:36 ?3616次閱讀
    <b class='flag-5'>代碼</b><b class='flag-5'>覆蓋</b>率<b class='flag-5'>測(cè)試</b>工具BullseyeCoverage在嵌入式<b class='flag-5'>軟件</b>系統(tǒng)中的應(yīng)用研究

    軟件代碼結(jié)構(gòu)化覆蓋測(cè)試-MC/DC覆蓋

    MC/DC的全稱(chēng)是Modified Condition/Decision Coverage,修正條件判定覆蓋率。很多文章對(duì)于定義的解釋都比較專(zhuān)業(yè),通常也會(huì)讓人感覺(jué)理解困難,本文我們用通俗易懂的說(shuō)明給大家做介紹。
    的頭像 發(fā)表于 12-15 15:22 ?2866次閱讀
    <b class='flag-5'>軟件</b><b class='flag-5'>代碼</b><b class='flag-5'>結(jié)構(gòu)化</b><b class='flag-5'>覆蓋</b><b class='flag-5'>測(cè)試</b>-MC/DC<b class='flag-5'>覆蓋</b>

    如何對(duì)嵌入式軟件進(jìn)行覆蓋測(cè)試

    嵌入式軟件覆蓋測(cè)試原理是什么?嵌入式實(shí)時(shí)操作系統(tǒng)的覆蓋測(cè)試工具是什么?Logiscope在嵌入式操作系統(tǒng)DeltaCORE
    發(fā)表于 05-13 07:30

    嵌入式仿真平臺(tái)SkyEye的覆蓋率分析相關(guān)資料下載

    隨著嵌入式系統(tǒng)也越來(lái)越復(fù)雜,功能迭代越來(lái)越多,代碼中就可能就會(huì)存在部分無(wú)用代碼,或者在執(zhí)行過(guò)程中無(wú)法測(cè)試覆蓋分支,這可能就會(huì)給
    發(fā)表于 12-17 07:27

    匯編程序覆蓋測(cè)試分支路徑數(shù)的計(jì)算

    說(shuō)明了覆蓋測(cè)試軟件測(cè)試中的重要方法,是軟件動(dòng)態(tài)測(cè)試的基本手段。并提出通過(guò)基本塊存儲(chǔ)矩陣和鄰接表
    發(fā)表于 04-26 18:30 ?13次下載

    結(jié)構(gòu)化P2P覆蓋網(wǎng)絡(luò)通信協(xié)議研究

    針對(duì)各種基于流言機(jī)制的通信協(xié)議在構(gòu)造非結(jié)構(gòu)化P2P覆蓋網(wǎng)絡(luò)中,其適用范圍缺乏廣泛的實(shí)證問(wèn)題,提出了一個(gè)通用的協(xié)議框架--基于流言機(jī)制的節(jié)點(diǎn)采樣服務(wù),以執(zhí)行高效和可靠的節(jié)
    發(fā)表于 03-22 00:36 ?26次下載

    基于分支覆蓋的回歸測(cè)試路徑選擇

    測(cè)試數(shù)據(jù)。從而降低了回歸測(cè)試的效率.研究了回歸測(cè)試分支覆蓋問(wèn)題,通過(guò)利用已有測(cè)試數(shù)據(jù)的路徑
    發(fā)表于 01-15 11:08 ?0次下載

    嵌入式代碼覆蓋率統(tǒng)計(jì)方法和經(jīng)驗(yàn)

    代碼覆蓋率是衡量軟件測(cè)試完成情況的指標(biāo),通常基于測(cè)試過(guò)程中已檢查的程序源代碼比例計(jì)算得出。
    的頭像 發(fā)表于 01-06 15:06 ?3076次閱讀
    嵌入式<b class='flag-5'>代碼</b><b class='flag-5'>覆蓋</b>率統(tǒng)計(jì)方法和經(jīng)驗(yàn)

    統(tǒng)計(jì)嵌入式代碼覆蓋率的方法和經(jīng)驗(yàn)

    代碼覆蓋率是衡量軟件測(cè)試完成情況的指標(biāo),通?;?b class='flag-5'>測(cè)試過(guò)程中已檢查的程序源代碼比例計(jì)算得出。
    的頭像 發(fā)表于 03-29 11:58 ?1870次閱讀
    統(tǒng)計(jì)嵌入式<b class='flag-5'>代碼</b><b class='flag-5'>覆蓋</b>率的方法和經(jīng)驗(yàn)

    代碼覆蓋工具的重要性

      它支持語(yǔ)句覆蓋、分支覆蓋和圈復(fù)雜度。它提供了分別選擇低、中、高和完整級(jí)別的代碼覆蓋率的規(guī)定。它非常易于使用和快速,也可用于開(kāi)源和商業(yè)許可
    的頭像 發(fā)表于 06-30 10:36 ?840次閱讀
    <b class='flag-5'>代碼</b><b class='flag-5'>覆蓋</b>工具的重要性

    選擇代碼覆蓋工具的 10 個(gè)標(biāo)準(zhǔn)

    為了開(kāi)發(fā)安全可靠的軟件,測(cè)試是質(zhì)量保證不可或缺的一部分。如果沒(méi)有充分的記錄測(cè)試,就不可能確定軟件是否安全且功能是否正確。在這種情況下,代碼
    的頭像 發(fā)表于 07-20 18:06 ?1282次閱讀
    選擇<b class='flag-5'>代碼</b><b class='flag-5'>覆蓋</b>工具的 10 個(gè)標(biāo)準(zhǔn)

    代碼覆蓋率工具的重要性

    測(cè)試覆蓋率是軟件質(zhì)量的重要指標(biāo),也是軟件維護(hù)的重要組成部分。它通過(guò)提供不同承保項(xiàng)目的數(shù)據(jù)來(lái)幫助評(píng)估測(cè)試的有效性。這種洞察力允許通過(guò)為未經(jīng)
    的頭像 發(fā)表于 12-08 15:13 ?1390次閱讀
    <b class='flag-5'>代碼</b><b class='flag-5'>覆蓋</b>率工具的重要性

    代碼覆蓋檢測(cè)

    1 代碼覆蓋率概述 覆蓋率(code coverage rate)是反映測(cè)試用例對(duì)被測(cè)軟件覆蓋
    的頭像 發(fā)表于 05-12 22:26 ?2860次閱讀
    <b class='flag-5'>代碼</b><b class='flag-5'>覆蓋</b>檢測(cè)

    軟件代碼結(jié)構(gòu)化覆蓋測(cè)試-語(yǔ)句覆蓋

    本篇將深入到代碼層面,講解單元測(cè)試中的一項(xiàng)重要工作-軟件代碼測(cè)試
    的頭像 發(fā)表于 08-25 11:50 ?592次閱讀
    <b class='flag-5'>軟件</b><b class='flag-5'>代碼</b><b class='flag-5'>結(jié)構(gòu)化</b><b class='flag-5'>覆蓋</b><b class='flag-5'>測(cè)試</b>-語(yǔ)句<b class='flag-5'>覆蓋</b>

    代碼覆蓋率記錄

    為確保具體的產(chǎn)品(例如,醫(yī)療或航空電子市場(chǎng))質(zhì)量合格, 通常需要提供語(yǔ)句覆蓋與判定覆蓋認(rèn)證證明。對(duì)于各種嵌 入式系統(tǒng),規(guī)范要求高度優(yōu)化的代碼需要實(shí)時(shí)測(cè)試。禁止
    發(fā)表于 11-03 11:02 ?0次下載
    <b class='flag-5'>代碼</b><b class='flag-5'>覆蓋</b>率記錄