Statement Coverage 與 Block Coverage

每次內部讀書會討論到微軟的軟體測試之道 – 「結構測試技術」這一章節,都會對裡面範例的涵蓋率計算結果感到疑惑,覺得它是不是寫錯了?

抱持著追根究底的精神,我們就實際來用 Visual Studio 2012 裡面的 Code Coverage 工具來分別驗證一下「陳述式涵蓋率」、「區塊涵蓋率」的計算方式。

我寫了一個簡單的程式如下:

public static void CoverageExample(bool first, bool second)
{
	int a = 0, b = 0, c = 0;
	if (first && second)
	{
		a = 1;
		b = 2;
		c = 3;
	}
	return a * b * c;
}

當 first 為 false,second 為 true 時,陳述式涵蓋率為 2/6 (33.3%),區塊涵蓋率為 2/4 (50%)。

先來看陳述式涵蓋率的部分:

statement coverage

標為藍色的陳述式只有 2 個,而 if 條件式標為黃色,只能算是「partially coverged」,所以完整涵蓋率為 2/6 = 33.3%。

那區塊涵蓋率的 50% 是怎麼算的呢?將程式改寫以後再跑一遍,輔助顏色標示就比較好懂了:

block coverage

可以很明顯看出來,藍色有 2 塊,紅色的也有 2 塊,2/4 為 50%。

區塊的計算是根據程式的實際執行流程,這點跟 Branch Coverage 的計算是一樣的,仔細推敲一下就能理解其計算規則。

心得

每個 code coverage 工具的計算方式都不一樣,所以它們怎麼算其實不是重點,只要保持計算的標準一致就好。

更重要的是,不同函式之間的涵蓋率比較,以及單一函式經過不斷修改以後的涵蓋率變化。這些比較數據以及歷史記錄,才能幫助我們決定 unit test 所要投注的資源多寡。

參考資料

軟體測試之道-微軟測試團隊的成功經驗、方法與技術

廣告

One thought on “Statement Coverage 與 Block Coverage

  1. 至於書上範例的執行結果呢?我把我的執行結果列出來:
    Example1(true)
    line: 6/6 (100%) block: 3/3 (100%)

    Example1(false):
    line: 3/6 (50%) block: 2/3 (66.7%)

    Example2(true, true):
    line: 6/6 (100%) block: 4/4 (100%)

    Example2(false, true):
    line: 2/6 (33.3%) block: 2/4 (50%)

發表迴響

Please log in using one of these methods to post your comment:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s