“‘测试’模块不正确导入”是什么意思?

我一行一行地复制了一个工作测试,只是改了几个名字(至少我是这么认为的) ,现在我得到了这个非常隐晦的错误: (我用 FOO、 BAR 替换了一些东西)

ImportError: 'tests' module incorrectly imported from 'FOO/exports/tests'. Expected 'FOO/exports'. Is this module globally installed?

问题是我根本不理解这个错误。这个错误消息是什么意思?

完整的堆栈跟踪:

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?
30003 次浏览

根据我的经验,运行测试时出现的怪异“重要错误”是由测试模块本身的“重要错误”引起的。

确保可以导入测试模块:

$ python manage.py shell
...
>>> import foo.exports.tests

编辑:

如果这会导致错误,请确保您没有同时拥有目录 foo/exports/tests和文件 foo/exports/tests.py

在我的案例中,问题是因为我试图用 project 从 symlink 到文件夹启动 django 测试任务,而不是从“真实”路径启动。当我从项目文件夹运行 django 测试任务时,如果没有使用 symlink,我不会得到这个错误。

正如 Daniel Hepper 在上面的评论中所说,尝试检查你的应用程序中是否同时包含 app/tests文件夹和 app/tests.py文件。

Django startapp会自动创建一个 tests.py文件,因此可能有一个您没有注意到的文件。

如果您只是删除自动生成的 tests.py文件,那么它应该可以工作。(显然,在删除任何内容之前,您应该检查文件的内容!)

如果您已经创建了一个名为 tests的目录并在其中编写了测试文件(例如 test_views.pytest_models.py等) ,请确保删除了由命令 python manage.py startapp自动创建的文件 test.py

只是为了增加一个可能的案子。

当您所在的包在本地安装时,这种情况也可能发生在虚拟 env 中。

在这种情况下,您只需使用 development 命令卸载安装了“重新链接”的版本(我不知道正确的术语)

~/dev/stufflib% pip uninstall stufflib
~/dev/stufflib% python setup.py develop
~/dev/stufflib% python setup.py test

尝试检查是否同时具有 app/tests文件夹和 app/tests.py

在你的应用程序文件。

默认情况下,一个文件被自动调用 tests.py删除这个文件它的错误将得到解决

确保在树文件中没有两个名为 test.py 的文件,这样 Python 就可以选择您想要的那个。

简而言之: 删除 test.py 或测试文件夹 当我将之前在一个项目中编写的一些测试复制到我的新项目中时,我遇到了同样的问题,在那里我有5个以上相同的 API。 通常我会创建一个名为 test 的新文件夹,并将所有测试写入每个应用程序的文件夹中,这样一切看起来都会更好 当我在同一个应用程序中创建测试文件夹时,没有从应用程序文件夹中删除 test.py 文件,这个错误使我解决了这个问题 因为不能在同一个应用程序中同时包含 test 文件夹和 test.py。