VSCode集成测试与mypy配置冲突问题求助
VSCode集成测试视图与pytest-mypy兼容问题

我们偏好VSCode集成测试工具,同时也青睐mypy,但二者无法兼容。当我们在pytest.ini中添加mypy参数,配置如下:
[pytest] pythonpath=./src addopts = -vvv --cov --cov-report=term-missing --cov-fail-under=100 --ignore=.vscode --mypy filterwarnings = ignore:.*pkg_resources.*:DeprecationWarning
集成测试视图会丢失——移除--mypy参数后一切正常,但添加该参数后,仅能看到一个setup.py测试(如图所示)。
在扩展主机输出中,我们发现了“Illegal argument: line must be non-negative”错误:
2023-12-21 17:15:52.561 [error] Error: Illegal argument: line must be non-negative at m (/Applications/Visual Studio Code.app/Contents/Resources/app/out/vs/workbench/api/node/extensionHostProcess.js:10:1101) at new f (/Applications/Visual Studio Code.app/Contents/Resources/app/out/vs/workbench/api/node/extensionHostProcess.js:137:4467) at forEach (/Users/samjoseph/.vscode/extensions/ms-python.python-2023.22.1/src/client/testing/testController/common/utils.ts:159:50) at Array.forEach (<anonymous>) at populateTestTree (/Users/samjoseph/.vscode/extensions/ms-python.python-2023.22.1/src/client/testing/testController/common/utils.ts:154:27) at forEach (/Users/samjoseph/.vscode/extensions/ms-python.python-2023.22.1/src/client/testing/testController/common/utils.ts:176:17) at Array.forEach (<anonymous>) at populateTestTree (/Users/samjoseph/.vscode/extensions/ms-python.python-2023.22.1/src/client/testing/testController/common/utils.ts:154:27) at forEach (/Users/samjoseph/.vscode/extensions/ms-python.python-2023.22.1/src/client/testing/testController/common/utils.ts:176:17) at Array.forEach (<anonymous>) at populateTestTree (/Users/samjoseph/.vscode/extensions/ms-python.python-2023.22.1/src/client/testing/testController/common/utils.ts:154:27) at t.PythonResultResolver._resolveDiscovery (/Users/samjoseph/.vscode/extensions/ms-python.python-2023.22.1/src/client/testing/testController/common/resultResolver.ts:60:25) at t.PythonResultResolver.resolveDiscovery (/Users/samjoseph/.vscode/extensions/ms-python.python-2023.22.1/src/client/testing/testController/common/resultResolver.ts:35:21) at f.value (/Users/samjoseph/.vscode/extensions/ms-python.python-2023.22.1/src/client/testing/testController/pytest/pytestDiscoveryAdapter.ts:22:80) at n.y (/Applications/Visual Studio Code.app/Contents/Resources/app/out/vs/workbench/api/node/extensionHostProcess.js:80:1902) at n.fire (/Applications/Visual Studio Code.app/Contents/Resources/app/out/vs/workbench/api/node/extensionHostProcess.js:80:2119) at t.PythonTestServer._fireDataReceived (/Users/samjoseph/.vscode/extensions/ms-python.python-2023.22.1/src/client/testing/testController/common/server.ts:83:43) at t.PythonTestServer._resolveData (/Users/samjoseph/.vscode/extensions/ms-python.python-2023.22.1/src/client/testing/testController/common/server.ts:65:22) at Socket.<anonymous> (/Users/samjoseph/.vscode/extensions/ms-python.python-2023.22.1/src/client/testing/testController/common/server.ts:28:54) at Socket.emit (node:events:513:28) at addChunk (node:internal/streams/readable:324:12) at readableAddChunk (node:internal/streams/readable:297:9) at Socket.Readable.push (node:internal/streams/readable:234:10) at TCP.onStreamRead (node:internal/stream_base_commons:190:23)
解决思路:
拆分mypy检查与测试发现流程:不要在
pytest.ini的addopts中全局添加--mypy,而是单独运行mypy检查。比如在VSCode中配置自定义任务(.vscode/tasks.json)执行mypy:{ "version": "2.0.0", "tasks": [ { "label": "mypy: 类型检查", "type": "shell", "command": "${config:python.pythonPath} -m mypy ./src", "problemMatcher": ["$mypy"], "group": "build" } ] }需要时手动运行该任务,或设置为保存时自动触发。
限制pytest-mypy的检查范围:在
pytest.ini中添加mypy专属配置,排除setup.py或不需要检查的文件,避免生成无效测试项干扰VSCode测试视图:[pytest] pythonpath=./src addopts = -vvv --cov --cov-report=term-missing --cov-fail-under=100 --ignore=.vscode filterwarnings = ignore:.*pkg_resources.*:DeprecationWarning [mypy] pythonpath = ./src exclude = setup.py这样即使保留
--mypy参数,pytest-mypy也不会处理setup.py,也就不会生成导致VSCode解析出错的测试项。更新相关组件版本:把VSCode的Python扩展(ms-python.python)和
pytest-mypy插件更新到最新版,这类兼容性问题通常会在后续版本中被修复:- 在VSCode扩展面板找到Python扩展点击更新
- 终端执行
pip install --upgrade pytest-mypy更新插件
临时规避方案:如果必须在测试命令中保留
--mypy,可以在VSCode设置中禁用测试视图的自动发现,改用终端手动运行pytest命令,或调整测试发现参数跳过mypy相关测试项。
内容的提问来源于stack exchange,提问作者Sam Joseph
相关产品推荐
相关产品推荐

