白盒測試中的幾種用例覆蓋方法

談談白盒測試中的幾種覆蓋方法  
白盒測試用例設計的一個很重要的評估標準就是對代碼的覆蓋度。一說到覆蓋,大家都感覺非常熟悉,但是常見的覆蓋都有哪些?各自有什么優缺點?在白盒測試的用例設計中我們應該如何自如地運用呢?
白盒測試中常見的覆蓋有六種:語句覆蓋、判定覆蓋、條件覆蓋、判定/條件覆蓋、組合覆蓋和路徑覆蓋。下面我們就分別看看這幾種不同的覆蓋究竟是什么鬼。

一、語句覆蓋(Statement Coverage)

語句覆蓋,顧名思義就是針對代碼語句的嘛。它的含義是我們設計出來的測試用例要保證程序中的每一個語句至少被執行一次。通常語句覆蓋被認為是“最弱的覆蓋”,原因是它僅僅考慮對代碼中的執行語句進行覆蓋而沒有考慮各種條件和分支,因此在實際運用中語句覆蓋很難發現代碼中的問題。舉個非常簡單的例子:  public int foo(int a,int b)  {  return a/b;  }  這是一個求兩數之商的函數。如果我們設計如下的測試用例:  TestCase: a = 2, b = 1  這時候我們會發現,該函數的代碼覆蓋率達到了100%,并且設計的case可以順利通過測試。但是顯然該函數有一個很明顯的bug:當 b=0 時,會拋出異常。

二、判定覆蓋(Decision Coverage)

判定覆蓋也被成為分支覆蓋(Branch Coverage),也就是說設計的測試用例要保證讓被測試程序中的每一個分支都至少執行一次。舉個例子,有如下流程圖:



  針對該圖我們想要做到判定覆蓋,可以設計如下case:  TestCase1: a=1, b=1 (路徑:ab)  TestCase2: a=-1, b=-1 (路徑:acd)  TestCase3: a=2, b=-1 (路徑:ace)  判定覆蓋比語句覆蓋強一些,能發現一些語句覆蓋無法發現的問題。但是往往一些判定條件都是由多個邏輯條件組合而成的,進行分支判斷時相當于對整個組合的最終結果進行判斷,這樣就會忽略每個條件的取值情況,導致遺漏部分測試路徑。

三、條件覆蓋(Condition Coverage)

條件覆蓋于分支覆蓋不同,條件覆蓋要求所設計的測試用例能使每個判定中的每一個條件都獲得可能的取值,即每個條件至少有一次真值、有一次假值。  仍然以上面流程圖作為例子來說明。上圖中涉及到的條件一共有4個:  a>0, a<0, b>0, b<0  為了達到條件覆蓋的目的,我們設計的用例需要在 a 點有:  a>0, a≤0, b>0, b≤0,  這些情況出現,并且在 c 點有:  a<0, a≥0, b<0, b≥0  這些情況出現。現在可以設計如下用例:  TestCase1: a=1, b=1 (路徑:ab)  TestCase1: a=-1, b=-1 (路徑:acd)  TestCase1: a=-1, b=0 (路徑:ace)  TestCase1: a=1, b=-1 (路徑:ace)  通常而言條件覆蓋比判定覆蓋強,因為條件覆蓋使得判定中的每一個條件都取到了不同的結果,這一點判定覆蓋則無法保證。但條件覆蓋也有缺陷,因為它只能保證每個條件都取到了不同結果,但沒有考慮到判定結果,因此有時候條件覆蓋并不能保證判定覆蓋。

四、判定條件覆蓋(Decision/Condition Coverage)

判定條件覆蓋,說白了就是我們設計的測試用例可以使得判斷中每個條件所有的可能取值至少執行一次(條件覆蓋),同時每個判斷本身所有的結果也要至少執行一次(判定覆蓋)。不難發現判定條件覆蓋同時滿足判定覆蓋和條件覆蓋,彌補了兩者各自的不足,但是判定條件覆蓋并未考慮條件的組合情況。

五、組合覆蓋(Branch Condition Combination Coverage)

組合覆蓋也叫做條件組合覆蓋。意思是說我們設計的測試用例應該使得每個判定中的各個條件的各種可能組合都至少出現一次。顯然,滿足條件組合覆蓋的測試用例一定是滿足判定覆蓋、條件覆蓋和判定條件覆蓋的。  針對前文提到的流程圖,做條件組合覆蓋時我們可以設計如下用例:  TestCase1: a=1, b=1 (路徑:ab)  TestCase1: a=-1, b=-1 (路徑:acd)  TestCase1: a=-1, b=0 (路徑:ace)  TestCase1: a=1, b=-1 (路徑:ace)  條件組合覆蓋能夠同時滿足判定、條件和判定條件覆蓋,覆蓋度較高,但是組合覆蓋的測試用例數量相對來說也是比較多的。

六、路徑覆蓋

路徑覆蓋,意思是說我們設計的測試用例可以覆蓋程序中所有可能的執行路徑。這種覆蓋方法可以對程序進行徹底的測試用例覆蓋,比前面講的五種方法覆蓋度都要高。那么這種方法是不是就一定最好呢?當然不能講得這么絕對,它的缺點也是顯而易見的:由于需要對所有可能的路徑全部進行覆蓋,那么我們需要設計數量非常巨大的而且較為復雜的測試用例,用例數量將呈現指數級的增長。所以理論上來講路徑覆蓋是最徹底的測試用例覆蓋,但實際上很多時候路徑覆蓋的可操作性不強。

總結

以上簡單描述了幾種不用的邏輯覆蓋方法的原則和優劣。在實際的操作中,要正確使用白盒測試的代碼覆蓋方法,就要從代碼分析和代碼調研入手,根據調研的結果,可以選擇上述方法中的某一種,或者好幾種方法的結合,設計出高效的測試用例,盡可能全面地覆蓋到代碼中的每一個邏輯路徑。

@晴-2016-11-03 10:53:55

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,578評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,701評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,691評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,974評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,694評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,026評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,015評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,193評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,719評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,442評論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,668評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,151評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,846評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,255評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,592評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,394評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,635評論 2 380

推薦閱讀更多精彩內容

  • 文章轉自:http://www.51testing.com/html/44/n-3713444.html 白盒測試...
    Moonsmile閱讀 9,948評論 0 4
  • 等價類劃分方法: 一.方法簡介 1.定義是把所有可能的輸入數據,即程序的輸入域劃分成若干部分(子集),然后從每一個...
    繼續hug閱讀 5,620評論 1 16
  • 白盒測試基本要求 保證一個模塊中的所有獨立路徑至少被執行一次; 對所有的邏輯值均需要測試真、假兩個分支; 在上下邊...
    Sinchunk閱讀 15,392評論 1 9
  • 本著共享主義,本人將PPT考點梳理出來,并且已經翻譯成中文,供大家參考,歡迎各位指導! 本次考試題型分為選擇、判斷...
    Moonsmile閱讀 4,193評論 13 28
  • 1.測試與軟件模型 軟件開發生命周期模型指的是軟件開發全過程、活動和任務的結構性框架。軟件項目的開發包括:需求、設...
    宇文臭臭閱讀 6,745評論 5 100