單元測試代碼覆蓋率淺談_第1頁
單元測試代碼覆蓋率淺談_第2頁
單元測試代碼覆蓋率淺談_第3頁
單元測試代碼覆蓋率淺談_第4頁
單元測試代碼覆蓋率淺談_第5頁
已閱讀5頁,還剩2頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、單元測試代碼覆蓋率淺談在做單元測試時(shí),代碼覆蓋率常常被拿來作為衡量測試好壞的指標(biāo),甚至,用代碼覆蓋率來考核測試任務(wù)完成情況,比如,代碼覆蓋率必須達(dá)到80或 90。于是乎,測試人員費(fèi)盡心思設(shè)計(jì)案例覆蓋代碼。用代碼覆蓋率來衡量,有利也有有弊。本文我們就代碼覆蓋率展開討論,也歡迎同學(xué)們踴躍評(píng)論。首先,讓我們先來了解一下所謂的“代碼覆蓋率”。我找來了所謂的定義:代碼覆蓋率 代碼的覆蓋程度,一種度量方式。上面簡短精悍的文字非常準(zhǔn)確的描述了代碼覆蓋率的含義。而代碼覆蓋程度的度量方式是有很多種的,這里介紹一下最常用的幾種:1. 語句覆蓋(StatementCoverage)又稱行覆蓋(LineCoverag

2、e),段覆蓋(SegmentCoverage),基本塊覆蓋(BasicBlockCoverage),這是最常用也是最常見的一種覆蓋方式,就是度量被測代碼中每個(gè)可執(zhí)行語句是否被執(zhí)行到了。這里說的是“可執(zhí)行語句”,因此就不會(huì)包括像C的頭文件聲明,代碼注釋,空行,等等。非常好理解,只統(tǒng)計(jì)能夠執(zhí)行的代碼被執(zhí)行了多少行。需要注意的是,單獨(dú)一行的花括號(hào) 也常常被統(tǒng)計(jì)進(jìn)去。語句覆蓋常常被人指責(zé)為“最弱的覆蓋”,它只管覆蓋代碼中的執(zhí)行語句,卻不考慮各種分支的組合等等。假如你的上司只要求你達(dá)到語句覆蓋,那么你可以省下很多功夫,但是,換來的確實(shí)測試效果的不明顯,很難更多地發(fā)現(xiàn)代碼中的問題。這里舉一個(gè)不能再簡單的例

3、子,我們看下面的被測試代碼:int foo(int a, int b)   return  a / b;假如我們的測試人員編寫如下測試案例:TeseCase: a = 10, b = 5 測試人員的測試結(jié)果會(huì)告訴你,他的代碼覆蓋率達(dá)到了100,并且所有測試案例都通過了。然而遺憾的是,我們的語句覆蓋率達(dá)到了所謂的100%,但是卻沒有發(fā)現(xiàn)最簡單的Bug,比如,當(dāng)我讓b=0時(shí),會(huì)拋出一個(gè)除零異常。正因如此,假如上面只要求測

4、試人員語句覆蓋率達(dá)到多少的話,測試人員只要鉆鉆空子,專門針對(duì)如何覆蓋代碼行編寫測試案例,就很容易達(dá)到主管的要求。當(dāng)然了,這同時(shí)說明了幾個(gè)問題:    1.主管只使用語句覆蓋率來考核測試人員本身就有問題。    2.測試人員的目的是為了測好代碼,鉆如此的空子是缺乏職業(yè)道德的。    3.是否應(yīng)該采用更好的考核方式來考核測試人員的工作?為了尋求更好的考核標(biāo)準(zhǔn),我們必須先了解完代碼覆蓋率到底還有哪些,如果你的主管只知道語句覆蓋,行覆蓋,那么你應(yīng)該主動(dòng)向他介紹還有更多的覆蓋方式。比如:2. 判定覆蓋(DecisionCoverage)又稱分支

5、覆蓋(BranchCoverage),所有邊界覆蓋(All-EdgesCoverage),基本路徑覆蓋(BasicPathCoverage),判定路徑覆蓋(Decision-Decision-Path)。它度量程序中每一個(gè)判定的分支是否都被測試到了。這句話是需要進(jìn)一步理解的,應(yīng)該非常容易和下面說到的條件覆蓋混淆。因此我們直接介紹第三種覆蓋方式,然后和判定覆蓋一起來對(duì)比,就明白兩者是怎么回事了。3. 條件覆蓋(ConditionCoverage)它度量判定中的每個(gè)子表達(dá)式結(jié)果true和false是否被測試到了。為了說明判定覆蓋和條件覆蓋的區(qū)別,我們來舉一個(gè)例子,假如我們的被測代碼如下:int&#

6、160;foo(int a, int b)    if (a < 10 | b < 10) / 判定            return 0; / 分支一        else     

7、       return 1; / 分支二    設(shè)計(jì)判定覆蓋案例時(shí),我們只需要考慮判定結(jié)果為true和false兩種情況,因此,我們?cè)O(shè)計(jì)如下的案例就能達(dá)到判定覆蓋率100:TestCaes1: a = 5, b  任意數(shù)字  覆蓋了分支一TestCaes2: a = 15, b = 15     

8、;     覆蓋了分支二 設(shè)計(jì)條件覆蓋案例時(shí),我們需要考慮判定中的每個(gè)條件表達(dá)式結(jié)果,為了覆蓋率達(dá)到100,我們?cè)O(shè)計(jì)了如下的案例:TestCase1: a = 5, b = 5       true,  trueTestCase4: a = 15, b = 15   false, false通過上面的例子,我們應(yīng)該很清楚了判定覆

9、蓋和條件覆蓋的區(qū)別。需要特別注意的是:條件覆蓋不是將判定中的每個(gè)條件表達(dá)式的結(jié)果進(jìn)行排列組合,而是只要每個(gè)條件表達(dá)式的結(jié)果true和false測試到了就OK了。因此,我們可以這樣推論:完全的條件覆蓋并不能保證完全的判定覆蓋。比如上面的例子,假如我設(shè)計(jì)的案例為:TestCase1: a = 5, b = 15  true,  false   分支一TestCase1: a = 15, b = 5 &

10、#160;false, true    分支一 我們看到,雖然我們完整的做到了條件覆蓋,但是我們卻沒有做到完整的判定覆蓋,我們只覆蓋了分支一。上面的例子也可以看出,這兩種覆蓋方式看起來似乎都不咋滴。我們接下來看看第四種覆蓋方式。4. 路徑覆蓋(PathCoverage)又稱斷言覆蓋(PredicateCoverage)。它度量了是否函數(shù)的每一個(gè)分支都被執(zhí)行了。 這句話也非常好理解,就是所有可能的分支都執(zhí)行一遍,有多個(gè)分支嵌套時(shí),需要對(duì)多個(gè)分支進(jìn)行排列組合,可想而知,測試路徑隨著分支的數(shù)量指數(shù)級(jí)別增加。比如下面的測試代碼中有兩個(gè)判定分支

11、:int foo(int a, int b)    int nReturn = 0;    if (a < 10)    / 分支一        nReturn += 1;        if 

12、;(b < 10)    / 分支二        nReturn += 10;        return nReturn;對(duì)上面的代碼,我們分別針對(duì)我們前三種覆蓋方式來設(shè)計(jì)測試案例:a. 語句覆蓋TestCase a = 5, b = 5   nReturn = 11&

13、#160;語句覆蓋率100 b. 判定覆蓋TestCase1 a = 5,   b = 5     nReturn = 11TestCase2 a = 15, b = 15   nReturn = 0判定覆蓋率100 c. 條件覆蓋TestCase1 a = 5,   b = 15   nReturn = 1TestCase2 a = 15,

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

15、160;   nReturn = 0TestCase2 a = 15,  b = 5     nReturn = 1TestCase3 a = 5,    b = 15   nReturn = 10 TestCase4 a = 15,  b = 15   nReturn = 11路徑覆蓋率100太棒了!路徑覆蓋將所有可能的返回值都測試到了。這也正是它被很多人認(rèn)為是“最強(qiáng)的覆蓋”的原因了。還有一些其他的覆蓋方式,如:循環(huán)覆蓋(LoopCoverage),它度量是否對(duì)循環(huán)體執(zhí)行了零次,一次和多余一次循環(huán)。剩下一

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論