Python pytest 整合 coverage
Posted on Oct 27, 2017 in Python 模組/套件推薦 by Amo Chen ‐ 2 min read
軟體測試的覆蓋率(coverage)也是衡量測試品質的其中一項重要指標,如果是使用 pytest 作為測試框架(framework)的話,可以安裝 pytest-cov 衡量覆蓋率的高低。
本文環境
- Ubuntu
- Python 3.5.2
- pytest 3.1.2
- pip 9.0.1
安裝 pytest-cov
在 Python & pytest 執行環境的情況下,只要利用以下指令安裝即可:
$ pip install pytest-cov
執行 pytest-cov
安裝完 pytest-cov
之後,執行 py.test -h
就會發現多了一個區塊是給 coverage 用的參數:
coverage reporting with distributed testing support:
--cov=[path] measure coverage for filesystem path (multi-allowed)
--cov-report=type type of report to generate: term, term-missing,
annotate, html, xml (multi-allowed). term, term-
missing may be followed by ":skip-covered". annotate,
html and xml may be followed by ":DEST" where DEST
specifies the output location. Use --cov-report= to
not generate any output.
--cov-config=path config file for coverage, default: .coveragerc
--no-cov-on-fail do not report coverage if test run fails, default:
False
--no-cov Disable coverage report completely (useful for
debuggers) default: False
--cov-fail-under=MIN Fail if the total coverage is less than MIN.
--cov-append do not delete coverage but append to current, default:
False
--cov-branch Enable branch coverage.
所以要衡量 coverage 就是在執行 py.test
時放入這些參數即可,例如:
$ py.test --cov=./ --cov-report=html tests/
上述指令的意思為執行 tests/
資料夾底下的所有測試,衡量當前路徑下的測試覆蓋率,然後將結果產出為 html
格式,結果會儲存在 htmlcov
這個新增的資料夾。
如果不加 --cov-report=html
的話,預設會將結果輸出到 console ,例如:
---------- coverage: platform darwin, python 3.5.2-final-0 -----------
Name Stmts Miss Cover
------------------------------------------
test.py 2 0 100%
tests/__init__.py 0 0 100%
tests/test_assert.py 3 0 100%
------------------------------------------
TOTAL 5 0 100%
從上述結果就可以直接看到各個檔案的 Cover
是多少。
.coveragerc
設定檔
有時候有些程式其實不需要衡量覆蓋率,譬如 __init__.py
一般都會是空的,如果我們希望將它在報告中排除,就可以用 .coveragerc
設定檔進行排除,以下是 .coveragerc
的範例:
[run]
omit =
*/__init__.py
*/migrations/*
上述的範例就是排除各資料夾底下的 __init__.py
以及 migrations/
資料夾底下的所有檔案。
接著我們在執行 pytest
時可以設定讀取這個設定檔:
$ py.test --cov-config=.coveragerc --cov=./ tests/
就會看到報告中的 __init__.py
被排除了:
Name Stmts Miss Cover
------------------------------------------
test.py 2 0 100%
tests/test_assert.py 3 0 100%
------------------------------------------
TOTAL 5 0 100%
其他的 CONFIG 設定可以到 這裡 查看!
以上就是本篇 pytest 整合 coverage 的教學。
References
https://pypi.python.org/pypi/pytest-cov
http://coverage.readthedocs.io/en/latest/config.html