是否可以从 coverage.py 报告中排除测试目录?

Posted

技术标签:

【中文标题】是否可以从 coverage.py 报告中排除测试目录?【英文标题】:Is it possible exclude test directories from coverage.py reports? 【发布时间】:2010-12-10 09:11:27 【问题描述】:

我是 python 单元测试的菜鸟,尤其是 coverage.py。是否希望覆盖率报告包含实际测试文件的覆盖率?

这里以我的html report 截图为例。

您可以看到该报告包含tests/test_credit_card。起初我试图从报告中省略 tests/ 目录,如下所示:

coverage html --omit=tests/ -d tests/coverage

我尝试了该命令的几种变体,但我可以在我的一生中获得测试/排除。接受失败后,我开始怀疑测试文件是否应该包含在报告中。

任何人都可以对此有所了解吗?

【问题讨论】:

我遇到了类似的问题。我不想在覆盖报告中出现额外的 python 文件(标准库等)。我最终将它们从 XML 中剥离出来:***.com/questions/2293647/… 【参考方案1】:

coverage html --omit="*/test*" -d tests/coverage

【讨论】:

只需添加:可以使用逗号添加多个目录/文件,例如--omit="*/test*,config/*.conf" 应该是评分最高的答案。没有人想创建覆盖配置文件【参考方案2】:

在您的项目根文件夹中创建.coveragerc 文件,并包含以下内容:

[run]
omit = *tests*

【讨论】:

@CynthiaSimiyu,你的回答真的很有帮助,因为我需要省略多个目录。 @lmiguelvargasf : 省略选项是 multi-string,因此您可以枚举多个要省略的目录(参见 doc 中的示例)【参考方案3】:

如果任何 Django 开发人员需要一个 .coveragerc 用于他的项目,请留在这里。

[run]
source = .
omit = ./venv/*,*tests*,*apps.py,*manage.py,*__init__.py,*migrations*,*asgi*,*wsgi*,*admin.py,*urls.py

[report]
omit = ./venv/*,*tests*,*apps.py,*manage.py,*__init__.py,*migrations*,*asgi*,*wsgi*,*admin.py,*urls.py

在您的项目根目录中创建一个名为 .coveragerc 的文件,粘贴上面的代码,然后运行命令:

coverage run manage.py test

此外,如果您希望测试执行得更快,请改为运行此命令。

coverage run manage.py test --keepdb --parallel

这将保留测试数据库并并行运行测试。

【讨论】:

如果您使用的是 Django,请使用此答案,.converagerc 中的省略行会从覆盖范围中删除所有样板 当您说“项目根目录”时,您的意思是 manage.py 位于何处,甚至位于其之上?【参考方案4】:

您可以通过在项目根目录中创建.coveragerc 来指定要排除的目录。

它支持通配符(可用于排除虚拟环境) cmets(对于有效跟踪非常有用)。

下面的代码块显示了如何将omit 与多个文件和目录一起使用(取自latest documentation)。

[run]
omit =
    # omit anything in a .local directory anywhere
    */.local/*
    # omit everything in /usr
    /usr/*
    # omit this single file
    utils/tirefire.py

在您的情况下,您的.coveragerc 中可能包含以下内容:

[run]
omit = 
    # ignore all test cases in tests/
    tests/*

对于覆盖率报告的问题,您可以通过以下方式考虑测试和覆盖率:

当您运行pytestunittest 时,您的源代码的所有测试用例都会执行

当您运行coverage 时,它会显示未使用的源代码部分。

当您使用覆盖率运行 pytest(类似于 pytest -v --cov)时,它会运行所有测试用例显示未使用的源代码部分。

额外

您还可以在配置文件中指定 HTML 报告的位置,例如:
[html]
directory = tests/coverage/html_report/

这将在每次运行coverage 或@987654334 时在tests/coverage/html_report/ 内创建htmljscss 等@

【讨论】:

您必须在省略 **/tests/* 时指定忽略嵌套的测试文件夹。 我不确定是否需要前导 /,因为 .coveragerc 已经在项目根目录中【参考方案5】:

您还可以明确指定要覆盖的代码所在的目录,而不是说要省略哪些内容。在.coveragerc 文件中,如果感兴趣的目录称为demo,则如下所示

[run]
source = demo

【讨论】:

以上是关于是否可以从 coverage.py 报告中排除测试目录?的主要内容,如果未能解决你的问题,请参考以下文章

从 coverage.py 运行测试与从测试运行器运行覆盖

在 Python coverage.py API 中使用省略标志

如何解释 Python coverage.py 分支覆盖结果?

如何从android项目中的jacoco测试覆盖率报告中排除方法

Coverage.py 不会发现子目录中没有 init.py 文件的测试

从 Android 发布前报告中禁用 Google Analytics