我有一个python项目,我使用:
还有更多。
基本上,我想将tox添加到我的gitlab管道中。而且几乎所有的事情似乎都正常,打电话给mypy、flake8或black都很好。但是,当我调用tox -e py37 (所以我想要运行测试)并且启用覆盖时,测试就会运行,我可以看到它们的结果,但是覆盖率是0% (仅对空的__init__文件等等)。我收到警告:Coverage.py warning: No data was collected. (no-data-collected)。
这是我与tox.ini相关的最热的部分
[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,它包括所有需要的包:pytest、pytest-cov和更多的样式等等。我的__init__.py文件夹中也有tests。
有趣的是,如果我从命令行(在pipenv中)调用pipenv中相同的命令:pytest --cov -ra --tb=short,则得到相同的结果,但具有正常的覆盖率(在我的例子中是100%)。
有办法解决吗?我不想让我的管道显示错误的报道,即使它们神奇地得到了正确的报道,我还是想在本地看到它。
当我试图解决这个问题时,我用tox --sitepackages -e py37打电话给毒理科,发现了一些像test command found but not in testenv这样的错误。除了这些错误,我当时的报道也很好。但是后来我从我的全局pip寄存器中卸载了tox、pytest和pytest-cov,现在不管有没有--sitepackages标志,我仍然可以获得0%覆盖率。
发布于 2019-11-27 14:07:19
,根本原因是,运行期间的pytest使用已安装的源代码(在站点包下),而覆盖率报告者则计算工作目录中的命中文件(即。你当地的git回购)。
溶液
将tox的虚拟env路径添加到覆盖率中:
[testenv]
pytest --cov={envsitepackagesdir}/foo欲了解更多细节,请阅读虚拟环境相关部分的替换
工作-周密
将PYTHONPATH设置为工作目录(即。export PYTHONPATH=.)。注意,您需要通过以下方式将PYTHONPATH传递给tox:
[testenv]
passenv =
PYTHONPATH这很容易,但是使用这种方式,您不会测试安装,因为测试运行在工作目录中的文件上。
发布于 2021-10-06 09:17:20
平凡解
让usedevelop=True在tox.ini中:
[testenv]
usedevelop=True
pytest --cov=foo这会导致与@zvi-baratz的解决方案相同的行为,但不那么烦躁。
警告
这里唯一的警告是,如果包具有自定义install_command,则不能使用该解决方案。有关更多信息,请查看文档。
如果是这样的话,您可以使用--cov={envsitepackagesdir}/foo作为一个工作-绕过。
为什么不一直使用envsitepackagesdir呢?
因为它导致覆盖率报告具有更长的路径,指向由tox创建的python环境中的文件,而不是实际的项目路径。
发布于 2021-06-08 15:31:34
基于@betontalpfa的回答,我认为另一个可能的解决方案(在我的用例中似乎很有效)是修改tox.ini以包括:
[testenv]
deps = -e .
...AFAIK,通过使用pip的可编辑模式在工作目录中安装包,您可以测试已安装的包并避免文件路径不匹配导致0%的覆盖率评分。
https://stackoverflow.com/questions/58696476
复制相似问题