当前位置: 首页 > 知识库问答 >
问题:

Pytest和覆盖率:为什么覆盖率结果随目录结构而变化?

张茂勋
2023-03-14

我有一个在相当大的django项目上使用Pytest的工作测试套件。问题是我无法实现适当的结果使用覆盖,我想知道这是否可能是因为项目目录结构。

考虑以下目录树示例:

.
├── apps
│   ├── api
│   │   ├── __init__.py
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   └── views
│   │   │       ├── __init__.py
│   │   │       └── test_tickets.py
│   │   └── views
│   │       ├── __init__.py
│   │       ├── tickets.py
│   ├── support
│   │   ├── __init__.py
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   └── utils
│   │   │       ├── __init__.py
│   │   │       ├── test_management_commands.py
│   │   ├── utils
│   │   │   ├── __init__.py
│   │   │   ├── management_commands.py

以及覆盖报告的示例输出:

coverage run --source apps/ -m py.test apps/
coverage report

Name                                        Stmts   Miss  Cover
---------------------------------------------------------------
apps/api/views/tickets.py                      42     18    57%
apps/support/utils/management_commands.py     135    100    26%    

查看html报告,我可以看到许多由测试执行的语句没有被认为是覆盖的,尽管它们应该被覆盖。我认为这个覆盖数据是不完整的,它似乎只考虑了导入、定义和文档字符串作为覆盖。

无法确定覆盖率出现错误的原因,我尝试运行单个测试模块,结果是肯定的:

coverage run --source apps/support/utils/management_commands.py -m py.test apps/support/tests/utils/test_management_commands.py
coverage report

Name                                        Stmts   Miss  Cover
---------------------------------------------------------------
apps/support/utils/management_commands.py     135     68    50%

更准确的是,HTML报告显示了我测试过的语句,这一次已经涵盖了这些语句。无法理解为什么运行单个测试模块会产生准确的结果,我修改了目录结构,将测试移动到单个父文件夹下。

.
├── apps
│   ├── api
│   │   ├── __init__.py
│   │   └── views
│   │       ├── __init__.py
│   │       ├── tickets.py
│   ├── support
│   │   ├── __init__.py
│   │   ├── utils
│   │   │   ├── __init__.py
│   │   │   ├── management_commands.py
├── tests
│   │   ├── __init__.py
│   ├── api
│   │   ├── __init__.py
│   │   └── views
│   │       ├── __init__.py
│   │       └── test_tickets.py
│   ├── support
│   │   ├── __init__.py
│   │   ├── utils
│   │   │   ├── __init__.py
│   │   │   ├── test_management_commands.py

使用此目录结构重新运行覆盖会产生更准确的结果:

coverage run --source apps/ -m py.test tests/
coverage report

Name                                        Stmts   Miss  Cover
---------------------------------------------------------------
apps/api/views/tickets.py                      42      0   100%
apps/support/utils/management_commands.py     135     68    50%

有人能解释为什么用py.test运行覆盖在原始目录结构下会产生完全覆盖吗?目录结构实际上是问题还是我在这里错过了其他东西?

附加信息:

# pytest.ini
[pytest]
addopts = --nomigrations
markers =
    slowtest: mark a test as being slow
    integration: mark a test as being an integration test

INSTALLED_APPS += ('django_coverage', )
TEST_DISCOVER_PATTERN = 'test_*'
COVERAGE_MODULE_EXCLUDES = [
    'settings',
    'urls$',
    'locale$',
    'tests$',
    'django',
    'migrations',
    'compressor',
    'templates?$',
    'fixtures$',
    'static$',
]
ROOT_PATH = os.path.abspath('%s/' % os.path.dirname(__file__))

这个掩护

[run]
source = apps
omit =
     apps/*/templates?/*
     apps/*/migrations/*
     apps/*/factories/*
     apps/*/tests/*
[html]
directory = coverage

模块版本(有些可能不相关):

pytest==2.9.0
pytest-cov==2.2.1
pytest-django==2.9.1
django-coverage==1.2.4
coverage==4.0.3

共有1个答案

晏富
2023-03-14

我知道我有点晚了(3年前的问题,还没有被接受的答案),但是因为我刚刚有了同样的问题,并且有了一个看似显而易见的答案:覆盖率只会报告实际运行的代码。因此,如果您的测试没有调用一点代码,并且它在应用程序的正常加载过程中没有运行,覆盖率将不会显示该代码的报告。不运行的代码不会导致错误:)

 类似资料:
  • 我正在使用来衡量我的测试的代码覆盖率。我已经启用了分支机构覆盖,但我不能完全理解该报告。 没有分支保险,我得到100%的保险: 启用分支覆盖: 有问题的来源可以在这里找到。 <代码>21- 然而,<代码>53-

  • 问题内容: 我正在使用Cobertura进行代码覆盖率分析。如果我在詹金斯(Jenkins)中运行构建,则覆盖范围结果中将包含其中的类,但覆盖率为 0% 。如果我在工作区(Eclipse)中运行代码覆盖率,则覆盖率会更高。包装的覆盖范围还可以。我错过了一些配置吗? 我的项目结构如下: 我的cobertura配置在POM文件中: 问题答案: 生成的代码不应进行测试,并且不应在代码覆盖率指标中使用。原

  • 面对使用覆盖率运行pytest时出现的问题,我已经浏览了SO帖子,但无法解决此问题,我相信我在这里遗漏了一些东西。。 获取以下错误,其中用户是我项目的应用程序 我的测试。ini文件内容 [pytest]DJANGO_设置_模块=cloudstack。设置 python\u文件=测试。py测试*。py*\u测试。py addopts=-v--ignore=venv--cov=--cov报告=html

  • 我正在用pytest--cov测试我的代码,但是我的一个模块得到了0%的覆盖率。 该模块有一个类声明: 该测试执行以下操作: 测试覆盖率为0%-我做错了什么?

  • 这是一个重要的可量化指标,如果代码覆盖率很高,你就可以放心的修改代码,在发版本的时候也能睡个安稳觉。否则就是拆东墙补西墙,陷入无尽的 bug 诅咒中。 那么在 OpenResty 里面如何看到代码覆盖率呢?其实很简单,使用 LuaCov 可以很方便的实现。 我们先了解下 LuaCov,这是一个针对 Lua 脚本的代码覆盖率工具,通过 luarocks 来安装: luarocks install l

  • 11.3. 测试覆盖率 就其性质而言,测试不可能是完整的。计算机科学家Edsger Dijkstra曾说过:“测试能证明缺陷存在,而无法证明没有缺陷。”再多的测试也不能证明一个程序没有BUG。在最好的情况下,测试可以增强我们的信心:代码在很多重要场景下是可以正常工作的。 对待测程序执行的测试的程度称为测试的覆盖率。测试覆盖率并不能量化——即使最简单的程序的动态也是难以精确测量的——但是有启发式方法