45

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?

sfjac
  • 7,119
  • 5
  • 45
  • 69
vZ10
  • 2,468
  • 2
  • 23
  • 33
  • 1
    Did you try to remove the `__pycache__` dirs? – hoefling Dec 24 '18 at 23:26
  • 2
    Yes. That was the first I did - remove *.pyc and __pycache__ but it didn’t help – vZ10 Dec 24 '18 at 23:32
  • renaming the file in question fixed it for me. Tried deleting the pycache, creating the init file but nothing fixed it. – Jawad Mar 16 '23 at 12:49
  • In my case is that I was using the same name for a module in my project directory tree. Is tricky to understand the error if the project is extensive. – Franco Gil Jun 14 '23 at 18:36

7 Answers7

70

In my case, it was missing __init__.py file in tests directory.

Mateusz
  • 968
  • 8
  • 9
5

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.

bad_coder
  • 11,289
  • 20
  • 44
  • 72
vZ10
  • 2,468
  • 2
  • 23
  • 33
4

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 and pytest/__init__.py files or rename the test files to unique names.

Apart from this, if possible try changing the names of your testcases file.

Abhishake Gupta
  • 2,939
  • 1
  • 25
  • 34
1

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.

Lore
  • 1,286
  • 1
  • 22
  • 57
1

In my case, I was getting the error because I was missing __init__.py file not in tests directory but the one above it.

Yura Gorelik
  • 11
  • 1
  • 3
  • this answer is not novel. It is the same as what has already been answered above. – user3479780 May 01 '23 at 03:59
  • This does not provide an answer to the question. Once you have sufficient [reputation](https://stackoverflow.com/help/whats-reputation) you will be able to [comment on any post](https://stackoverflow.com/help/privileges/comment); instead, [provide answers that don't require clarification from the asker](https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can-i-do-instead). - [From Review](/review/late-answers/34301160) – geanakuch May 03 '23 at 10:29
1

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 __ini__.py files are not longer needed and test files can share names (always that are located in different folders).

BorjaEst
  • 390
  • 2
  • 11
0

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
Julia Meshcheryakova
  • 3,162
  • 3
  • 22
  • 42
rnickle
  • 31
  • 4