python測試用例覆蓋率工具coverage教程(命令列工具)(譯)
歡迎大家光臨我的部落格
簡介
coverage是一個檢測單元測試覆蓋率的工具,即檢查你的測試用例是否覆蓋到了所有的程式碼。
coverage命令列工具
當你通過pip install coverage成功安裝完coverage後,就會在python命令的同級目錄,生成一個coverage可執行程式。coverage對應不同版本的python程式,生成了不同版本的可執行程式,如python2平臺的coverage2,python3平臺的coverage3,以及coverage-X.Y,X、Y為python的版本號。
coverage命令共有5個指明coverage動作的引數,分別是:
- run - 執行一個python程式並收集執行資料
- report - 生成報告
- html - 把結果輸出html格式
- xml - 把結果輸出xml格式
- annotate - 執行一個python程式並收集執行資料
- erase - 清楚之前coverage收集的資料
- combine - 合併coverage收集的資料
- debug - 獲取除錯資訊
- help - 檢視coverage幫助資訊,coverage help 動作/coverage 動作 –help,檢視指定動作的幫助資訊。
- 可以通過–rcfile=FILE的方式指定命令執行時的配置檔案。所有命令列的引數都可以寫到配置檔案裡面。
執行命令
通過coverage run命令python程式,並收集資訊。
coverage run test.py #效果和執行python test.py效果差不多
你也可以使用-m引數指定執行一個python檔案裡面的可匯出的模組,例如
coverage run -m test.test #執行test檔案裡的test模組
可以通過–source,–include,–omit指定執行的python檔案所在的目錄。但是一定要把這三個引數放在run後面,所執行的python檔案前面。
coverage run --source=project test.py
coverage可以處理多執行緒的程式,但是如果你使用 multiprocessing, greenlet, eventlet, gevent,那麼coverage預設情況下就處理不了了,不過可以通過–concurrency引數,指明程式具體使用的庫,則可以處理。預設情況下,coverage也不會處理python解析器的程式碼,如python自帶的標準庫os、sys等,如果你也想看這些系統庫的資料,使用-L引數。如果有一些程式碼本應該被統計到,但卻沒有,那麼加上–timid引數再執行一遍,這是一個比較慢的跟中演算法,所以一般情況下,少用。如果你有多個程序或者機器需要執行coverage程式,可以是使用–parallel-mod將所有程序的統計資料分開。
在執行coverage過程中,coverage會產生一些警告,這些警告會影響到統計的程序。這些警告主要包括:
- “Trace function changed, measurement is likely wrong: XXX”
如果在執行的過程中,程式碼發生改變,則會報這個錯誤,xxx表示是修改後的名稱。
- “Module XXX has no Python source”
使用了一個不存在的python檔案
- “Module XXX was never imported”
執行的python檔案中XXX模組不存在
- “No data was collected”
主要可能是你要執行的python檔案中,一行程式碼都沒有執行到
- “Module XXX was previously imported, but not measured.”38762
模組XXX在coverage執行時已經匯入了,他的執行情況不會被coverage監控到。
結果檔案
預設情況下,coverage生成的結果檔案為.coverage,你可以通過修改環境變數COVERAGE_FILE來修改這個檔案的字尾名。你也可以是用-a把多次執行的結果合併到一個檔案裡,否則,每次生成的結果檔案都是上一次執行的結果。你可以是用coverage erase清空之前執行的結果檔案。
合併結果檔案
coverage可以把多個結果檔案合併起來,首先把多個結果檔案拷貝到同一個目錄,然後執行combine選項,就可以把多個檔案合併到一個.coverage檔案了
coverage combine
你也可以指定檔名或者目錄
coverage combine data1.dat windows_data_files/
這種情況下,coverage不會收集當前目錄下的檔案,如果你需要收集當前目錄下的結果,你需要在命令列指定。
coverage只會收集.coverage的檔案,如下格式的檔案會被收集。
.coverage.machine1
.coverage.20120807T212300
.coverage.last_good_run.ok
可以通過run –parallel-mode引數來控制每次執行是否引數獨立結果檔案,如果指定,產生的結果檔名機器名、程序id、隨機數。例如
.coverage.Neds-MacBook-Pro.local.88335.316857
.coverage.Geometer.8044.799674
如果你在不同的機器上不同的目錄執行coverage產生的結果檔案無法合併,你可以通過paths引數來指明他們間的區別。具體可以通過paths來配置。如果合併時,結果檔案不可讀,coverage會輸出一個警告。
結果報告
提供四種風格的輸出檔案格式。分別對應html,xml命令。他們的命令列引數是一致的。如果你想收集一系列檔案中的某些檔案的結果,你可以指定具體的檔名和模組名。–include –omit引數可以使用正則來指定要收集的檔案。指定-i –ignore-error參賽忽略那些找不到檔案的錯誤。–fail-under可以指定一個數字,當coverage的結果小於這個數字,coverage命令返回一個錯誤碼2,但這個引數對annotate命令無效。
覆蓋報告簡介
最簡單的報告是report命令輸出的概要資訊,report包括執行的行數,沒有執行的行數,覆蓋百分比。
$ coverage report
Name Stmts Miss Cover
---------------------------------------------
my_program.py 20 4 80%
my_module.py 15 2 86%
my_other_module.py 56 6 89%
---------------------------------------------
TOTAL 91 12 87%
-m引數可以顯示具體沒有被執行的檔案行。
$ coverage report -m
Name Stmts Miss Cover Missing
-------------------------------------------------------
my_program.py 20 4 80% 33-35, 39
my_module.py 15 2 86% 8, 12
my_other_module.py 56 6 89% 17-23
-------------------------------------------------------
TOTAL 91 12 87%
如果你使用branch coverage,branch的結果將顯示在Branch和BrPart兩列。例如
$ coverage report -m
Name Stmts Miss Branch BrPart Cover Missing
---------------------------------------------------------------------
my_program.py 20 4 10 2 80% 33-35, 36->38, 39
my_module.py 15 2 3 0 86% 8, 12
my_other_module.py 56 6 5 1 89% 17-23, 40->45
---------------------------------------------------------------------
TOTAL 91 12 18 3 87%
你指定檔案來檢視特定檔案的結果。
$ coverage report -m my_program.py my_other_module.py
Name Stmts Miss Cover Missing
-------------------------------------------------------
my_program.py 20 4 80% 33-35, 39
my_other_module.py 56 6 89% 17-23
-------------------------------------------------------
TOTAL 76 10 87%
–skip-covered引數可以不輸出覆蓋率100%的檔案。