python coverage

注意:瑣碎的細節非常多,遇到問題多看看官方文檔

1、命令行運行
如果程序的運行方式是:python my_program.py arg1 arg2
則替換成如下命令:coverage run my_program.py arg1 arg2
即用coverage腳本替代python命令啓動程序。

2、和nosetests聯合使用
有兩種方式:
(1)coverage run $(which nosetests)
(2)nosetests --with-coverage ,這種方式使用nose builtin coverage模塊,比官方coverage模塊支持的功能少。使用時,優先考慮第一種方式

3、指定/忽略統計模塊,忽略指定代碼行
run命令的–source選項可指定哪些目錄的文件被統計
coverage run --source=dir1,dir2
還可以指定模塊,或在代碼中添加指定的註釋以忽略某些行代碼,具體見官方文檔

4、最佳實踐
把coverage運行相關的option寫在配置文件中,配置文件比命令行支持更多種類的option

5、coverage combine
coverage run 命令會生成 .coverage 文件,文件中存儲了覆蓋率統計結果。有時我們可能會分開跑不同類型的case,比如單獨跑單測,再跑模塊case,這樣就會生成2個 .coverage 文件。將兩個文件重命名爲 .coverage.xxx 後移動到同一個目錄,使用combine 命令,即可合併統計結果。

注意:coverage 通過文件的絕對路徑,判斷不同測試中的文件是否是同一個文件,是否能合併,因此不同測試中,源代碼的文件位置要一致。如果不一致,可以通過在配置文件中 [path] section 配置。具體見path文檔

6、coverage run --parallel-mode
–parallel-mode 模式下創建的數據文件命名方式爲 .coverage.machine_name.process_id.random_num,可以直接用於combine操作。這裏 --parallel-mode 不是指併發或分佈式之類的意思,僅僅是爲了從不同的進程收集數據後combine。

7、coverage run -a
coverage.py 每次run會刪除已有的 .coverage 文件,如果使用 -a 選項,則不會刪除 .coverage,直接修改已有的 .coverage ,將前後兩次的統計結果自動合併。

8、Measuring sub-processes
統計覆蓋率情況,必須使用coverage.py 代替 python 啓動程序,有些sub-process程序會默認使用python啓動,導致sub-process部分代碼覆蓋率無法統計。coverage默認支持python threading(不是thread模塊) 模塊實現的多線程統計,其他的比如multi-process,gevent等需要另行配置,見文檔

9、coverage run --branch
–branch 選項會增加分支覆蓋率的統計,具體來說在 coverage report -m 輸出的報告中增加 Branch and BrPart (for Partial Branch) 2列。

coverage中分支的定義是,一條語句執行完後,下一條要執行的語句有幾種可能,就算幾個分支。 比如下面的 if conditon 後,如果conditon 爲 true,則下一條執行的語句爲 execute_1;否則下一條執行的爲 execute_2。儘管沒有else,if 後可能執行的語句有2條,因此算2個分支。

if condition:
	exectue_1
execute_2

Branch表示有多少個分支。

BrPart (for Partial Branch):假設一條語句後下一條要執行的可能語句有3條,測試只覆蓋了其中1條,就說有2個BrPart,即有2個可能性測試未覆蓋。一般報告中 “36->38” 這樣箭頭連接2個數字的標誌,表示 36行後執行38行 這個分支沒覆蓋。

10、覆蓋率計算
(1)不統計分支覆蓋率時,覆蓋率 = 已執行的代碼行數 / 所有可執行的代碼行數
(2)統計分支覆蓋率時,覆蓋率 = actual execution / execution opportunities,具體見官方文檔。這個還沒看懂…

11、生成報告
在 .coverage 文件所在目錄,執行下列命令生成不同格式的報告
coverage report -m
coverage html
coverage xml
coverage annotate:生成帶註釋的源文件,標記哪些行被執行(>符號),哪些沒有(!符號)

12、plugins
coverage 已有 Django,Mako plugin 可直接使用。具體細節及其他plugin見plugin

13、FAQ
FAQ

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章