Monday, January 4, 2010

Code Coverage Analysis

更多精彩请到 http://www.139ya.com


Code Coverage Analysis

如果將 test case 看成是一套健身器材,將程式碼看成是人身的肌肉,則所謂的「Code Coverage Analysis」,就是在分析該套健身器材對人身肌肉的「健身效果」;例如,有沒有練到胸肌、腹肌與三角肌,腹肌是練到上腹肌或是下腹肌,三角肌是練到前三角肌或是後三角肌等等。藉由 code coverage analysis,工程師可以瞭解 test case 對程式碼的健身效果,以及程式碼的哪些部分尚未被活動過,並可據此設計新的 test case,來鍛鍊尚未被活動過的程式碼。

基本的衡量指標

就 code coverage analysis 而言,如果將各式各樣的衡量指標加總起來,則其總數不下十來種,而且每一種各有其論述的基礎;當然,我們不可能針對每一個 software module,把所有的衡量指標都做過一遍;因此,比較實際的作法,是以基本的衡量指標為主,再根據程式碼的結構與應用程式的實際使用情況,加選其他的衡量指標,來執行 code coverage analysis。

筆者在閱讀過一些衡量指標的論述之後,挑出其中比較基本而且比較常用的四項指標,並以宏觀角度到微觀角度的順序,為讀者做扼要的介紹。這四項指標分別為:一、method / function coverage;二、statement coverage;三、decision/branch coverage;四、condition coverage。

Method/Function Coverage

所謂「Method/Function Coverage」,是以程式語言的 method 或 function 為觀測基準點,去分析 test case 對程式碼的健身效果。以 AVL tree 的程式為例,假設其所包含的 function 有 avlInsert 、avlDelete 、avlSearch 、avlDoSingleRotation 與 avlDoDoubleRotation 共五種,如果某個 test case 的測試結果,使得其中的 avlInsert與 avlDoSingleRotation 至少被活動過一次,其餘的 function 則從來沒有被活動過,則其function coverage 為 2/5 = 40%。

Statement Coverage

所謂「Statement Coverage」,是以程式語言的 statement 為觀測基準點,去分析 test case 對程式碼的健身效果。然而,在筆者所閱讀過的相關資料裡,幾乎都是把 line coverage 當作 statement coverage;但實際上,line coverage 並不等同於 statement coverage,這是因為 multiple statements 可以寫在同一個 line 中;果此,就有可能發生同一個 line 中,部分的 statements 被執行了,但部分的 statements 卻沒有被執行的情況。

example: i1++; i2++; total = i1 + i2; (three statements at the same line)

Decision/Branch Coverage

所謂「Decision/Branch Coverage」,是以程式語言的 decision statement 為觀測基準點,去分析 test case 對程式碼的健身效果。以 C 或 C++ 為例,if statement 與 switch statement,是 decision statement。

這裡所指的 decision 或 branch,是以「可能的結論」做為觀測基準點,而不是獲得結論之前所必須考量的「各種因素」。以企業為例,假設某企業在決定是否介入一個新領域時,其所考量的因素有 n 種,但最後獲得的結論有 k 種,則 decision coverage 所要觀測的對象,是 k 種結論,而不是 n 種因素。

Condition Coverage

所謂「Condition Coverage」,是以程式語言的 decision statement 所考量的「各種因素」為觀測基準點,去分析 test case 對程式碼的健身效果。以企業為例,假設某企業在決定是否介入一個新領域時,其所考量的因素有 n 種,但最後獲得的結論有 k 種,則 condition coverage 所要觀測的對象,是 n 種因素與其彼此之間的組合結果,而不是 k 種結論。據此可知,if statement 或 switch statement 中所包含的 sub-expression,就是 condition coverage 所要觀測的對象。

No comments: