有报道使用py.test不包括进口(Using py.test with coverage does

2019-09-02 02:59发布

对于绝地我们要生成我们的测试覆盖率 。 还有一个相关的问题在计算器,但它并没有帮助。

我们使用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 。 无论他们的工作。

我提供了一个赏金。 请尽量在绝地解决它。 这是公开的。

Answer 1:

@hynekcer给了我正确的想法。 但基本上是最简单的解决办法是在其他地方:

摆脱pytest-cov

使用

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

代替!!! 这样,你只是你目前的py.test配置,这工作完全正常运行的范围! 这也是哲学上以正确的方式去:让每个程序做好一两件事- py.test运行测试,并coverage检查代码覆盖率。

现在,这听起来像一个咆哮,但真的。 pytest-cov至今尚未正常工作了一段时间。 有些测试是失败,只是因为我们使用它。


截至2014年 ,pytest冠状病毒似乎已经转手。 py.test --cov jedi test似乎再次有用的命令(看注释)。 但是,你并不需要使用它。 但结合xdist它可以加快你的覆盖报告。



Answer 2:

我固定测试覆盖率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从报告中,因为它们是简单的,并与全覆盖,但他们也REWE在conftest的依赖进口过早。



Answer 3:

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

整个解决方案:

$ export PYTHONPATH="."

后的结果是正确的。

我曾在过去几年的问题py.test命令有问题进口的东西,并设置PYTHONPATH的环境变量中的解决方案。 它的工作对我来说这个时间太长。

我用真实的例子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建设分配时,根据包创建鸡蛋目录,如果PYTHONPATH设置为“”,它会自动为安装认为鸡蛋相关的包。 出于这个原因,我停止使用pytest-cov ,并按照建议使用coverage工具来代替。



Answer 4:

我有这个问题与py.test,覆盖范围和Django的插件。 显然覆盖开始之前的模型文件导入。 甚至没有“-p覆盖”的覆盖面,插件的早期加载工作。

我固定它(丑吗?)从sys.modules中移除模型模块,并重新导入它在测试模型的测试文件:

import sys
del sys.modules['project.my_app.models']
from project.my_app import models

def test_my_model():
  ...


文章来源: Using py.test with coverage doesn't include imports