Reputation: 6126
I have copied a working test line by line and just changed a few names (at least so I thought) and now I get this very cryptic error: (I have replaced some stuff with FOO, BAR)
ImportError: 'tests' module incorrectly imported from 'FOO/exports/tests'. Expected 'FOO/exports'. Is this module globally installed?
The problem is that I do not understand the error at all. What does this error message mean?
Complete stacktrace:
Traceback (most recent call last):
File "BAR/modeling/manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "/Users/jonathan/anaconda/lib/python2.7/site-packages/django/core/management/__init__.py", line 353, in execute_from_command_line
utility.execute()
File "/Users/jonathan/anaconda/lib/python2.7/site-packages/django/core/management/__init__.py", line 345, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/Users/jonathan/anaconda/lib/python2.7/site-packages/django/core/management/commands/test.py", line 30, in run_from_argv
super(Command, self).run_from_argv(argv)
File "/Users/jonathan/anaconda/lib/python2.7/site-packages/django/core/management/base.py", line 348, in run_from_argv
self.execute(*args, **cmd_options)
File "/Users/jonathan/anaconda/lib/python2.7/site-packages/django/core/management/commands/test.py", line 74, in execute
super(Command, self).execute(*args, **options)
File "/Users/jonathan/anaconda/lib/python2.7/site-packages/django/core/management/base.py", line 399, in execute
output = self.handle(*args, **options)
File "/Users/jonathan/anaconda/lib/python2.7/site-packages/django/core/management/commands/test.py", line 90, in handle
failures = test_runner.run_tests(test_labels)
File "/Users/jonathan/anaconda/lib/python2.7/site-packages/django/test/runner.py", line 531, in run_tests
suite = self.build_suite(test_labels, extra_tests)
File "/Users/jonathan/anaconda/lib/python2.7/site-packages/django/test/runner.py", line 451, in build_suite
tests = self.test_loader.discover(start_dir=label, **kwargs)
File "/Users/jonathan/anaconda/lib/python2.7/unittest/loader.py", line 206, in discover
tests = list(self._find_tests(start_dir, pattern))
File "/Users/jonathan/anaconda/lib/python2.7/unittest/loader.py", line 267, in _find_tests
raise ImportError(msg % (mod_name, module_dir, expected_dir))
ImportError: 'tests' module incorrectly imported from 'FOO/exports/tests'. Expected 'FOO/exports'. Is this module globally installed?
Upvotes: 150
Views: 39312
Reputation: 171
There are a lot of answers here suggesting different things. None of them quite worked for me, and some seemed not to be true, so I explored the issue and have found a few rules that in part summarise what other have said, but hopefully add a bit to that.
In my case I wanted to test some utilities that were in their own folder, and not a proper app, so the folder I created was missing somethings. When I say "app folder" below, I mean any folder in your project root; in my case it was not a proper app.
I was using Pthon 3.11 by the way.
The file containing the tests must have a name that starts "test" (if not, it will not be found).
By convention, the tests should be in the app folder itself or in a subfolder called "tests", but you can actually call the subfolder anything you like and I suspect put it anywhere you like.
The app folder must have a file called __init__.py
in it, even if the file is empty (if not present, it will not be recognised as a Python module and the test not found).
If your test is in a subfolder, that subfolder too must have a file called __init__.py
in it (as above).
Ensure you do not have a file and sub-folder with the same name (i.e., a folder "tests" and a file "tests.py") inside the app folder (if you have, you will see "ImportError: 'tests' module incorrectly imported from...").
You do not need a file called "models.py" in the app folder or a file called "apps.py" in it. The app does not need to be listed in INSTALLED_APPs in settings.py (but if it is, then you will need that "apps.py" file).
Upvotes: 0
Reputation: 168
In one word: delete test.py or tests folder I had the same issue when I copied some tests I wrote before in one of my projects into my new projects where I had more than 5 same APIs there. Usually I do create a new folder called tests and write all my tests in a folder for each app so everything looks better The mistake I made which led me through this problem was not deleting the test.py file from app folder when I created tests folder in the same app Because you cant have both tests folder and test.py in the same app.
Upvotes: 9
Reputation: 890
In case you have created a directory named tests
and have written test files inside it, for example test_views.py
, test_models.py
, etc., make sure you remove the file test.py
created automatically by the command python manage.py startapp
.
Upvotes: 40
Reputation: 37
make sure you don't have 2 files named test.py in your tree files that way Python should pick the one you wanted to.
Upvotes: 2
Reputation: 657
Try checking whether you have both a app/tests
folder and a app/tests.py
file in your app.
By default a file is automatically called tests.py
delete this file it the error will be resolved
Upvotes: 5
Reputation: 5839
Just to add to the list of possible cases.
This can also happen inside a virtual env when the package you're on was locally installed.
In that case you just need to uninstall the version that was installed an "re-link" it (I don't known the correct term) by using the develop command
~/dev/stufflib% pip uninstall stufflib
~/dev/stufflib% python setup.py develop
~/dev/stufflib% python setup.py test
Upvotes: 2
Reputation: 2249
As Daniel Hepper said in a comment above, try checking whether you have both a app/tests
folder and a app/tests.py
file in your app.
Django startapp
creates a tests.py
file automatically so there might be a file that you haven't noticed.
If you simply delete the automatically generated tests.py
file, it should work. (Obviously you should check the contents of the file before deleting anything!)
Upvotes: 129
Reputation: 39
In my case problem was because I tried to start django test task from symlink to folder with project, not from "real" path. When I run django test task from project folder not using symlink I don't get this error.
Upvotes: 1
Reputation: 29977
In my experience, weird ImportErrors when running tests are caused by an ImportError in the tests module itself.
Ensure that your tests module can be imported:
$ python manage.py shell
...
>>> import foo.exports.tests
Edit:
If that causes an error, make sure you do not have both a directory foo/exports/tests
and a file foo/exports/tests.py
Upvotes: 341