我有一个在相当大的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
我知道我有点晚了(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。在最好的情况下,测试可以增强我们的信心:代码在很多重要场景下是可以正常工作的。 对待测程序执行的测试的程度称为测试的覆盖率。测试覆盖率并不能量化——即使最简单的程序的动态也是难以精确测量的——但是有启发式方法