python - Poetry 和 Pytest-cov with Sonar : how to reconcile the references?

标签 python sonarqube pytest python-poetry

我正在将所有模块迁移到 Poetry,但遇到了问题。

在使用 python setup.py 测试 之前,我能够使用正确的覆盖信息运行我的测试。

现在我要转向诗歌,所以我最好的选择是 poetry run pytestpoetry 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/

相关文章:

java - 如何配置 SonarCloud

python - 针对多个数据库版本运行 pytest 测试套件

Python multiprocessing.Process 行为不确定

python - 无法运行 'scrapy crawl quotes'

python - 在Python中使用多个正则表达式提取特定文本?

javascript - 如何降低函数的圈复杂度

SonarQube - 如何检测项目之间代码的复制粘贴?

python 将 beautifulsoup 输出转换为 dict/json

python - 为什么 python-selenium-webdriver 'quit' 不退出?

python - Py.test 收集阶段需要很长时间