首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Python中正确使用coverage.py?

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

Stack Overflow用户
提问于 2016-04-09 13:03:05
回答 4查看 90.4K关注 0票数 69

我刚刚开始使用Coverage.py模块,所以决定做一个简单的测试来检查它是如何工作的。

Sample.py

代码语言:javascript
运行
复制
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

test.py

代码语言:javascript
运行
复制
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文件中,然后再次运行覆盖率:

然后我添加了这段代码:

代码语言:javascript
运行
复制
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读过一个官方的Coverage.py,但是找不到解决方案。

由于许多用户熟悉代码测试和代码覆盖率,我希望您能告诉我,我在哪里弄错了。

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-04-09 23:32:24

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

代码语言:javascript
运行
复制
pip install pytest-cov

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

代码语言:javascript
运行
复制
py.test test.py --cov=sample.py

这意味着运行测试模块test.py和在sample.py上记录/显示覆盖率报告。

如果需要运行多个测试并累积它们的记录覆盖率,然后显示最终报告,则可以这样运行:

代码语言:javascript
运行
复制
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上记录(仅)覆盖率--不要显示报告。

现在,您可以单独运行覆盖率命令,以获得完整的报告:

代码语言:javascript
运行
复制
coverage report -m

上面的命令简单地显示了基于以前测试运行的累积.coverage数据文件的格式化覆盖率报告。-m的意思是显示遗漏的行,即未被测试覆盖的行:

代码语言:javascript
运行
复制
Name        Stmts   Miss  Cover   Missing
-----------------------------------------
sample.py       6      0   100%  

覆盖率支持更多的交换机(如--include--omit )使用路径模式包含/排除文件。有关更多信息,请查看他们的文档:https://coverage.readthedocs.io/en/6.0.2/source.html?highlight=reporting#reporting

票数 40
EN

Stack Overflow用户

发布于 2016-04-09 22:53:56

通过您的实验进行解析有点困难,而且您还没有包括每次实验中使用的命令行。但是:如果您在以下情况下运行测试:

代码语言:javascript
运行
复制
python -m py.test test.py

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

代码语言:javascript
运行
复制
coverage run -m py.test test.py
票数 25
EN

Stack Overflow用户

发布于 2020-11-11 11:35:14

以下命令适用于我:

代码语言:javascript
运行
复制
coverage run --source=sample -m pytest test.py

coverage report -m
票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36517137

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档