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

问题描述 投票:0回答:5

我刚刚开始使用 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

测试.py

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 results

嗯,Coverage.py可能看不到test.py文件,所以我将测试函数复制到

sample.py
文件并再次运行Coverage:
enter image description here

然后我添加了这段代码:

if __name__ == "__main__":
    print(sum(2, 4))
    print(sum_only_positive(2, 4))
    print(sum_only_positive(-1, 3))

并删除了所有测试功能。之后,Coverage.py 显示 100%:

enter image description here

为什么会这样? Coverage.py 不应该显示代码测试覆盖率,而不仅仅是执行覆盖率吗?我已经阅读了 Coverage.py 的官方 F.A.Q.,但找不到解决方案。
由于很多SO用户都熟悉代码测试和代码覆盖率,我希望你能告诉我,我错在哪里。

我这里只有一个想法:Coverage.py 可能只是观察哪些代码行没有执行,所以我应该为这些行编写测试。但是有些行已经执行但没有被测试覆盖,所以 Coverage.py 在这里会失败。

python unit-testing python-3.x coverage.py
5个回答
43
投票

Coverage 会查找 .coverage 文件来读取并为您生成该报告。 Py.test 本身不会创建一个。您需要 py.test 插件来覆盖:

pip install pytest-cov

如果您已经拥有它,那么您可以像这样同时运行它们:

py.test test.py --cov=sample.py

这意味着运行测试模块

test.py
并在
sample.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 report -m

上面的命令只是根据先前测试运行中累积的 .coverage 数据文件显示格式化的覆盖率报告。

-m
表示显示遗漏的行,即测试未覆盖的行:

Name        Stmts   Miss  Cover   Missing
-----------------------------------------
sample.py       6      0   100%  

Coverage 支持更多开关,例如

--include
--omit
,以使用路径模式包含/排除文件。有关更多信息,请查看他们的文档:https://coverage.readthedocs.io/en/6.0.2/source.html?highlight=reporting#reporting


26
投票

解析你的实验有点困难,而且你没有包含每个实验使用的命令行。 但是:如果您使用以下命令运行测试:

python -m py.test test.py

然后你可以在coverage.py下运行它们:

coverage run -m py.test test.py

23
投票

以下命令对我有用:

coverage run --source=sample -m pytest test.py

coverage report -m

4
投票

__init__.py
放入每个测试文件夹中可以解决原始问题并显示正确的覆盖范围。


0
投票

对于模块,您可以安装coverage和pytest。然后,要运行测试和相应模块的覆盖率,您可以执行以下操作。

这将在目录

tests
中运行 pytests 并使用
pkg_name
作为源。

coverage run --source=pkg_name -m pytest -x tests

然后,当您使用

coverage report
生成报告时,您将获得包中每个脚本的覆盖范围列表 (
pkg_name
)。像这样的东西

姓名 Stmts 小姐 封面
pkg_name\main.py 10 10 0%
pkg_name\__init__.py 3 0 100%
pkg_name\module\M1.py 37 29 22%
pkg_name\module_init_.py 0 0 100%
总计 ### ### X%
© www.soinside.com 2019 - 2024. All rights reserved.