Issue 45864: unittest does not discover tests in PEP420 packages (original) (raw)
unittest's test discovery does not descend into directories without __init__.py
. This avoids discovering test modules that are otherwise valid and importable, after PEP 420.
I've seen this more than once where there were valid looking test files not being discovered, and they bit rot. The tests had been run individually when created but never again.
(I created flake8-no-pep420 to avoid this problem on my projects.)
For example, take this directory structure:
$ tree
.
└── tests
└── test_thing.py
1 directory, 1 file
$ cat tests/test_thing.py
1/0
It's valid to import the naughty file, which crashes:
$ python -c 'import tests.test_thing'
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/.../tests/test_thing.py", line 1, in <module>
1/0
ZeroDivisionError: division by zero
But unittest does not discover it:
$ python -m unittest
----------------------------------------------------------------------
Ran 0 tests in 0.000s
OK
But, after creating an empty __init__.py
, the tests doth fail:
$ touch tests/__init__.py
$ python -m unittest
E
======================================================================
ERROR: tests.test_thing (unittest.loader._FailedTest)
----------------------------------------------------------------------
ImportError: Failed to import test module: tests.test_thing
Traceback (most recent call last):
File "/.../unittest/loader.py", line 436, in _find_test_path
module = self._get_module_from_name(name)
File "/.../unittest/loader.py", line 377, in _get_module_from_name
__import__(name)
File "/.../tests/test_thing.py", line 1, in <module>
1/0
ZeroDivisionError: division by zero
----------------------------------------------------------------------
Ran 1 test in 0.000s
FAILED (errors=1)