1. 程式人生 > >python測試用例覆蓋率工具coverage教程(命令列工具)(譯)

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%的檔案。