簡體   English   中英

如何在 Python 中正確使用coverage.py?

[英]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 結果

好吧,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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM