欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

單元測試代碼覆蓋率解析

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

前言

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

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

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

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

1. 語句覆蓋(StatementCoverage)

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

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

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

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

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

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

TeseCase: a = 10, b = 5

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

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

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

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

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

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

2. 判定覆蓋(DecisionCoverage)

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

3. 條件覆蓋(ConditionCoverage)

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

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

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

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

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

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

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

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

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

4. 路徑覆蓋(PathCoverage)

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

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

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

a. 語句覆蓋

TestCase a = 5, b = 5 nReturn = 11

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

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% 

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

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

總結(jié)

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

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

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

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

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

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

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

相關(guān)文章

  • 美化你的代碼 vb(VBS)代碼格式化的實現(xiàn)代碼

    美化你的代碼 vb(VBS)代碼格式化的實現(xiàn)代碼

    雖然VB.NET出現(xiàn)很久了,但還有好多人仍然在使用VB6。我在實現(xiàn)一些小功能的時候也喜歡用VB6,畢竟誰都不想每天的美好心情被VS那烏龜般的啟動速度影響
    2012-05-05
  • C++類繼承 繼承后函數(shù)的值實現(xiàn)詳解

    C++類繼承 繼承后函數(shù)的值實現(xiàn)詳解

    這篇文章主要介紹了C++類繼承 繼承后函數(shù)的值實現(xiàn)詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-09-09
  • QT連接SQLServer數(shù)據(jù)庫的實現(xiàn)

    QT連接SQLServer數(shù)據(jù)庫的實現(xiàn)

    要使用Qt連接SQL Server數(shù)據(jù)庫,需要使用Qt提供的SQL模塊和SQL Server驅(qū)動程序,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • C++實現(xiàn)LeetCode(10.正則表達式匹配)

    C++實現(xiàn)LeetCode(10.正則表達式匹配)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(10.正則表達式匹配),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • Cocos2d-x學(xué)習(xí)筆記之CCLayerColor層的使用實例

    Cocos2d-x學(xué)習(xí)筆記之CCLayerColor層的使用實例

    這篇文章主要介紹了Cocos2d-x學(xué)習(xí)筆記之CCLayerColor層的使用實例,CCLayerColor是一個顏色布景層類,本文依然使用Hello World作為例子講解,需要的朋友可以參考下
    2014-09-09
  • C++日歷拼圖的解法你了解嗎

    C++日歷拼圖的解法你了解嗎

    這篇文章主要為大家詳細(xì)介紹了日歷拼圖C++的解法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • opencv3/C++ HOG特征提取方式

    opencv3/C++ HOG特征提取方式

    今天小編就為大家分享一篇opencv3/C++ HOG特征提取方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • C語言數(shù)據(jù)結(jié)構(gòu)與算法之隊列的實現(xiàn)詳解

    C語言數(shù)據(jù)結(jié)構(gòu)與算法之隊列的實現(xiàn)詳解

    隊列只允許在一端進行插入數(shù)據(jù)操作,在另一端進行刪除數(shù)據(jù)操作的特殊線性表,隊列具有先進先出FIFO(First In First Out)的原則。本文將通過實例詳細(xì)說說隊列的實現(xiàn),需要的可以學(xué)習(xí)一下
    2022-10-10
  • Opencv實現(xiàn)讀取攝像頭和視頻數(shù)據(jù)

    Opencv實現(xiàn)讀取攝像頭和視頻數(shù)據(jù)

    這篇文章主要為大家詳細(xì)介紹了Opencv實現(xiàn)讀取攝像頭和視頻數(shù)據(jù),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • C語言實現(xiàn)簡單飛機大戰(zhàn)

    C語言實現(xiàn)簡單飛機大戰(zhàn)

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)簡單飛機大戰(zhàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02

最新評論