Repository navigation
Description
Type: Bug
Using pytest.HIDDEN_PARAM in parametrized tests causes pytest discovery to fail with a ValueError in the VS Code Python extension's test discovery mechanism.
Steps to reproduce:
- Create a test file with a parametrized test using
pytest.HIDDEN_PARAM:
import pytest
@pytest.mark.parametrize("setup", [pytest.param("setup", id=pytest.HIDDEN_PARAM)])
def test_main(setup) -> None:
assert True- Open the file in VS Code with the Python extension enabled
- Observe that pytest discovery fails
Diagnostic data
Output for Python in the Output panel (View→Output, change the drop-down the upper-right of the Output panel to Python)
pytest test discovery error for workspace: /tmp/test_pytest
Error Occurred, traceback: Traceback (most recent call last):
File "/home/tobi/.vscode-server/extensions/ms-python.python-2026.0.0/python_files/vscode_pytest/__init__.py", line 428, in pytest_sessionfinish
session_node: TestNode | None = build_test_tree(session)
~~~~~~~~~~~~~~~^^^^^^^^^
File "/home/tobi/.vscode-server/extensions/ms-python.python-2026.0.0/python_files/vscode_pytest/__init__.py", line 691, in build_test_tree
test_node = process_parameterized_test(
test_case, test_node, function_nodes_dict, file_nodes_dict
)
File "/home/tobi/.vscode-server/extensions/ms-python.python-2026.0.0/python_files/vscode_pytest/__init__.py", line 617, in process_parameterized_test
parent_part, parameterized_section = test_node["name"].split("[", 1)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
ValueError: not enough values to unpack (expected 2, got 1)
Extension version: 2026.0.0
VS Code version: Code 1.109.3 (b6a47e94e326b5c209d118cf0f994d6065585705, 2026-02-12T17:54:48.470Z)
OS version: Windows_NT x64 10.0.26200
Modes:
Remote OS version: Linux x64 5.15.153.1-microsoft-standard-WSL2
Remote OS version: Linux x64 5.15.153.1-microsoft-standard-WSL2
Remote OS version: Linux x64 5.15.153.1-microsoft-standard-WSL2
- Python version (& distribution if applicable, e.g. Anaconda): 3.11.11
- Type of virtual environment used (e.g. conda, venv, virtualenv, etc.): Venv
- Value of the
python.languageServersetting: Default
User Settings
languageServer: "Pylance"
testing
• pytestArgs: "<placeholder>"
• pytestEnabled: true
• unittestArgs: "<placeholder>"
experiments
• optInto: ["pythonTestAdapter"]
Installed Extensions
| Extension Name | Extension Id | Version |
|---|---|---|
| ansible | red | 26.1.3 |
| auto-commit-msg | Mic | 0.27.2 |
| autodocstring | njp | 0.6.1 |
| change-case | wma | 1.0.0 |
| code-spell-checker | str | 4.5.6 |
| color-highlight | nau | 2.8.0 |
| copilot-chat | Git | 0.37.6 |
| debugpy | ms- | 2025.18.0 |
| direnv | mkh | 0.17.0 |
| djlint | mon | 2025.11.0 |
| EditorConfig | Edi | 0.18.1 |
| even-better-toml | tam | 0.21.2 |
| gitignore | cod | 0.10.0 |
| gitlab-workflow | Git | 6.69.3 |
| gitlens | eam | 17.10.0 |
| gitlink | qez | 1.2.6 |
| go | gol | 0.52.2 |
| isort | ms- | 2025.0.0 |
| jinjahtml | sam | 0.20.0 |
| js-debug | ms- | 1.105.0 |
| jupyter | ms- | 2025.9.1 |
| jupyter-renderers | ms- | 1.3.0 |
| live-server | ms- | 0.4.17 |
| markdown-all-in-one | yzh | 3.6.3 |
| markdown-pdf | yza | 1.5.0 |
| markdowntable | Tak | 0.13.0 |
| marp-vscode | mar | 3.3.0 |
| mypy-type-checker | ms- | 2025.2.0 |
| oxc-vscode | oxc | 1.45.0 |
| pdminterpreter | Kal | 0.0.5 |
| plantuml | jeb | 2.18.1 |
| prettier-vscode | esb | 12.3.0 |
| python | ms- | 2026.0.0 |
| ruff | cha | 2026.36.0 |
| shellcheck | tim | 0.38.6 |
| tfsec | tfs | 1.11.0 |
| unique-window-colors | stu | 1.0.51 |
| vscode-containers | ms- | 2.4.1 |
| vscode-conventional-commits | viv | 1.27.0 |
| vscode-coverage-gutters | rya | 2.14.0 |
| vscode-django | bat | 1.15.0 |
| vscode-js-profile-table | ms- | 1.0.10 |
| vscode-jupyter-cell-tags | ms- | 0.1.9 |
| vscode-jupyter-slideshow | ms- | 0.1.6 |
| vscode-opentofu | ope | 0.6.0 |
| vscode-pylance | ms- | 2025.10.4 |
| vscode-python-envs | ms- | 1.16.0 |
| vscode-stylelint | sty | 2.0.2 |
| vscode-wakatime | Wak | 25.5.1 |
| vscode-yaml | red | 1.19.1 |
| vsliveshare | ms- | 1.0.5959 |
System Info
| Item | Value |
|---|---|
| CPUs | Intel(R) Core(TM) Ultra 7 165U (14 x 2688) |
| GPU Status | 2d_canvas: enabled GPU0: VENDOR= 0x8086, DEVICE=0x7d45 [Intel(R) Graphics], DRIVER_VENDOR=Intel, DRIVER_VERSION=32.0.101.7026 ACTIVE GPU1: VENDOR= 0x1414, DEVICE=0x008c [Microsoft Basic Render Driver], DRIVER_VERSION=10.0.26100.7309 Machine model name: Machine model version: direct_rendering_display_compositor: disabled_off_ok gpu_compositing: enabled multiple_raster_threads: enabled_on opengl: enabled_on rasterization: enabled raw_draw: disabled_off_ok skia_graphite: disabled_off trees_in_viz: disabled_off video_decode: enabled video_encode: enabled webgl: enabled webgl2: enabled webgpu: enabled webnn: disabled_off |
| Load (avg) | undefined |
| Memory (System) | 63.46GB (35.34GB free) |
| Process Argv | --folder-uri=vscode-remote://wsl+Ubuntu-24.04/home/tobi/projects/gitlab.energiekoppler.com/ek/software/ee-redispatch --remote=wsl+Ubuntu-24.04 |
| Screen Reader | yes |
| VM | 0% |
| Item | Value |
|---|---|
| Remote | WSL: Ubuntu-24.04 |
| OS | Linux x64 5.15.153.1-microsoft-standard-WSL2 |
| CPUs | Intel(R) Core(TM) Ultra 7 165U (14 x 0) |
| Memory (System) | 31.08GB (18.75GB free) |
| VM | 0% |
| Item | Value |
|---|---|
| Remote | WSL: Ubuntu-24.04 |
| OS | Linux x64 5.15.153.1-microsoft-standard-WSL2 |
| CPUs | Intel(R) Core(TM) Ultra 7 165U (14 x 0) |
| Memory (System) | 31.08GB (18.75GB free) |
| VM | 0% |
| Item | Value |
|---|---|
| Remote | WSL: Ubuntu-24.04 |
| OS | Linux x64 5.15.153.1-microsoft-standard-WSL2 |
| CPUs | Intel(R) Core(TM) Ultra 7 165U (14 x 0) |
| Memory (System) | 31.08GB (18.83GB free) |
| VM | 0% |
Extended Info
Root Cause
The issue is in the process_parameterized_test function at line 617 of vscode_pytest/__init__.py:
parent_part, parameterized_section = test_node["name"].split("[", 1)This code assumes that all parametrized tests have a [ character in their name (e.g., test_main[setup]). However, when using pytest.HIDDEN_PARAM, pytest intentionally omits the parameter brackets from the test ID, resulting in just test_main.
The .split("[", 1) call then returns a list with only one element (the test name without brackets), but the code tries to unpack it into two variables, causing the ValueError.
Suggested Fix
The process_parameterized_test function should check if the test name contains parameters before attempting to split:
if "[" in test_node["name"]:
parent_part, parameterized_section = test_node["name"].split("[", 1)
# Process parameterized test
else:
# Handle test without visible parameters (e.g., HIDDEN_PARAM)
parent_part = test_node["name"]
# Treat as non-parameterized or handle appropriatelyAdditional Context
pytest.HIDDEN_PARAMis a documented pytest feature for hiding parameter values from test IDs- This is particularly useful for fixture setup that shouldn't be visible in test names
- Command-line pytest handles this correctly; only VS Code discovery fails
- Extension logs show
collected 1 itembefore the error, suggesting pytest itself collected the test successfully
Workaround
Remove the use of pytest.HIDDEN_PARAM and use a regular string ID instead:
@pytest.mark.parametrize("setup", [pytest.param("setup", id="setup")])
def test_main(setup) -> None:
assert TrueHowever, this defeats the purpose of HIDDEN_PARAM and creates visible parameter IDs.
References
- pytest documentation on
HIDDEN_PARAM: https://docs.pytest.org/en/stable/reference/reference.html#pytest.HIDDEN_PARAM
Activity
eleanorjboyd commentedon Feb 18, 2026
will review thank you for the detailed issue!
dotnet18 commentedon Nov 5, 2026
Confirming this still happens on 2026.10.0 (VS Code 1.145.0, Windows 11 ARM64, Python 3.14.7, pytest 9.1.1).
It also affects more projects than explicit
pytest.HIDDEN_PARAMusers. pytest-asyncio 1.4 parametrizes every async test with a hidden ID when apytest_asyncio_loop_factorieshook returns a single factory, which is a common setup on Windows because psycopg's async mode needs the selector loop:Every async test then has a
callspecbut no[initem.name.process_parameterized_testcrashes on the first one, the whole tree is dropped, and the Testing view stays empty, whilepytest --collect-onlyworks fine.A guard at the top of
process_parameterized_testfixes it for me, so tests with hidden IDs are shown as plain tests:Happy to open a PR with this and a test if that helps.