对coverage使用py.test不包括导入

2024-04-25 17:41:11 发布

您现在位置:Python中文网/ 问答频道 /正文

对于Jedi我们希望生成test coverage。stackoverflow中有一个related question,但没有帮助。

我们用py.test作为测试运行程序。但是,我们无法将导入和其他“导入”内容添加到报表中。例如,__init__.py总是报告为未覆盖:

Name                           Stmts   Miss  Cover
--------------------------------------------------
jedi/__init__                      5      5     0%
[..]

很明显,该文件正在导入,因此应报告为已测试。

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

py.test --cov jedi

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

那么,如何正确计算像__init__.py这样的文件的覆盖率呢?

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

我已经悬赏了。请试着在绝地内部修复它。它是公开的。


Tags: 文件pytest程序内容initpytest报告
3条回答

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

摆脱pytest-cov

使用

coverage run --source jedi -m py.test
coverage report

相反!!!这样,您就可以对当前的py.test配置运行一个覆盖,它工作得非常好!这也是哲学上正确的方法:让每个程序做好一件事-py.test运行测试并检查代码覆盖率。

这听起来像是在咆哮,但确实如此。pytest-cov已经有一段时间不能正常工作了。有些测试失败了,就因为我们用了它。


截至2014年,pytest cov似乎已经易手。py.test --cov jedi test似乎又是一个有用的命令(查看注释)。但是,你不需要使用它。但与xdist结合使用可以加快覆盖率报告的速度。

我通过简化导入依赖关系的this patch和命令将测试覆盖率固定为94%

py.test --cov jedi test                    # or
py.test --cov jedi test --cov-report=html  # + a listing with red uncovered lines

未覆盖的行只在条件命令或一些不太常用的函数中使用,但所有的头都被完全覆盖。

问题是,测试配置test/conftest.py确实是由依赖项提前导入的,几乎是项目中的所有文件。conftest文件还定义了在运行测试之前应该设置的其他命令行选项和设置。因此,如果pytest_cov插件忽略了与此文件一起导入的所有内容,我认为它可以正常工作,尽管这很痛苦。我也从报告中排除了__init__.pysettings.py,因为它们很简单,覆盖范围很广,但由于conftest的依赖性,它们也过早地被导入。

在我的例子中,所有的测试都在运行,但是覆盖率是0%。

解决方法是:

$ export PYTHONPATH="."

结果正确之后。

在过去,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 ======================================

结果覆盖率为0%。

然后我设置PYTHONPATH

$ export 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: 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 ======================================

现在是覆盖率90%。

警告:操纵PYTHONPATH可能会产生奇怪的副作用。目前我遇到的问题是,在构建可分发包时,基于pbr的包正在创建egg目录,如果PYTHONPATH设置为“.”,它会自动将与egg相关的包视为已安装。为此,我停止使用pytest-cov,而是按照建议使用coverage工具。

相关问题 更多 >