2011年12月26日 星期一

Code Coverage

前言 
承接著之前單元測試相關的文章中,提到了程式的可測試性為系統重要的品質指標之一。這篇文章要提的,則是也很常用來當作檢視測試的品質指標之一。

測試不是有做就好,做心安的...透過code coverage,可以快速的得知,目前系統中,有多少程式被測試過,以及測試的過程中,程式執行的路徑為何。

Code Coverage的定義 
基本上就是測試程式碼的涵蓋範圍,不考量成本跟投資效益比,涵蓋率越高,當然代表品質提升面也會比較廣。

Code Coverage的種類 
Code Coverage種類不少,以下舉出幾種:
  1. Function Coverage
    以function為單位,檢測有哪些function曾經被測試程式測試過。只要有測試到該function,就當作測過了。假設production code裡面有10個function,只有1個被測試過,那function coverage就是10%。
     
  2. Line Coverage
    也就是是否production code的每一行程式碼,都有被測試程式執行到。也是一般.NET的code coverage工具裡面,最常看到的涵蓋率。

    如果,你以為每一行都有跑到,Line Coverage 100%就代表這是測試品質的最高表現,那就錯了,Line Coverage只是幾個涵蓋率分類裡面的子集合而已。
     
  3. Statement Coverage
    與line Coverage一行一行用斷行符號來分的切入角度不同,而是使用statement來當檢測單位。在許多的程式語言中,是允許一行裡面出現多個statement的,當一行裡面擁有多個statement,而測試程式中,只有檢測到其中一個statement,那麼line coverage會涵蓋到,statement coverage卻可以抓出其中涵蓋度不足的部分。
     
  4. Decision Coverage
    就像決策樹一般,每一個決策分歧點,也就是程式執行路徑,為檢測單位。值得一提的是,Decision coverage針對的是分歧後的結果。

     
  5. Condition Coverage
    即使是Decision Coverage,也有不足之處。不足處在於Decision針對的是每條不同路徑要測試的程式主體,但判斷式本身,卻不過問。而Condition Coverage是連判斷式裡面的陳述式(sub-expression),每一種陳述式所回傳的bool正反兩種情境都要測到。

     
  6. Condition/Decision Coverage
    沒錯!就是摻在一起做撒尿牛丸。除了判斷式中每個陳述式的bool都要測true/false,也要測試各種路徑裡面的各種結果。
     
  7. Modified condition/decision coverage
    可以說是Condition/Decision Coverage的完成體,一樣以wiki上的例子來說:


  8. Multiple Condition Coverage
    最後當然就是最瘋狂的一種,每一個陳述式都有true/false,去做2的n次方種組合。




沒有留言:

張貼留言