毒0%覆盖

我有一个使用的python项目:

  • pipenv
  • 毒物
  • pytest

还有更多

基本上,我想将tox添加到我的gitlab管道中。几乎所有东西似乎都可以正常工作,从毒药中调用mypyflake8black可以正常工作。但是,当我在启用覆盖率的情况下致电tox -e py37(因此我想运行测试)时,运行了测试,我可以看到其结果,但是覆盖率是0%100%仅在空的__init__文件等),我得到警告:Coverage.py warning: No data was collected. (no-data-collected)

这是我与tox.ini的pytest相关的部分:

[tox]
envlist = flake8,mypy,black,py37

[testenv]
extras = tests
commands=
    pytest --cov -ra --tb=short {posargs}

这是我的.coveragerc

[run]
branch = True
source =
    foo

omit = 
    foo/__init__.py
    foo/__main__.py
    foo/bar/__init__.py
    foo/baz/__init__.py

[report]
exclude_lines =
    pragma: no cover
    if __name__ == .__main__.
show_missing = True

我有一个工作的setup.py,其中包括所有必需的软件包:pytestpytest-cov,还有更多用于样式等的软件包(有效)。我的__init__.py文件夹中也有tests

有趣的是,如果我从命令行(在tox.ini中调用pipenv中具有的相同命令:pytest --cov -ra --tb=short,则得到相同的结果,但覆盖范围正常(在我的情况下是100%)。

有没有办法解决?我不希望我的管道显示错误的覆盖范围,即使它们以某种方式神奇地得到了正确的覆盖范围,我仍然希望在本地看到它。

P.S当我尝试解决此问题时,我用tox --sitepackages -e py37打电话给tox,但遇到了类似test command found but not in testenv的错误。除了这些错误,我的报道还不错。但是后来我从全局pip寄存器中卸载了toxpytestpytest-cov,现在无论是否带有--sitepackages标志,我仍然可以获得0%的覆盖率

tangdandang 回答:毒0%覆盖

根本原因是在运行pytest期间tox使用已安装的源(在站点程序包下),而覆盖率报告程序在工作目录中计算命中文件(即您本地的git repo)。


解决方案

将Tox的虚拟环境路径添加到覆盖范围:

[testenv]
pytest --cov={envsitepackagesdir}/foo

有关更多详细信息,请阅读substitutions for virtualenv-related sections


解决方法

PYTHONPATH设置为工作目录(即export PYTHONPATH=.)。请注意,您需要通过以下方式将PYTHONPATH传递到tox

[testenv]
passenv =
    PYTHONPATH

这很容易,但是使用这种方式,您无需测试安装,因为测试是在工作目录中的文件上运行的。

,

基于@betontalpfa 的回答,我认为另一种可能的解决方案(在我的用例中似乎运行良好)是修改 tox.ini 以包括:

[testenv]
deps = -e .
...

AFAIK,通过使用 pip 的可编辑模式在工作目录中安装包,您可以测试已安装的包并避免文件路径不匹配导致 0% 覆盖率得分。

本文链接:https://www.f2er.com/3165613.html

大家都在问