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

Gro*_*sha 35 python unit-testing coverage.py python-3.x

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

Sample.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
Run Code Online (Sandbox Code Playgroud)

test.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
Run Code Online (Sandbox Code Playgroud)

如你所见,我的所有代码都包含测试,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))
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

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

我在这里只想到一个:Coverage.py可能只是看不执行哪行代码,所以我应该为这些行编写测试.但是有些行已经执行但未被测试覆盖,因此Coverage.py将在这里失败.

fip*_*ips 19

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

pip install pytest-cov
Run Code Online (Sandbox Code Playgroud)

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

py.test test.py --cov=sample.py
Run Code Online (Sandbox Code Playgroud)

这意味着运行测试模块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=
Run Code Online (Sandbox Code Playgroud)

这意味着运行测试模块test.py和记录(仅)覆盖sample.py- 不显示报告.

现在,您可以单独运行coverage命令以获取完整的报告:

coverage report -m
Run Code Online (Sandbox Code Playgroud)

上面的命令只显示基于先前测试运行的累积.coverage数据文件的格式化覆盖率报告.-m表示缺少显示行,即未被测试覆盖的行:

Name        Stmts   Miss  Cover   Missing
-----------------------------------------
sample.py       6      0   100%  
Run Code Online (Sandbox Code Playgroud)

Coverage支持更多交换机,--include--omit使用路径模式包含/排除文件.有关更多信息,请查看他们的文档:https://coverage.readthedocs.io/en/coverage-4.5.1/cmd.html#reporting

  • 如果要检查的文件是测试中导入的包中的子模块,则不起作用。无论我在 `--cov=<>` 指定什么 - 只是文件名、相对或绝对路径 - 我得到“错误:无法生成报告:没有要报告的数据。” (2认同)
  • 如果附加依赖项不存在,您还可以执行类似 `coverage run --source=<module-name> -m pytest <test-location>` 而不是 `py.test test.py --cov=sample.py` 之类的操作。值得。 (2认同)

Ned*_*der 11

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

python -m py.test test.py
Run Code Online (Sandbox Code Playgroud)

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

coverage run -m py.test test.py
Run Code Online (Sandbox Code Playgroud)

  • 也许这里的问题是一个基本的误解:你不应该运行测试,然后覆盖。您应该使用覆盖率来运行测试(我推荐的方式),或者在测试运行期间启用覆盖率(例如使用测试运行器的覆盖率插件)。 (2认同)
  • 我认为没有理由将测试排除在测量之外,而只有优点。您的测试中有代码,您想知道它正在执行。Coverage.py 可以告诉你这一点。 (2认同)

Ana*_*and 8

以下命令对我有用:

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

coverage report -m
Run Code Online (Sandbox Code Playgroud)

  • 对于其他遇到这个问题的人来说,请注意。自 2021 年和 Coverage v5.3.1 起,这是推荐的方法。 (4认同)
  • 我收到“没有要报告的数据。”;/ (2认同)