使用coverage工具統計python單元測試覆蓋率

Coverage簡介

Coverage是一種用於統計Python代碼覆蓋率的工具,經過它能夠檢測測試代碼對被測代碼的覆蓋率如何。Coverage支持分支覆蓋率統計,能夠生成HTML/XML報告。html

官方文檔:http://coverage.readthedocs.org/en/latest/python

獲取地址:http://pypi.python.org/pypi/coverageweb

也能夠經過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命令行

關鍵命令以下:code

A.runhtm

執行代碼覆蓋率統計,只須要經過coverage的run參數執行被統計代碼便可。blog

$ coverage run test.py arg1 arg2

test.py是測試腳本,arg1 arg2是test.py執行須要的參數。跑完後,會自動生成一個覆蓋率統計結果文件(data file):.coverage。

B.report

有了覆蓋率統計結果文件,只須要再運行report參數,就能夠在命令裏看到統計的結果。

clip_image001

Stmts/Miss表示語句總數/未執行到的語句數

Cover=(Stmts-Miss)/Stmts

c. html

生成html的測試報告。

$ coverage html -d covhtml

生成的報告直接關聯代碼,高亮顯示覆蓋和未覆蓋的代碼,支持排序。-d指定html文件夾。能夠在這個地址預覽一下:http://nedbatchelder.com/code/coverage/sample_html/

效果以下:

image

測試文件:

image

 

高亮顯示覆蓋的和未覆蓋的代碼,覆蓋的用綠色標示,未覆蓋的用紅色標示。

注: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

clip_image006

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中止後能夠出結果

相關文章
相關標籤/搜索