最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

單元測(cè)試代碼覆蓋率解析

 更新時(shí)間:2019年06月11日 09:05:23   作者:冰糖葫蘆三劍客  
單元測(cè)試(unit testing),是指對(duì)軟件中的最小可測(cè)試單元進(jìn)行檢查和驗(yàn)證。動(dòng)態(tài)分析就是通過(guò)觀察軟件運(yùn)行時(shí)的動(dòng)作,來(lái)提供執(zhí)行跟蹤,時(shí)間分析,以及測(cè)試覆蓋度方面的信息。下面我們來(lái)詳細(xì)了解下吧

前言

在做單元測(cè)試時(shí),代碼覆蓋率常常被拿來(lái)作為衡量測(cè)試好壞的指標(biāo),甚至,用代碼覆蓋率來(lái)考核測(cè)試任務(wù)完成情況,比如,代碼覆蓋率必須達(dá)到80%或 90%。于是乎,測(cè)試人員費(fèi)盡心思設(shè)計(jì)案例覆蓋代碼。用代碼覆蓋率來(lái)衡量,有利也有有弊。本文我們就代碼覆蓋率展開(kāi)討論,也歡迎同學(xué)們踴躍評(píng)論。

首先,讓我們先來(lái)了解一下所謂的“代碼覆蓋率”。我找來(lái)了所謂的定義:

代碼覆蓋率 = 代碼的覆蓋程度,一種度量方式。

上面簡(jiǎn)短精悍的文字非常準(zhǔn)確的描述了代碼覆蓋率的含義。而代碼覆蓋程度的度量方式是有很多種的,這里介紹一下最常用的幾種:

1. 語(yǔ)句覆蓋(StatementCoverage)

又稱(chēng)行覆蓋(LineCoverage),段覆蓋(SegmentCoverage),基本塊覆蓋(BasicBlockCoverage),這是最常用也是最常見(jiàn)的一種覆蓋方式,就是度量被測(cè)代碼中每個(gè)可執(zhí)行語(yǔ)句是否被執(zhí)行到了。這里說(shuō)的是“可執(zhí)行語(yǔ)句”,因此就不會(huì)包括像C++的頭文件聲明,代碼注釋?zhuān)招?,等等。非常好理解,只統(tǒng)計(jì)能夠執(zhí)行的代碼被執(zhí)行了多少行。

需要注意的是,單獨(dú)一行的花括號(hào){} 也常常被統(tǒng)計(jì)進(jìn)去。語(yǔ)句覆蓋常常被人指責(zé)為“最弱的覆蓋”,它只管覆蓋代碼中的執(zhí)行語(yǔ)句,卻不考慮各種分支的組合等等。

假如你的上司只要求你達(dá)到語(yǔ)句覆蓋,那么你可以省下很多功夫,但是,換來(lái)的確實(shí)測(cè)試效果的不明顯,很難更多地發(fā)現(xiàn)代碼中的問(wèn)題。

這里舉一個(gè)不能再簡(jiǎn)單的例子,我們看下面的被測(cè)試代碼:

int foo(int a, int b)
{
 return a / b;
}

假如我們的測(cè)試人員編寫(xiě)如下測(cè)試案例:

TeseCase: a = 10, b = 5

測(cè)試人員的測(cè)試結(jié)果會(huì)告訴你,他的代碼覆蓋率達(dá)到了100%,并且所有測(cè)試案例都通過(guò)了。然而遺憾的是,我們的語(yǔ)句覆蓋率達(dá)到了所謂的100%,但是卻沒(méi)有發(fā)現(xiàn)最簡(jiǎn)單的Bug,比如,當(dāng)我讓b=0時(shí),會(huì)拋出一個(gè)除零異常。

正因如此,假如上面只要求測(cè)試人員語(yǔ)句覆蓋率達(dá)到多少的話,測(cè)試人員只要鉆鉆空子,專(zhuān)門(mén)針對(duì)如何覆蓋代碼行編寫(xiě)測(cè)試案例,就很容易達(dá)到主管的要求。當(dāng)然了,這同時(shí)說(shuō)明了幾個(gè)問(wèn)題:

1.主管只使用語(yǔ)句覆蓋率來(lái)考核測(cè)試人員本身就有問(wèn)題。

2.測(cè)試人員的目的是為了測(cè)好代碼,鉆如此的空子是缺乏職業(yè)道德的。 

3.是否應(yīng)該采用更好的考核方式來(lái)考核測(cè)試人員的工作? 

為了尋求更好的考核標(biāo)準(zhǔn),我們必須先了解完代碼覆蓋率到底還有哪些,如果你的主管只知道語(yǔ)句覆蓋,行覆蓋,那么你應(yīng)該主動(dòng)向他介紹還有更多的覆蓋方式。比如:

2. 判定覆蓋(DecisionCoverage)

又稱(chēng)分支覆蓋(BranchCoverage),所有邊界覆蓋(All-EdgesCoverage),基本路徑覆蓋(BasicPathCoverage),判定路徑覆蓋(Decision-Decision-Path)。它度量程序中每一個(gè)判定的分支是否都被測(cè)試到了。這句話是需要進(jìn)一步理解的,應(yīng)該非常容易和下面說(shuō)到的條件覆蓋混淆。因此我們直接介紹第三種覆蓋方式,然后和判定覆蓋一起來(lái)對(duì)比,就明白兩者是怎么回事了。

3. 條件覆蓋(ConditionCoverage)

它度量判定中的每個(gè)子表達(dá)式結(jié)果true和false是否被測(cè)試到了。為了說(shuō)明判定覆蓋和條件覆蓋的區(qū)別,我們來(lái)舉一個(gè)例子,假如我們的被測(cè)代碼如下:

int foo(int a, int b)
{
 if (a < 10 || b < 10) // 判定
 {
 return 0; // 分支一
 }
 else
 {
 return 1; // 分支二
 }
}

設(shè)計(jì)判定覆蓋案例時(shí),我們只需要考慮判定結(jié)果為true和false兩種情況,因此,我們?cè)O(shè)計(jì)如下的案例就能達(dá)到判定覆蓋率100%:

TestCaes1: a = 5, b = 任意數(shù)字 覆蓋了分支一
TestCaes2: a = 15, b = 15 覆蓋了分支二

設(shè)計(jì)條件覆蓋案例時(shí),我們需要考慮判定中的每個(gè)條件表達(dá)式結(jié)果,為了覆蓋率達(dá)到100%,我們?cè)O(shè)計(jì)了如下的案例:

TestCase1: a = 5, b = 5 true, true
TestCase4: a = 15, b = 15 false, false

通過(guò)上面的例子,我們應(yīng)該很清楚了判定覆蓋和條件覆蓋的區(qū)別。需要特別注意的是:條件覆蓋不是將判定中的每個(gè)條件表達(dá)式的結(jié)果進(jìn)行排列組合,而是只要每個(gè)條件表達(dá)式的結(jié)果true和false測(cè)試到了就OK了。因此,我們可以這樣推論:完全的條件覆蓋并不能保證完全的判定覆蓋。比如上面的例子,假如我設(shè)計(jì)的案例為:

TestCase1: a = 5, b = 15 true, false 分支一
TestCase1: a = 15, b = 5 false, true 分支一

我們看到,雖然我們完整的做到了條件覆蓋,但是我們卻沒(méi)有做到完整的判定覆蓋,我們只覆蓋了分支一。上面的例子也可以看出,這兩種覆蓋方式看起來(lái)似乎都不咋滴。我們接下來(lái)看看第四種覆蓋方式。

4. 路徑覆蓋(PathCoverage)

又稱(chēng)斷言覆蓋(PredicateCoverage)。它度量了是否函數(shù)的每一個(gè)分支都被執(zhí)行了。 這句話也非常好理解,就是所有可能的分支都執(zhí)行一遍,有多個(gè)分支嵌套時(shí),需要對(duì)多個(gè)分支進(jìn)行排列組合,可想而知,測(cè)試路徑隨著分支的數(shù)量指數(shù)級(jí)別增加。比如下面的測(cè)試代碼中有兩個(gè)判定分支:

int foo(int a, int b)
{
 int nReturn = 0;
 if (a < 10)
 {// 分支一
 nReturn += 1;
 }
 if (b < 10)
 {// 分支二
 nReturn += 10;
 }
 return nReturn;
}

對(duì)上面的代碼,我們分別針對(duì)我們前三種覆蓋方式來(lái)設(shè)計(jì)測(cè)試案例:

a. 語(yǔ)句覆蓋

TestCase a = 5, b = 5 nReturn = 11

 語(yǔ)句覆蓋率100%

b. 判定覆蓋

TestCase1 a = 5, b = 5  nReturn = 11
TestCase2 a = 15, b = 15 nReturn = 0

判定覆蓋率100% 

c. 條件覆蓋

TestCase1 a = 5, b = 15 nReturn = 1
TestCase2 a = 15, b = 5  nReturn = 10

條件覆蓋率100%  

我們看到,上面三種覆蓋率結(jié)果看起來(lái)都很酷!都達(dá)到了100%!主管可能會(huì)非常的開(kāi)心,但是,讓我們?cè)偃プ屑?xì)的看看,上面被測(cè)代碼中,nReturn的結(jié)果一共有四種可能的返回值:0,1,10,11,而我們上面的針對(duì)每種覆蓋率設(shè)計(jì)的測(cè)試案例只覆蓋了部分返回值,因此,可以說(shuō)使用上面任一覆蓋方式,雖然覆蓋率達(dá)到了100%,但是并沒(méi)有測(cè)試完全。接下來(lái)我們來(lái)看看針對(duì)路徑覆蓋設(shè)計(jì)出來(lái)的測(cè)試案例:

TestCase1 a = 5,  b = 5   nReturn = 0
TestCase2 a = 15, b = 5   nReturn = 1
TestCase3 a = 5,  b = 15  nReturn = 10
TestCase4 a = 15, b = 15  nReturn = 11

路徑覆蓋率100% 

太棒了!路徑覆蓋將所有可能的返回值都測(cè)試到了。這也正是它被很多人認(rèn)為是“最強(qiáng)的覆蓋”的原因了。

還有一些其他的覆蓋方式,如:循環(huán)覆蓋(LoopCoverage),它度量是否對(duì)循環(huán)體執(zhí)行了零次,一次和多余一次循環(huán)。剩下一些其他覆蓋方式就不介紹了。

總結(jié)

通過(guò)上面的學(xué)習(xí),我們?cè)倩仡^想想,覆蓋率數(shù)據(jù)到底有多大意義。我總結(jié)了如下幾個(gè)觀點(diǎn),歡迎大家討論:

a. 覆蓋率數(shù)據(jù)只能代表你測(cè)試過(guò)哪些代碼,不能代表你是否測(cè)試好這些代碼。(比如上面第一個(gè)除零Bug)

b. 不要過(guò)于相信覆蓋率數(shù)據(jù)。

c. 不要只拿語(yǔ)句覆蓋率(行覆蓋率)來(lái)考核你的測(cè)試人員。

d. 路徑覆蓋率 > 判定覆蓋 > 語(yǔ)句覆蓋

e. 測(cè)試人員不能盲目追求代碼覆蓋率,而應(yīng)該想辦法設(shè)計(jì)更多更好的案例,哪怕多設(shè)計(jì)出來(lái)的案例對(duì)覆蓋率一點(diǎn)影響也沒(méi)有。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C++基于easyx實(shí)現(xiàn)迷宮游戲

    C++基于easyx實(shí)現(xiàn)迷宮游戲

    這篇文章主要為大家詳細(xì)介紹了C++基于easyx實(shí)現(xiàn)迷宮游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • 詳解C++ 創(chuàng)建文件夾的四種方式

    詳解C++ 創(chuàng)建文件夾的四種方式

    這篇文章主要介紹了C++ 創(chuàng)建文件夾的四種方式,本文示例都是在 E:\database 路徑下創(chuàng)建一個(gè)叫做 testFolder 的文件夾,文章通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2021-11-11
  • opencv幀差法找出相差大的圖像

    opencv幀差法找出相差大的圖像

    這篇文章主要為大家詳細(xì)介紹了opencv幀差法找出相差大的圖像,包含訪問(wèn)mat的像素值,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • C++類(lèi)和對(duì)象之封裝詳解

    C++類(lèi)和對(duì)象之封裝詳解

    大家好,本篇文章主要講的是C++類(lèi)和對(duì)象之封裝詳解,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • C++操作.json文件的超詳細(xì)新手教程

    C++操作.json文件的超詳細(xì)新手教程

    最近因?yàn)轫?xiàng)目原因需要解析JSON格式數(shù)據(jù),所以這篇文章主要給大家介紹了關(guān)于C++操作.json文件的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • 基于VS+Opencv2.4.10微信跳一跳輔助工具

    基于VS+Opencv2.4.10微信跳一跳輔助工具

    這篇文章主要為大家詳細(xì)介紹了基于VS+Opencv2.4.10微信跳一跳輔助工具,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • C++浮點(diǎn)數(shù)類(lèi)型詳情

    C++浮點(diǎn)數(shù)類(lèi)型詳情

    這篇文章主要介紹了C++浮點(diǎn)數(shù)類(lèi)型,浮點(diǎn)數(shù)是C++的第二組基本類(lèi)型,它能夠表示帶小數(shù)部分的數(shù)字。不僅如此,浮點(diǎn)數(shù)的范圍也比int更大,可以表示更大范圍的數(shù)字。下面來(lái)我們大家一起來(lái)學(xué)習(xí)學(xué)習(xí)內(nèi)容
    2021-11-11
  • C++14 新特性之函數(shù)返回值類(lèi)型推導(dǎo)

    C++14 新特性之函數(shù)返回值類(lèi)型推導(dǎo)

    本文主要介紹了C++14 新特性之函數(shù)返回值類(lèi)型推導(dǎo),在模板編程和一些返回類(lèi)型復(fù)雜或不易直接指明的情況下非常有用,下面就來(lái)具體介紹一下,感興趣的可以了解一下
    2024-05-05
  • C語(yǔ)言熱門(mén)考點(diǎn)結(jié)構(gòu)體與內(nèi)存對(duì)齊詳解

    C語(yǔ)言熱門(mén)考點(diǎn)結(jié)構(gòu)體與內(nèi)存對(duì)齊詳解

    在掌握基本的結(jié)構(gòu)體使用后,我們?cè)诿嬖嚭痛笮捅荣愔谐3?huì)遇到一個(gè)熱門(mén)考點(diǎn):結(jié)構(gòu)體內(nèi)存對(duì)齊,也就是計(jì)算結(jié)構(gòu)體大小。接下來(lái)請(qǐng)跟著筆者一起來(lái)學(xué)習(xí)這塊知識(shí)點(diǎn)吧
    2021-10-10
  • VC++中HTControl控制類(lèi)使用之CHTDlgBase對(duì)話框基類(lèi)實(shí)例

    VC++中HTControl控制類(lèi)使用之CHTDlgBase對(duì)話框基類(lèi)實(shí)例

    這篇文章主要介紹了VC++中HTControl控制類(lèi)使用之CHTDlgBase對(duì)話框基類(lèi),是比較豐富而實(shí)用的功能,需要的朋友可以參考下
    2014-08-08

最新評(píng)論

石河子市| 铁力市| 西贡区| 博爱县| 临高县| 玉溪市| 长寿区| 永寿县| 治多县| 永和县| 图片| 商南县| 内丘县| 海淀区| 视频| 乐山市| 会理县| 平邑县| 宁波市| 庄浪县| 中江县| 清丰县| 花莲市| 巴南区| 枞阳县| 阿克陶县| 遂川县| 香河县| 马尔康县| 汤原县| 广汉市| 深州市| 连江县| 商南县| 房产| 集安市| 清丰县| 湛江市| 武山县| 通许县| 宁乡县|