利用 EclEmma 來計算單元測試的涵蓋率

當我們替自已的程式碼寫單元測試時,常會遇到以下問題:

  1. 要寫多少才夠?
  2. 要怎麼寫才有效?

其實這些問題,就跟 SQA 執行功能測試時會問的問題一樣,只要把一個字換掉:

  1. 要「測」多少才夠?
  2. 要怎麼「測」才有效?

寫單元測試時,除了該用測試角度來設計以外(例如 ECP 方法),也必須考量到單元測試對程式碼的涵蓋率是否足夠。這邊介紹 Eclipse 的 plug-in:EclEmma。

安裝 EclEmma

安裝 EclEmma 相當容易,只要照著官網的指示,順利安裝完成後,Eclipse 就會多了一個 Coverage View。

利用 JUnit 跑單元測試

寫 Java,用 JUnit 跑單元測試當然是首選!只要將 JUnit 加入專案使用的 Library 之中,寫 UT、跑 UT 都變得再簡單也不過。

我在這裡試寫一個簡單的 Function:「判斷一個傳入的數字是否為奇數,或其值大於零?」,之後我再對它寫單元測試。

Production Code 如下:

	public boolean isOddOrPositive(int number) {
		if (number>0 || number%2 == 1)
			return true;
		else
			return false;
	}

一開始,我先寫一條 UT:

Assert.assertTrue(isOddOrPositive(1));

來看看執行 EclEmma 的效果:

螢幕快照 2014-05-04 下午11.46.24

螢幕快照 2014-05-04 下午11.47.20

圖形化的結果顯示非常清楚,標注紅色的程式碼就是沒有跑到的部分。下方的數據顯示為:Branch Coverage 只有 25%,我們將滑鼠移到黃色的符號看看發生什麼事了?

螢幕快照 2014-05-04 下午11.51.31

顯示為「3 of 4 branches missed」,原來在這個 if 條件式中,我只測到了其中一條,所有的條件應該為:

  1. 第一個條件成立
  2. 第二個條件成立
  3. 兩個條件皆成立
  4. 兩個條件皆不成立

補上所有條件:

Assert.assertTrue(isOddOrPositive(1));
Assert.assertFalse(isOddOrPositive(0));
Assert.assertFalse(isOddOrPositive(-1));
Assert.assertTrue(isOddOrPositive(2));

沒想到涵蓋率一樣不到 100%,為什麼呢?

原來在 Java 中,(-1%2) 的結果不是 1,而是 -1,所以用 -1 當輸入值去測,一直無法滿足條件 2:number%2 ==1 but number<=0

山不轉路轉,我將程式碼改寫成:

if (number>0 || Math.abs(number%2) == 1)
    return true;

總算順利達到 100% 的涵蓋率了。

EclEmma 也支援其他計算方式,例如 Line Coverage,計算的條件就沒有那麼嚴格了,只要每一行都有跑到,就是 100%。

參考資料

EclEmma

廣告

2 thoughts on “利用 EclEmma 來計算單元測試的涵蓋率

發表迴響

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