将py.test与coverage一起使用不包括导入

Dav*_*ter 42 python coverage.py pytest

对于Jedi,我们想要生成我们的测试覆盖率.stackoverflow中有一个相关的问题,但它没有帮助.

我们使用py.test作为测试运行器.但是,我们无法将导入和其他"导入"内容添加到报表中.例如__init__.py,始终报告为未被发现:

Name                           Stmts   Miss  Cover
--------------------------------------------------
jedi/__init__                      5      5     0%
[..]
Run Code Online (Sandbox Code Playgroud)

显然,此文件正在导入,因此应报告为已测试.

我们开始这样的测试[*]:

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

如你所见,我们正在使用pytest-coverage.

那么如何正确计算文件的覆盖范围__init__.py呢?

[*]我们还尝试在没有--doctest-modules(从中删除pytest.ini)的情况下启动测试并在之前激活覆盖模块py.test -p pytest_cov --cov jedi.它们都不起作用.

我提供了赏金.请尝试在Jedi内修复它.它是公开的.

Dav*_*ter 70

@hynekcer给了我正确的想法.但基本上最简单的解决方案就在于其他地方:

摆脱pytest-cov!

使用

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

代替!!!这样你就可以在你当前的py.test配置上运行一个覆盖,这完全没问题!它在哲学上也是正确的方法:让每个程序做好一件事 - py.test运行测试并coverage检查代码覆盖率.

现在这可能听起来像是一个咆哮,但真的.pytest-cov暂时没有正常工作.有些测试失败了,只是因为我们使用过它.


截至2014年,pytest-cov似乎已经易手.py.test --cov jedi test似乎再次是一个有用的命令(看看评论).但是,您不需要使用它.但结合xdist它可以加快您的报道速度.

  • @schlamar:问题是:如果上面的命令工作得很好,为什么我们甚至需要一个`pytest-cov`包? (3认同)
  • 有一个pytest-cov的开发版本可以正确收集conftest的覆盖范围:https://github.com/schlamar/pytest-cov/pull/4。对抗jedi看起来不错:https://gist.github.com/schlamar/7722c21c3f2f1b97c920。请随时提交其他问题(我刚刚开始维护此软件包)。 (2认同)
  • 支持xdist,可将测试持续时间减少近50%:https://gist.github.com/schlamar/7722c21c3f2f1b97c920#file-gistfile2-txt +更少的键入和记住命令 (2认同)

hyn*_*cer 8

通过此修补程序将测试覆盖率修复为94%,从而简化了导入依赖性并通过以下命令:

py.test --cov jedi test                    # or
py.test --cov jedi test --cov-report=html  # + a listing with red uncovered lines
Run Code Online (Sandbox Code Playgroud)

未覆盖的行仅在条件命令或一些较少使用的函数中,但所有标题都被完全覆盖.

问题是测试配置test/conftest.py确实过早依赖项目中的所有文件的依赖项导入.conftest文件还定义了在运行测试之前应设置的其他命令行选项和设置.因此,我认为如果pytest_cov插件忽略了与此文件一起导入的所有内容,那么pytest_cov插件可以正常工作,尽管这很痛苦.我也被排除在外__init__.py,并settings.py在报告中,因为它们是简单的,并与全覆盖,但他们也REWE在conftest的依赖进口过早.


Jan*_*sky 5

就我而言,所有测试都在运行,但覆盖率为0%。

解决方法是:

$ export PYTHONPATH="."
Run Code Online (Sandbox Code Playgroud)

之后结果是正确的。

在过去的py.test命令中,我遇到了一些问题,即无法导入某些东西,而设置PYTHONPATHenv var是解决方案。这次也对我有用。

我的真实例子 awslogs

首先未PYTHONPATH设置:

$ py.test --cov=awslogs  tests/
========================================= test session starts =========================================
platform linux2 -- Python 2.7.9, pytest-2.8.5, py-1.4.31, pluggy-0.3.1
rootdir: /home/javl/sandbox/awslogs/github/awslogs, inifile:
plugins: cov-2.2.0
collected 11 items

tests/test_it.py ...........Coverage.py warning: No data was collected.

--------------------------- coverage: platform linux2, python 2.7.9-final-0 ---------------------------
Name                    Stmts   Miss  Cover
-------------------------------------------
awslogs/__init__.py         2      2     0%
awslogs/bin.py             85     85     0%
awslogs/core.py           143    143     0%
awslogs/exceptions.py      12     12     0%
-------------------------------------------
TOTAL                     242    242     0%

====================================== 11 passed in 0.38 seconds ======================================
Run Code Online (Sandbox Code Playgroud)

结果覆盖率为0%。

然后我设置PYTHONPATH

$ export PYTHONPATH="."
Run Code Online (Sandbox Code Playgroud)

并重新运行测试:

$ py.test --cov=awslogs  tests/
========================================= test session starts =========================================
platform linux2 -- Python 2.7.9, pytest-2.8.5, py-1.4.31, pluggy-0.3.1
rootdir: /home/javl/sandbox/awslogs/github/awslogs, inifile:
plugins: cov-2.2.0
collected 11 items

tests/test_it.py ...........
--------------------------- coverage: platform linux2, python 2.7.9-final-0 ---------------------------
Name                    Stmts   Miss  Cover
-------------------------------------------
awslogs/__init__.py         2      0   100%
awslogs/bin.py             85      9    89%
awslogs/core.py           143     12    92%
awslogs/exceptions.py      12      2    83%
-------------------------------------------
TOTAL                     242     23    90%

====================================== 11 passed in 0.44 seconds ======================================
Run Code Online (Sandbox Code Playgroud)

现在是覆盖率90%。

警告:操作PYTHONPATH会产生奇怪的副作用。目前,我遇到一个问题,该pbr基础软件包在构建可分发文件时会创建egg目录,如果PYTHONPATH将其设置为“。”,它将自动将与卵相关的软件包视为已安装。因此,我停止使用pytest-cov并按照建议使用coverage工具。