Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Test discovery failure when tests in different directories are called the same

Using py.test, two tests called the same in different directory causes py.test to fail. Why is that? How can I change this without renaming all the tests?

To duplicate do:

; cd /var/tmp/my_test_module ; mkdir -p ook/test            ; mkdir -p eek/test ; touch ook/test/test_proxy.py ; touch eek/test/test_proxy.py ; py.test ============================= test session starts ============================== platform linux2 -- Python 2.7.3 -- pytest-2.2.4 collected 0 items / 1 errors   ==================================== ERRORS ==================================== ___________________ ERROR collecting ook/test/test_proxy.py ____________________ import file mismatch: imported module 'test_proxy' has this __file__ attribute:   /home/ygolanski/code/junk/python/mymodule/eek/test/test_proxy.py which is not the same as the test file we want to collect:   /home/ygolanski/code/junk/python/mymodule/ook/test/test_proxy.py HINT: remove __pycache__ / .pyc files and/or use a unique basename for your test file modules =========================== 1 error in 0.01 seconds ============================ 
like image 347
Sardathrion - against SE abuse Avatar asked Sep 25 '12 11:09

Sardathrion - against SE abuse


2 Answers

Putting an __init__.py is one way of resolving the conflict. Unlike nose, current pytest does not try to unload test modules in order to import test modules with the same import name. I used to think it's a bit magic to do this auto-unimporting and might mess up people's expectation from what the import mechanism does; sometimes people rely on the global state of a test module and with auto-unloading you lose it (a test module importing from another test module might then do unexpected things). But maybe it's not a practical issue and thus pytest could add a similar hack ...

like image 161
hpk42 Avatar answered Sep 23 '22 15:09

hpk42


This is an actual feature of py.test. You can find the reason for this behavior stated in pytest.org - Good Integration Practices - Choosing a test layout / import rules:

  • avoid __init__.py files in your test directories. This way your tests can run easily against an installed version of mypkg, independently from if the installed package contains the tests or not.

As that's the recommended workflow of working with py.test: install the package under development with pip install -e, then test it.

Because of this, I myself opt for unique test names, in the convention over configuration manner. It also ensures that you don't get ambiguous test names in the various test run output.

If you need to keep the test names and don't care about the above mentioned functionality, you should be ok with putting an __init__.py.

like image 42
famousgarkin Avatar answered Sep 23 '22 15:09

famousgarkin