Skip to content

"Collecting" hangs forever if mark.parametrize is used with scope session or module  #12355

Closed
@adaasch

Description

@adaasch
  • a detailed description of the bug or problem you are having

If you parametrize a test function with several parameters with @mark.parametrize and set scope to "session" or "module" the collection step will take forever*. Debugging shows that _pytest/fixtures.py:fix_cache_order() is called repeatedly:

__hash__ (/usr/lib/python3.11/enum.py:1230)
fix_cache_order (.venv/lib/python3.11/site-packages/_pytest/fixtures.py:233)
reorder_items_atscope (.venv/lib/python3.11/site-packages/_pytest/fixtures.py:269)
reorder_items (.venv/lib/python3.11/site-packages/_pytest/fixtures.py:222)
pytest_collection_modifyitems (.venv/lib/python3.11/site-packages/_pytest/fixtures.py:1617)
_multicall (.venv/lib/python3.11/site-packages/pluggy/_callers.py:103)
_hookexec (.venv/lib/python3.11/site-packages/pluggy/_manager.py:120)
__call__ (.venv/lib/python3.11/site-packages/pluggy/_hooks.py:513)
perform_collect (.venv/lib/python3.11/site-packages/_pytest/main.py:814)
pytest_collection (.venv/lib/python3.11/site-packages/_pytest/main.py:349)
_multicall (.venv/lib/python3.11/site-packages/pluggy/_callers.py:103)
_hookexec (.venv/lib/python3.11/site-packages/pluggy/_manager.py:120)
__call__ (.venv/lib/python3.11/site-packages/pluggy/_hooks.py:513)
_main (.venv/lib/python3.11/site-packages/_pytest/main.py:338)
wrap_session (.venv/lib/python3.11/site-packages/_pytest/main.py:285)
pytest_cmdline_main (.venv/lib/python3.11/site-packages/_pytest/main.py:332)
_multicall (.venv/lib/python3.11/site-packages/pluggy/_callers.py:103)
_hookexec (.venv/lib/python3.11/site-packages/pluggy/_manager.py:120)
__call__ (.venv/lib/python3.11/site-packages/pluggy/_hooks.py:513)
main (.venv/lib/python3.11/site-packages/_pytest/config/__init__.py:178)
console_main (.venv/lib/python3.11/site-packages/_pytest/config/__init__.py:206)
<module> (.venv/lib/python3.11/site-packages/pytest/__main__.py:7)
_run_code (/usr/lib/python3.11/runpy.py:88)
_run_module_as_main (/usr/lib/python3.11/runpy.py:198)

*forever scales with the number of parameters.

  • output of pip list from the virtual environment you are using
Package                        Version   Editable project location
------------------------------ --------- ------------------------------------
aenum                          3.1.15
aiohttp                        3.9.3
aiosignal                      1.3.1
alabaster                      0.7.16
astroid                        3.1.0
attrs                          23.2.0
Babel                          2.14.0
bcrypt                         4.1.2
beautifulsoup4                 4.12.3
black                          23.12.1
build                          1.2.1
CacheControl                   0.14.0
certifi                        2024.2.2
cffi                           1.16.0
cfgv                           3.4.0
charset-normalizer             3.3.2
cleo                           2.1.0
click                          8.1.7
construct                      2.10.70
crashtest                      0.4.1
cryptography                   42.0.5
dill                           0.3.8
distlib                        0.3.8
docutils                       0.20.1
dulwich                        0.21.7
fastjsonschema                 2.19.1
filelock                       3.13.3
frozenlist                     1.4.1
furo                           2024.5.6
grpcio                         1.62.1
grpcio-tools                   1.62.1
identify                       2.5.35
idna                           3.6
imagesize                      1.4.1
importlib_metadata             7.1.0
iniconfig                      2.0.0
installer                      0.7.0
isort                          5.13.2
iterators                      0.2.0
jaraco.classes                 3.4.0
jeepney                        0.8.0
Jinja2                         3.1.3
keyring                        24.3.1
MarkupSafe                     2.1.5
mccabe                         0.7.0
more-itertools                 10.2.0
msgpack                        1.0.8
multidict                      6.0.5
mypy-extensions                1.0.0
nodeenv                        1.8.0
numpy                          1.26.4
opencv-contrib-python-headless 4.9.0.80
packaging                      24.0
paramiko                       3.4.0
paramiko-expect                0.3.5
pastel                         0.2.1
pathspec                       0.12.1
pexpect                        4.9.0
pip                            24.0
pkginfo                        1.10.0
platformdirs                   4.2.0
pluggy                         1.5.0
poethepoet                     0.25.1
poetry                         1.8.3
poetry-core                    1.9.0
poetry-plugin-export           1.8.0
pooch                          1.8.1
pre-commit                     3.7.0
protobuf                       4.25.3
ptyprocess                     0.7.0
pycparser                      2.22
pydocstyle                     6.3.0
Pygments                       2.17.2
pylint                         3.1.0
PyNaCl                         1.5.0
pyproject_hooks                1.1.0
pyright                        1.1.362
pytest                         8.2.1
pytest-reportportal            5.4.1
PyYAML                         6.0.1
rapidfuzz                      3.9.1
reportportal-client            5.5.6
requests                       2.31.0
requests-toolbelt              1.0.0
rstr                           3.2.2
SecretStorage                  3.3.3
setuptools                     69.2.0
shellingham                    1.5.4
snowballstemmer                2.2.0
soupsieve                      2.5
Sphinx                         7.3.7
sphinx-basic-ng                1.0.0b2
sphinx-rtd-theme               2.0.0
sphinxcontrib-applehelp        1.0.8
sphinxcontrib-devhelp          1.0.6
sphinxcontrib-htmlhelp         2.0.5
sphinxcontrib-jquery           4.1
sphinxcontrib-jsmath           1.0.1
sphinxcontrib-qthelp           1.0.7
sphinxcontrib-serializinghtml  1.1.10
timecode                       1.4.0
tomli                          2.0.1
tomlkit                        0.12.4
trove-classifiers              2024.5.17
urllib3                        2.2.1
virtualenv                     20.25.1
yarl                           1.9.4
zipp                           3.18.2
  • pytest and operating system versions

    • Linux 03b812391caf 5.10.0-29-amd64 SMP Debian 5.10.216-1 (2024-05-03) x86_64 GNU/Linux
    • Python 3.11.2
    • pytest 8.2.1
    • pytest 7.4.0
  • minimal example if possible

The issue is reproducible with pytest 7.4.0 and 8.2.1 with the following minimal example.

from pytest import mark

params = ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z')

@mark.parametrize(argnames=params, argvalues=[range(len(params))] * 3, scope="module")
def test_parametrize(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z):
    pass

Metadata

Metadata

Assignees

No one assigned

    Labels

    topic: fixturesanything involving fixtures directly or indirectlytopic: parametrizerelated to @pytest.mark.parametrizetype: performanceperformance or memory problem/improvement

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions