亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

單元測試代碼覆蓋率解析

2020-01-26 13:26:45
字體:
來源:轉載
供稿:網友

前言

在做單元測試時,代碼覆蓋率常常被拿來作為衡量測試好壞的指標,甚至,用代碼覆蓋率來考核測試任務完成情況,比如,代碼覆蓋率必須達到80%或 90%。于是乎,測試人員費盡心思設計案例覆蓋代碼。用代碼覆蓋率來衡量,有利也有有弊。本文我們就代碼覆蓋率展開討論,也歡迎同學們踴躍評論。

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

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

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

1. 語句覆蓋(StatementCoverage)

又稱行覆蓋(LineCoverage),段覆蓋(SegmentCoverage),基本塊覆蓋(BasicBlockCoverage),這是最常用也是最常見的一種覆蓋方式,就是度量被測代碼中每個可執行語句是否被執行到了。這里說的是“可執行語句”,因此就不會包括像C++的頭文件聲明,代碼注釋,空行,等等。非常好理解,只統計能夠執行的代碼被執行了多少行。

需要注意的是,單獨一行的花括號{} 也常常被統計進去。語句覆蓋常常被人指責為“最弱的覆蓋”,它只管覆蓋代碼中的執行語句,卻不考慮各種分支的組合等等。

假如你的上司只要求你達到語句覆蓋,那么你可以省下很多功夫,但是,換來的確實測試效果的不明顯,很難更多地發現代碼中的問題。

這里舉一個不能再簡單的例子,我們看下面的被測試代碼:

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

假如我們的測試人員編寫如下測試案例:

TeseCase: a = 10, b = 5

測試人員的測試結果會告訴你,他的代碼覆蓋率達到了100%,并且所有測試案例都通過了。然而遺憾的是,我們的語句覆蓋率達到了所謂的100%,但是卻沒有發現最簡單的Bug,比如,當我讓b=0時,會拋出一個除零異常。

正因如此,假如上面只要求測試人員語句覆蓋率達到多少的話,測試人員只要鉆鉆空子,專門針對如何覆蓋代碼行編寫測試案例,就很容易達到主管的要求。當然了,這同時說明了幾個問題:

1.主管只使用語句覆蓋率來考核測試人員本身就有問題。

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

3.是否應該采用更好的考核方式來考核測試人員的工作? 

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

2. 判定覆蓋(DecisionCoverage)

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

3. 條件覆蓋(ConditionCoverage)

它度量判定中的每個子表達式結果true和false是否被測試到了。為了說明判定覆蓋和條件覆蓋的區別,我們來舉一個例子,假如我們的被測代碼如下:

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

設計判定覆蓋案例時,我們只需要考慮判定結果為true和false兩種情況,因此,我們設計如下的案例就能達到判定覆蓋率100%:

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

設計條件覆蓋案例時,我們需要考慮判定中的每個條件表達式結果,為了覆蓋率達到100%,我們設計了如下的案例:

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

通過上面的例子,我們應該很清楚了判定覆蓋和條件覆蓋的區別。需要特別注意的是:條件覆蓋不是將判定中的每個條件表達式的結果進行排列組合,而是只要每個條件表達式的結果true和false測試到了就OK了。因此,我們可以這樣推論:完全的條件覆蓋并不能保證完全的判定覆蓋。比如上面的例子,假如我設計的案例為:

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

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

4. 路徑覆蓋(PathCoverage)

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

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

對上面的代碼,我們分別針對我們前三種覆蓋方式來設計測試案例:

a. 語句覆蓋

TestCase a = 5, b = 5 nReturn = 11

 語句覆蓋率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, b = 5  nReturn = 10

條件覆蓋率100%  

我們看到,上面三種覆蓋率結果看起來都很酷!都達到了100%!主管可能會非常的開心,但是,讓我們再去仔細的看看,上面被測代碼中,nReturn的結果一共有四種可能的返回值:0,1,10,11,而我們上面的針對每種覆蓋率設計的測試案例只覆蓋了部分返回值,因此,可以說使用上面任一覆蓋方式,雖然覆蓋率達到了100%,但是并沒有測試完全。接下來我們來看看針對路徑覆蓋設計出來的測試案例:

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

路徑覆蓋率100% 

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

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

總結

通過上面的學習,我們再回頭想想,覆蓋率數據到底有多大意義。我總結了如下幾個觀點,歡迎大家討論:

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

b. 不要過于相信覆蓋率數據。

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

d. 路徑覆蓋率 > 判定覆蓋 > 語句覆蓋

e. 測試人員不能盲目追求代碼覆蓋率,而應該想辦法設計更多更好的案例,哪怕多設計出來的案例對覆蓋率一點影響也沒有。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品wwwwww| 色婷婷av一区二区三区在线观看| 亚洲第一视频网| 91亚洲午夜在线| 在线观看日韩欧美| 国产精品欧美日韩一区二区| 色狠狠av一区二区三区香蕉蜜桃| 国产aⅴ夜夜欢一区二区三区| 国产suv精品一区二区三区88区| 欧美午夜精品伦理| 亚洲大胆人体av| 日韩中文在线不卡| 在线观看日韩www视频免费| 欧美日韩一区二区在线| 欧美电影免费观看| 欧美激情成人在线视频| 久久九九精品99国产精品| 亚洲性视频网站| 91日韩在线视频| 国产精品入口免费视| 日韩中文有码在线视频| 国产精品手机播放| 国产精品久久久久久久久粉嫩av| 国产97在线视频| 亚洲国产毛片完整版| 深夜福利亚洲导航| 国产精品日日摸夜夜添夜夜av| 精品久久久免费| 久久91亚洲精品中文字幕| 51精品国产黑色丝袜高跟鞋| 国产丝袜一区视频在线观看| www日韩中文字幕在线看| 欧美在线性视频| 97色在线播放视频| 国产精品欧美一区二区| 日本久久亚洲电影| 久久综合电影一区| 亚洲第五色综合网| 国产综合久久久久久| 亚洲精品小视频| 欧美日韩亚洲成人| 欧美国产亚洲精品久久久8v| 久久久久久香蕉网| 亚洲成人久久网| 成人午夜在线影院| 亚洲福利在线播放| 国产一区二区三区日韩欧美| 欧美电影在线播放| 亚洲精品美女在线| 久久久久日韩精品久久久男男| 日韩视频在线观看免费| 亚洲精品一区二区网址| 国产精品第10页| 日韩亚洲欧美中文在线| 亚洲成年网站在线观看| 欧美wwwxxxx| 国产精品自产拍高潮在线观看| 欧美重口另类videos人妖| 精品在线小视频| 亚洲国产成人精品电影| 欧美电影免费观看高清完整| 国产精品视频男人的天堂| 久久久免费av| 国产精品视频自拍| 久久精视频免费在线久久完整在线看| 日韩av一区在线| 欧美第一页在线| www.精品av.com| 欧美高跟鞋交xxxxxhd| 欧美在线视频导航| 欧美日韩国产成人在线| 国产成人久久久精品一区| 国产精品大陆在线观看| 亚洲日本aⅴ片在线观看香蕉| 在线看福利67194| 亚洲美女av在线| 国产成人拍精品视频午夜网站| 国产精品pans私拍| 国产精品久久久久免费a∨大胸| 亚洲欧洲在线播放| 色偷偷偷综合中文字幕;dd| 91免费在线视频网站| 亚洲日本aⅴ片在线观看香蕉| 美乳少妇欧美精品| 亚洲春色另类小说| 亚洲a成v人在线观看| 久久99青青精品免费观看| 97碰在线观看| 美日韩精品免费视频| 成人国产精品一区| 亚洲欧美国产一本综合首页| 亚洲黄色免费三级| 激情成人中文字幕| 国产精品久久久久久久app| 国产亚洲激情视频在线| 亚洲精品乱码久久久久久按摩观| 欧美一级淫片播放口| 97免费在线视频| 日韩福利伦理影院免费| 亚洲精品福利免费在线观看| 久久精品国产综合| 亚洲国产精品网站| 亚洲精品国产suv| 欧美视频一区二区三区…| 国产欧美精品在线播放| 午夜美女久久久久爽久久| 亚洲精品福利在线观看| 国产亚洲视频在线观看| 亚洲精品永久免费| 久久精品福利视频| 国产日韩欧美91| 26uuu国产精品视频| 日本中文字幕成人| www国产精品视频| 中文字幕久久亚洲| 日韩有码在线观看| 亚洲男人天堂2019| 国产欧美日韩专区发布| 日韩一区二区精品视频| 亚洲免费电影在线观看| 亚洲图片在线综合| 国产69精品久久久| 亚洲成人网av| 一本一道久久a久久精品逆3p| 日韩欧美在线第一页| 国产精品久久久精品| 欧美乱妇高清无乱码| 色综合视频网站| 国产亚洲一区精品| 中文字幕精品视频| 亚洲一区二区福利| 国产欧美精品一区二区| 亚洲3p在线观看| 欧美激情亚洲一区| 在线日韩精品视频| 久久国产精品影视| 国产精品久久久久不卡| 国产一区av在线| 日韩中文字幕网| 一区二区三区在线播放欧美| 欧美在线精品免播放器视频| 欧美黄色免费网站| 国模视频一区二区| 精品小视频在线| 国产精自产拍久久久久久蜜| 亚洲精品视频免费| 中文字幕亚洲综合久久筱田步美| 在线丨暗呦小u女国产精品| 性欧美亚洲xxxx乳在线观看| 亚洲无av在线中文字幕| 日韩久久精品成人| 中文字幕在线日韩| 欧美日韩亚洲高清| 精品久久久免费| 久久精品国产久精国产一老狼| 国产亚洲欧美日韩一区二区| 亚洲成人网av| 成人午夜一级二级三级| 国产精品久久久久久久av电影| 久久精品国产久精国产思思| 久久久久久久色| 国产精品福利在线观看| 成人黄色网免费| 国产精品久久久久久久美男|