1. Coverage - 衡量測試的覆蓋率
我們已經掌握了如何進行單元測試。接下來,一個很自然的問題浮現出來,我們如何知道單元測試的質量呢?這就提出了測試覆蓋率的概念。覆蓋率測量通常用于衡量測試的有效性。它可以顯示您的代碼的哪些部分已被測試過,哪些沒有。
coverage.py 是最常用的測量 Python 程序代碼覆蓋率的工具。它監視您的程序,記錄代碼的哪些部分已被執行,然后分析源代碼以識別已執行和未執行的代碼。
我們可以通過下面的方法來安裝 coverage.py:
$ pip install coverage
要收集測試覆蓋率數據,我們只需要在原來的測試命令前加上 coverage run 即可。比如,如果我們之前是使用pytest arg1 arg2 arg3
來進行測試,則現在我們使用:
$ coverage run -m pytest arg1 arg2 arg3
當測試運行完成后,我們可以通過coverage report -m
來查看測試覆蓋率的報告:
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%
如果希望得到更好的視覺效果,也可以使用 coverage html 命令來生成帶注釋的 HTML 報告,然后在瀏覽器中打開 htmlcov/index.html。
不過,更多人選擇使用 pytest-cov 插件來進行測試覆蓋率的收集。這也是 ppw 的選擇。通過 ppw 生成的工程,pytest-cov 已被加入到測試依賴中,因此也就自然安裝到環境中去了。
因此,通過 ppw 配置的工程,我們一般不需要直接調用 coverage 命令,而是使用 pytest 命令來進行測試。pytest-cov 插件會自動收集測試覆蓋率數據,然后在測試完成后,將測試覆蓋率報告打印到控制臺上。如果希望生成帶注釋的 HTML 報告,可以使用pytest --cov-report=html
命令。
默認情況下,coverage.py 將測試行(語句)覆蓋率,但通過配置,還可以測量分支覆蓋率。我們通過下面的示例代碼來說明這兩種覆蓋分別是什么意思。
def my_partial_fn(x):if x:y = 10return ymy_partial_fn(1)
在上面的代碼中,第 2 行是一個 if 語句,根據 x 的取值,接下來可能運行到第 3 行,也可能運行到第 4 行。當 coverage 被配置為按語句計算覆蓋時(這是默認的情況),只要該函數被執行,則 coverage 將統計為該函數的所有語句都已被執行過;但如果 coverage 被配置為按分支計算覆蓋時,如果 x 求值的結果為 False,那么代碼執行將從第 2 行直接跳到第 4 行。Coverage 將把第 2 行到第 4 行的代碼標記為部分分支覆蓋。
除了配置分支覆蓋外,還有其它幾種情況需要配置。接下來我們就介紹如何進行配置。
Coverage.py 配置文件的默認名稱是。coveragerc,在 ppw 生成的