[英]How to properly use coverage.py in Python?
我剛剛開始使用Coverage.py模塊,所以決定做一個簡單的測試來檢查它是如何工作的。
示例.py
def sum(num1, num2):
return num1 + num2
def sum_only_positive(num1, num2):
if num1 > 0 and num2 > 0:
return num1 + num2
else:
return None
測試文件
from sample import sum, sum_only_positive
def test_sum():
assert sum(5, 5) == 10
def test_sum_positive_ok():
assert sum_only_positive(2, 2) == 4
def test_sum_positive_fail():
assert sum_only_positive(-1, 2) is None
如您所見,我的所有代碼都包含測試,而 py.test 表示所有代碼都通過了。 我希望 Coverage.py 顯示 100% 的覆蓋率。 嗯,沒有。
好吧,Coverage.py 可能看不到 test.py 文件,所以我將測試函數復制到sample.py
文件並再次運行 Coverage:
然后我添加了這段代碼:
if __name__ == "__main__":
print(sum(2, 4))
print(sum_only_positive(2, 4))
print(sum_only_positive(-1, 3))
並刪除了所有測試功能。 之后,Coverage.py 顯示為 100%:
為什么會這樣? Coverage.py 不應該顯示代碼測試覆蓋率,而不僅僅是執行覆蓋率嗎? 我已閱讀 Coverage.py 的官方常見問題解答,但找不到解決方案。
由於很多SO用戶都熟悉代碼測試和代碼覆蓋率,希望你能告訴我,我錯在哪里。
我在這里只有一個想法:Coverage.py 可能只是觀察哪些代碼行沒有執行,所以我應該為這些行編寫測試。 但是有些行已經執行但沒有被測試覆蓋,所以 Coverage.py 在這里會失敗。
Coverage 會尋找一個 .coverage 文件來為您讀取和生成該報告。 Py.test 本身不會創建一個。 你需要 py.test 插件來覆蓋:
pip install pytest-cov
如果您已經擁有它,那么您可以像這樣同時運行它們:
py.test test.py --cov=sample.py
這意味着在sample.py
上運行測試模塊test.py
並記錄/顯示覆蓋率報告。
如果您需要多次測試運行並累積它們記錄的覆蓋率,然后顯示最終報告,您可以像這樣運行它:
py.test test.py --cov=sample.py --cov-report=
py.test test.py --cov=sample2.py --cov-report=
py.test test.py --cov=sample3.py --cov-report=
這意味着運行測試模塊test.py
並在sample.py
上記錄(僅)覆蓋率 - 不顯示報告。
現在您可以單獨運行coverage 命令以獲得完整的報告:
coverage report -m
上面的命令只是根據之前測試運行中累積的 .coverage 數據文件顯示格式化的覆蓋率報告。 -m
表示顯示丟失的行,即測試未涵蓋的行:
Name Stmts Miss Cover Missing
-----------------------------------------
sample.py 6 0 100%
覆蓋支撐多個開關等--include
和--omit
包含/排除使用路徑模式的文件。 有關更多信息,請查看他們的文檔: https : //coverage.readthedocs.io/en/coverage-4.5.1/cmd.html#reporting
解析你的實驗有點困難,而且你沒有包含你在每個實驗中使用的命令行。 但是:如果您使用以下命令運行測試:
python -m py.test test.py
然后你可以在coverage.py下運行它們:
coverage run -m py.test test.py
以下命令對我有用:
coverage run --source=sample -m pytest test.py
coverage report -m
將__init__.py
放在每個測試文件夾中可以解決原始問題並顯示正確的覆蓋范圍。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.