軟體測試的覆蓋率(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