利用 Coverage 計算 Python 程式碼的涵蓋率

上次介紹過利用 EclEmma,可以在 Eclipse 開發環境下計算 Java 的程式碼涵蓋率。找了一下發現,Python 也有一個好用的工具 Coverage。

* 安裝 Coverage

安裝方式跟其他的 Python 元件一樣,可以用 easy_install 或是 pip 安裝。安裝完成後,直接在 command line 下執行 coverage 就會顯示說明內容。

* 範例程式

用一樣的例子方便比較:有一個程式,它會回傳傳入的整數是否為奇數,或是大於 0。我在這裡用 Python 內建的 Unit Test 框架:unittest,production code 與測試碼如下:

import unittest

class CodeCoverage():

	def isOddOrPositive(self, number):
		if number>0 or number%2 ==1:
			return True
		else:
			return False

class CodeCoverageTest(unittest.TestCase):

	def test_isOddOrPositive(self):
		self.assertTrue(CodeCoverage().isOddOrPositive(1))

if __name__ == "__main__":
	unittest.main()

* Command Line 模式下執行

先用下面指令執行你的程式:

coverage run CodeCoverage.py

再用這個指令顯示計算結果:

coverage report -m

螢幕快照 2014-05-11 下午8.13.48

我們可以清楚看到涵蓋率與沒有跑到的行號:第 9 行。預設的計算方式是使用 Statement Coverage (也就是 Line Coverage)。

除了簡單的結果以外,Coverage 也可以產生精美的 html 報告,可以清楚看出沒有測試到的程式碼,請額外執行:

coverage html

會產生一個 html 的資料夾,可以打開裡面的檔案看結果。

螢幕快照 2014-05-11 下午8.18.09

* 利用 Coverage API 來計算涵蓋率

匯入 Coverage 之後,可以利用 start()/stop() 記錄中間所執行的程式碼,最後執行 report() 就可以顯示算出的涵蓋率。

螢幕快照 2014-05-11 下午8.29.01

這邊顯示了有 3 行沒有跑到:9, 14, 17,14 與 17 行是因為執行的方式不同,所以沒有跑到。

* Statement Coverage vs. Branch Coverage

Coverage 也可以設定成利用 Branch Coverage 的方式來計算,只要執行的時候輸入額外的參數即可。

coverage run --branch CodeCoverage.py

* 參考資料

coverage.py

廣告

發表迴響

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