在上篇把OpenCover整合到測試之後,每當執行測試後會產生出一個涵蓋率的結果報告出來。
這個涵蓋率的結果是一個xml的檔案,這個xml其實有非常豐富的資訊,但是沒有一些基礎概念會不理解是什麼意思。
因此,在這篇,將會對於涵蓋率相關的資訊做一個介紹和說明。
同步發表於我的部落格:http://blog.alantsai.net/2017/01/devopsSeries-opencover-coverageMetrixsExplained.html (部落格的格式會漂亮一些)
涵蓋率其實有非常多種算法,其中常見的有:
以上就是常見的涵蓋率計算方式,其中1和2(class 和 method)比較算是一個總覽,更多在看的是3之後的方法。
不過,3之後的算法,只靠這幾個說明文字可能不容易理解,所以來看一下例子。
Line Coverage 可以說是最基本的涵蓋率算法,概念很簡單,就是每一行算一個測試點,換句話說:
可以發現,測試點比較粗糙,第3點和第4點都只個算1點而已。
Statement Coverage比Line Coverage好一點,它是以每一個statement算一個點,所以:
Statement Coverage不錯,但是畢竟一個statement不代表只有一種可能,因此又有了Sequence Point Coverage。這種coverage的概念是,只要能夠放中斷點的都算1點測試點:
每一個分叉點算1個測試點,舉例來說:
或許會覺得為什麼需要Branch Coverage?原因很簡單,因為Branch Coverage是用來輔助呈現一個方法的分叉點是否都有測試到。
這個其實是用來輔助Sequence Point Coverage,可以想像一下,如果你在if裡面有兩行,在Sequence Point算兩點,如果有10行,會算10點,當if裡面行數越多,點數越多,會沖淡掉 最後百分比的數值。
這個時候Branch Coverage變得很方便,因為整個if只算1點,要嗎過,要嗎不過。
上面介紹完了計算方法之後,可以看的出來,Line Coverage 和 Statement Coverage其實沒有那麼準確,Sequence Point反而是比較精準的計算方式。而Sequence point在看方法的路徑是不是都有涵蓋到 的時候不容易看,這個時候Branch Coverage就很適合。
因此,Open Cover的結果包含了:
有了上面的概念之後,再來看一下open cover產生的結果:
瞭解了Coverage的算法之後,其實就可以parse這個xml結果並且把內容呈現出來(題外話:在Powershell裡面處理xml其實非常方便)。
甚至可以做到說,當某個Coverage的百分比數低於某個值的時候,不讓建製成功 - 不過這個部分在這邊不會做這個事情,有興趣可以利用Powershell處理xml的方法把內容parse出來在做判斷。
但是,最後要使用者來看這個xml來瞭解情況實在不方便,況且也沒有辦法容易看出到底是那裡沒有cover到。
因此,下篇將會介紹,有什麼方式可以讓結果更user friendly。