What does "'tests' module incorrectly imported" mean?
Question:
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?
Answers:
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
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.
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!)
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
.
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
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
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.
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.
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?
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
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.
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!)
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
.
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
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
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.
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.