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

新手上路,请多包涵

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

好吧,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 在这里会失败。

原文由 Groosha 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 857
2 个回答

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 命令以获得完整的报告:

 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

原文由 fips 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

 python -m py.test test.py

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

 coverage run -m py.test test.py

原文由 Ned Batchelder 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题