Coverage簡介
Coverage是一種用於統計Python代碼覆蓋率的工具,通過它可以檢測測試代碼對被測代碼的覆蓋率如何。Coverage支持分支覆蓋率統計,可以生成HTML/XML報告。
官方文檔:http://coverage.readthedocs.org/en/latest/
獲取地址:http://pypi.python.org/pypi/coverage
也可以通過easy_install或pip安裝:easy_install coverage。
安裝后在Python27\Scripts文件夾下生成coverage.exe等工具,在path中加環境變量C:\Python27\Scripts,便可以在命令行中調用coverage命令來進行覆蓋率分析。
Coverage使用
1.命令行方式
詳見:http://coverage.readthedocs.io/en/latest/cmd.html
可以使用help命令查看幫助:$ coverage help
關鍵命令如下:
A.run
執行代碼覆蓋率統計,只需要通過coverage的run參數執行被統計代碼即可。
$ coverage run test.py arg1 arg2
test.py是測試腳本,arg1 arg2是test.py執行需要的參數。跑完后,會自動生成一個覆蓋率統計結果文件(data file):.coverage。
B.report
有了覆蓋率統計結果文件,只需要再運行report參數,就可以在命令里看到統計的結果。
Stmts/Miss表示語句總數/未執行到的語句數
Cover=(Stmts-Miss)/Stmts
c. html
生成html的測試報告。
$ coverage html -d covhtml
生成的報告直接關聯代碼,高亮顯示覆蓋和未覆蓋的代碼,支持排序。-d指定html文件夾。可以在這個地址預覽一下:http://nedbatchelder.com/code/coverage/sample_html/
效果如下:
測試文件:
高亮顯示覆蓋的和未覆蓋的代碼,覆蓋的用綠色標示,未覆蓋的用紅色標示。
注:coverage run test.py命令運行的文件,會統計項目中包括測試文件本身在內的所有文件,run參數的子參數—source可以指定要統計的文件:$ coverage run --source=totest.py test.py 可以只統計totest.py文件。
d.combine
合並多份覆蓋率數據文件,把需要合並的覆蓋率結果數據文件放在同一個目錄里,然后執行coverage combine即可。但是對目錄里的結果文件名的格式有要求,需要合並的文件必須有同樣的前綴,然后后面跟一個名稱(通常是機器名),然后再跟一個數字(通常是進程ID),比如:.coverage.75FEC5D4B3ADAAA.14632.213308
為了方便執行結果的合並,我們在前面執行統計時,在run參數后面跟一個-p參數,會自動生成符合合並條件的結果文件。
e.run參數的子參數1:--branch 統計分支覆蓋率
如果代碼中的一個分支可能跳到一個以上的行,coverage.py會追蹤每一個分支是否都有跳轉到。
$ coverage run --branch test.py
Branch/BrPart表示分支數/未執行到的分支數
f.run參數的子參數2:--parallel-mode
$ coverage run --parallel-mode test.py
使Coverage監測被測代碼子進程的覆蓋率,如果被測代碼是多進程的,如一些web程序等,必須使用此參數。
2.API方式
除了使用命令行,還可以在python代碼中直接調用coverage模塊執行代碼覆蓋率的統計。使用方法也非常簡單:
import coverage
cov = coverage.coverage(source = ['totest'])
cov.start()
#coding
cov.stop()
cov.report()
cov.html_report(directory='covhtml')
source指定要執行統計的文件,source = ['totest']只統計totest.py的覆蓋率
directory指定生成html的路徑
使用Coverage統計web程序的覆蓋率
web程序一般是開啟服務后循環監聽消息,不會自動退出。而Coverage在實現上使用了atexit模塊注冊一個回調函數,在Python退出時將內存中的覆蓋率結果寫到文件中。被測腳本只有正常退出或者以SIGINT 2信號退出才能出發atexit,才能得到覆蓋率結果。CTRL+C發的即是SIGINT 2信號,所以前台啟動的服務用CTRL+C停止后可以出結果。