我正在将所有模块迁移到 Poetry,但遇到了问题。
在使用 python setup.py 测试
之前,我能够使用正确的覆盖信息运行我的测试。
现在我要转向诗歌,所以我最好的选择是 poetry run pytest
或 poetry install;测试
。在这两种情况下,我都必须在 Sonar 中指定源位置以收集覆盖数据。在这里,我自然会只传递我的 src
文件夹,但显然引用是错误的,因为 pytest 正在使用 poetry 安装在环境中的代码运行,而不是像以前那样在本地代码上运行,所以引用将不匹配。似乎再多的修补也无济于事。
那么,在使用 pytest 运行时,有没有办法使用 poetry 来使用本地引用而不是环境引用?或者我应该放弃并使用 inspect
一些奇怪的技巧来检索 site-packages
文件夹中已安装包的路径?
最佳答案
您当前的设置中,pytest
是针对已安装的包而不是源文件运行的,这是非常可取的,因为它模拟了代码在使用中的行为。路径错误、未正确标记/移动以进行安装的文件或任何其他在部署过程中可能出错的问题都将立即免费处理。
它还有助于提供更准确的覆盖范围,例如任何不属于包的构建文件都将被忽略。为了告诉 coverage
查看包而不是源文件,您需要做的就是准确地告诉它。在你的 .coveragerc
中包含这个应该足够了:
[run]
source = sample_project
给定这样的项目结构[1]
.
├── .coveragerc
├── src
│ └── sample_project
│ ├── __init__.py
│ └── util.py
└── tests
├── __init__.py
└── test_util.py
运行 pytest --cov tests/
正确查看已安装包的内部:
Test session starts (platform: linux, Python 3.7.2, pytest 3.10.1, pytest-sugar 0.9.2)
rootdir: /home/user/dev/sample_project, inifile:
plugins: sugar-0.9.2, cov-2.7.1
collecting ...
tests/test_util.py ✓ 100% ██████████
----------- coverage: platform linux, python 3.7.2-final-0 -----------
Name Stmts Miss Cover
----------------------------------------
tests/__init__.py 0 0 100%
tests/test_util.py 6 0 100%
----------------------------------------
TOTAL 6 0 100%
Results (0.10s):
1 passed
[1] 分离目录中的源代码以避免名称阴影可能很重要(导入机制将更喜欢其 PYTHONPATH 中的本地包 foo,工作目录始终是其中的一部分在已安装的软件包 foo 上)。从你的描述来看,你似乎已经在这样做了。如果不是,请考虑使用 poetry new 并启用其可选的 --src 标志再次设置您的项目。
关于python - Poetry 和 Pytest-cov with Sonar : how to reconcile the references?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57158690/