coverage.py是一個用來統計python程式碼覆蓋率的工具。它使用起來非常簡單,並且支援最終產生介面友好的html報告。在最新版本中,還提供了分支覆蓋的功能。
官方網站:
http://nedbatchelder.com/code/coverage/
win32版本:
http://pypi.python.org/pypi/coverage
或者通過easy-install來安裝:
easy_install coverage
裝好後,在c:\Python25\Scripts\(假設裝在c盤)目錄會有一個coverage.exe。通過這個exe基本上可以完成我們所有需要的功能。運行一下,如果發現少了那個模組,請先安裝easy_install。
Coverage Command Line
命令列使用說明: 詳見:http://nedbatchelder.com/code/coverage/cmd.html
最關鍵核心的幾個參數使用如下:
1. run
執行程式碼涵蓋範圍統計,只需要通過coverage的run參數執行被統計代碼即可。
$ coverage run my_program.py arg1 arg2
跑完後,會自動產生一個覆蓋率統計結果檔案(data file):.coverage。如果要修改這個預設的檔案名稱也可以,只要設定COVERAGE_FILE環境變數。
2. report
有了覆蓋率統計結果檔案,只需要再運行report參數,就可以在命令裡看到統計的結果。
$ coverage report
Name Stmts Exec Cover
---------------------------------------------
my_program 20 16 80%
my_module 15 13 86%
my_other_module 56 50 89%
---------------------------------------------
TOTAL 91 79 87%
3. html
最帥最酷的功能了,直接產生html的測試報告。
$ coverage html -d covhtml
產生的報告非常酷,直接關聯代碼,高亮顯示覆蓋和未覆蓋的代碼,支援排序。可以在這個地址預覽一下:
http://nedbatchelder.com/code/coverage/sample_html/
效果如下:
4. combine
用過程式碼涵蓋範圍工具的都知道,多份結果的合并至關重要。combine這個參數我琢磨了很久,開始總是合并不成功。後來終於明白了。執行合併作業很簡單,只要把需要合并的覆蓋率結果資料檔案放在同一個目錄裡,然後執行:
coverage combine
即可。但是,其實對目錄裡的結果檔案是有要求的,要求就是檔案名稱的格式,需要合并的檔案必須有同樣的首碼,然後後面跟一個名稱(通常是機器名),然後再跟一個數字(通常是進程ID),比如:
.coverage.CoderZh.1234
.coverage.Cnblogs.5678
為了方便執行結果的合并,我們在前面執行統計時,在run參數後面跟一個-p參數,會自動產生符合合并條件的結果檔案。
$ coverage run -p my_program.py arg1 arg2
合并後,會再產生一個.coverage檔案,然後再執行html查看合并後的報告吧。
其他幾個erase annotate debug 參數就不介紹了。
Coverage API
除了使用命令列,還可以在python代碼中直接調用coverage模組執行程式碼涵蓋範圍的統計。使用方法也非常簡單:
import coverage
cov = coverage.coverage()
cov.start()
# .. run your code ..
cov.stop()
cov.save()
coverage的建構函式可以設定結果檔案的名稱等。有個函數容易弄錯,就是use_cache,如果設定的use_cache(0),表示不在硬碟上讀寫結果檔案。如果需要結果資料用來合并,一定要設定use_cache(1)。
coverage提供一些很好用的函數,如:exclude(排除統計的代碼),html_report(產生html報告),report(控制台輸出結果)
下篇講講如何在測試django應用時,編寫一個自己的test runner來執行程式碼涵蓋範圍的統計。