Reputation: 2676
I've got a file in the package with 'test' in its name and when I run pytest I got an error
import file mismatch:
imported module 'my_project.my_file_test' has this __file__ attribute:
/my_project/src/my_project/build/lib/python2.7/site-packages/foo/my_file_test.py
which is not the same as the test file we want to collect:
/my_project/src/my_project/build/private/python2.7/lib/foo/my_file_test.py
HINT: remove __pycache__ / .pyc files and/or use a unique basename for your test file modules
If I remove 'test' from the file it works fine but unfortunately I can't change it.
So the question is how to tell pytest to ignore this file?
Upvotes: 61
Views: 30557
Reputation: 755
As pytest explains:
For historical reasons, pytest defaults to the prepend import mode instead of the importlib import mode we recommend for new projects. The reason lies in the way the prepend mode works.
See https://docs.pytest.org/en/7.1.x/explanation/goodpractices.html#choosing-an-import-mode
and https://docs.pytest.org/en/7.1.x/explanation/pythonpath.html#import-modes
Basically it means, when using old prepend
(default) tests are imported as packages, and therefore you need __init__.py
files inside test folders.
Solution defined by pytest at the mentioned links:
[tool.pytest.ini_options]
addopts = "--import-mode=importlib"
With this, importlib
is used to collect tests and therefore __init__.py
files are not longer needed and test files can share names (always that are located in different folders).
Upvotes: 18
Reputation: 1
In my case, I was using tests directory in each app and I forgot to remove tests.py
file that is already created by default in Django. When I removed the tests.py
file, everything worked fine.
Upvotes: 0
Reputation: 9
In my case, I was getting the error because I was missing __init__.py
file not in tests directory but the one above it.
Upvotes: 0
Reputation: 3170
A working solution from Pytest Issues 3151
Exact Quotes of the solver below:
This is happening because your test files have the same name in two different directories, and they are imported into the global namespace because there's no `init files; there's a more detailed explanation in the docs.
In this case you can either create
case/__init__.py
andpytest/__init__.py
files or rename the test files to unique names.
Apart from this, if possible try changing the names of your testcases file.
Upvotes: 7
Reputation: 41
A small variation of this case using the _pytester_
plugin included with _pytest_
(that yields the same error.)
There is a feature of the plugin that allows placement of example tests in your project root (outside of the package), and those tests can be copied into a test temp directory via _pytester.copy_example()_
.
This feature can be used as a test loader, and also as a way to test examples.
If you use this feature, you will also want to put an \_\_init\_\_.py
into the source directory for your examples.
E.g.: if copying the example from the examples directory:
pytester.copy_example("examples/test_zfs.py")
To avoid the import file mismatch error:
$ touch examples/__init__.py
Upvotes: 1
Reputation: 2676
So finally it was easy, I just had to add test file pattern to the pytest.ini
file:
python_files = test_*.py
so pytest stopped looking for files with test
in the end of the name what it did by default.
Upvotes: 10
Reputation: 29
I was facing the same issue even though my file name was not exactly same as other.
I had test_01_login_chrome.py
and test_01_login_firefox.py
Error I was getting
import file mismatch:
imported module 'test_01_login_chrome.py' has this __file__ attribute:
/Users/avicii/PycharmProjects/Omni_Sanity/TestCase/Firefox_TestCases/test_01_login_chrome.py
which is not the same as the test file we want to collect:
/Users/avicii/PycharmProjects/Omni_Sanity/TestCase/01_Chrome_TestCases/test_01_login_chrome.py
HINT: remove __pycache__ / .pyc files and/or use a unique basename for your test file modules
I tried adding __init__.py
to the test cases folder and it did not work.
Then I tried a workaround. I created a python package for my test cases, which created __init__.py
by default and then moved my test cases to that folder.
And my issue was resolved.
Upvotes: 0