-
-
Notifications
You must be signed in to change notification settings - Fork 2.9k
Description
Following an upgrade to Pytest 8, we are seeing a change in the way duplicate items are handled, which does not seem logical/expected to me.
Current behavior
Let's assume we have the following directory structure:
> tree tests
tests
├── subdirectory
│ └── test_two.py
└── test_one.py
With Pytest 7, if we call pytest test_one.py tests --collect-only
, it returns 3
tests:
============================= test session starts ==============================
platform linux -- Python 3.12.2, pytest-7.0.0, pluggy-1.4.0
rootdir: /home
collected 3 items
<Module tests/test_one.py>
<Function test_one>
<Module tests/test_one.py>
<Function test_one>
<Module tests/subdirectory/test_two.py>
<Function test_two>
With Pytest 8, we get only one:
============================= test session starts ==============================
platform linux -- Python 3.12.2, pytest-8.0.2, pluggy-1.4.0
rootdir: /home
collected 1 item
<Dir home>
<Dir tests>
<Module test_one.py>
<Function test_one>
After looking a bit at Pytest's internals, the change looks related to the refactoring done in #11646, where the duplicates handling logic was moved away from the former _collectfile
method (which, I guess, operate on a file-per-file basis), to be consolidated in genitems()
(in which a single duplicate in a node will result in the complete node being ignored).
Expected behavior
I would expect test_one.py
not to prevent the further collection of tests in subdirectory
, even though it's a duplicate.
To be honest, I'm also a bit puzzled by the previous behavior in Pytest 7, as I wouldn't have expected to see tests/test_one.py
twice (as I didn't pass the --keep-duplicates
option).
Are my expectations correct in the first place, or did I misunderstand the changes to the test collection and the behavior is expected?
Additional information
- With a bit of guidance, I would be willing to provide a patch (if it's a real bug of course 🙂)
- Reproduced on Pytest 8.0.2 / Linux & macOS
- I made a repository that contains a Dockerfile to reproduce the issue easily, please let me know if you need any additional details