`py.test` and `__init__.py` files
pytest, python, unit-testing
Solution
Looks like py.test is using `py._path.pyimport` to open your file. If there is a `__init__.py` file in the directory, it treats your file as a module, otherwise it opens the file. Long story short, delete the `__init__.py` or put your tests in another directory outside your project code (<--- good idea).
https://py.readthedocs.io/en/latest/path.html#py._path.local.LocalPath.pyimport
Problem
I thought `py.test` is "standalone" in a sense that it treats `test_*.py` files "as it is", and only imports modules specified in these files, with no respect to any surrounding files. It looks like I'm wrong. Here is my dialog with `py.test`: ``` $ ls __init__.py test_pytest.py $ cat __init__.py $ cat test_pytest.py def test_pytest(): assert True $ py.test test_pytest.py ========================================================= test session starts ========================================================== platform darwin -- Python 2.7.2 -- pytest-2.1.3 collected 0 items / 1 errors ================================================================ ERRORS ================================================================ ___________________________________________________ ERROR collecting test_pytest.py ____________________________________________________ /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/py-1.4.5-py2.7.egg/py/_path/local.py:529: in pyimport > mod = __import__(modname, None, None, ['__doc__']) E ImportError: No module named test_pytest ======================================================= 1 error in 0.01 seconds ======================================================== $ rm __init__.py $ py.test test_pytest.py ========================================================= test session starts ========================================================== platform darwin -- Python 2.7.2 -- pytest-2.1.3 collected 1 items test_pytest.py . ======================================================= 1 passed in 0.01 seconds ======================================================= $ ``` How do I make `py.test` work and still have my `__init__.py` files? UPDATE In comments, Holger Krekel asked, what is the name of parent directory. And it turns out that I can reproduce the error above only having a certain parent directory name (e.g. the same name as one of the packages installed, like `distutils`). See here: ``` ~/test_min $ tree . └── distutils ├── __init__.py └── test_pytest.py 1 directory, 2 files ~/test_min $ cat distutils/__init__.py ~/test_min $ cat distutils/test_pytest.py def test_pytest(): assert True ~/test_min $ py.test distutils/test_pytest.py ======================== test session starts ========================= platform darwin -- Python 2.7.2 -- pytest-2.1.3 collected 0 items / 1 errors =============================== ERRORS =============================== _____________ ERROR collecting distutils/test_pytest.py ______________ /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/py-1.4.5-py2.7.egg/py/_path/local.py:529: in pyimport > mod = __import__(modname, None, None, ['__doc__']) E ImportError: No module named test_pytest ====================== 1 error in 0.01 seconds ======================= ~/test_min $ rm distutils/__init__.py ~/test_min $ py.test distutils/test_pytest.py ======================== test session starts ========================= platform darwin -- Python 2.7.2 -- pytest-2.1.3 collected 1 items distutils/test_pytest.py . ====================== 1 passed in 0.01 seconds ====================== ~/test_min $ touch __init__.py ~/test_min $ ls __init__.py distutils ~/test_min $ touch distutils/__init__.py ~/test_min $ py.test distutils/test_pytest.py ======================== test session starts ========================= platform darwin -- Python 2.7.2 -- pytest-2.1.3 collected 1 items distutils/test_pytest.py . ====================== 1 passed in 0.02 seconds ====================== ~/test_min $ rm __init__.py ~/test_min $ py.test distutils/test_pytest.py ======================== test session starts ========================= platform darwin -- Python 2.7.2 -- pytest-2.1.3 collected 0 items / 1 errors =============================== ERRORS =============================== _____________ ERROR collecting distutils/test_pytest.py ______________ /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/py-1.4.5-py2.7.egg/py/_path/local.py:529: in pyimport > mod = __import__(modname, None, None, ['__doc__']) E ImportError: No module named test_pytest ====================== 1 error in 0.01 seconds ======================= ~/test_min $ mv distutils foobar ~/test_min $ py.test foobar/test_pytest.py ======================== test session starts ========================= platform darwin -- Python 2.7.2 -- pytest-2.1.3 collected 1 items foobar/test_pytest.py . ====================== 1 passed in 0.01 seconds ====================== ~/test_min $ ``` Hope this additional information will help.