属性错误:'module'对象没有属性'tests'。

112

我正在运行这个命令:

python manage.py test project.apps.app1.tests

并且它引起了这个错误:

AttributeError: 'module'对象没有'tests'属性

下面是我的目录结构。我已经将app1添加到我的已安装应用程序配置中。

Traceback (most recent call last):
    File "manage.py", line 10, in <module> execute_from_command_line(sys.argv)
    File "/home/username/local/dev/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 385, in execute_from_command_line
    utility.execute()
    File "/home/username/local/dev/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 377, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
    File "/home/username/local/dev/local/lib/python2.7/site-packages/django/core/management/commands/test.py", line 50, in run_from_argv
    super(Command, self).run_from_argv(argv)
    File "/home/username/local/dev/local/lib/python2.7/site-packages/django/core/management/base.py", line 288, in run_from_argv
    self.execute(*args, **options.__dict__)
    File "/home/username/local/dev/local/lib/python2.7/site-packages/django/core/management/commands/test.py", line 71, in execute
    super(Command, self).execute(*args, **options)
    File "/home/username/local/dev/local/lib/python2.7/site-packages/django/core/management/base.py", line 338, in execute
    output = self.handle(*args, **options)
    File "/home/username/local/dev/local/lib/python2.7/site-packages/django/core/management/commands/test.py", line 88, in handle
    failures = test_runner.run_tests(test_labels)
    File "/home/username/local/dev/local/lib/python2.7/site-packages/django/test/runner.py", line 146, in run_tests
    suite = self.build_suite(test_labels, extra_tests)
    File "/home/username/local/dev/local/lib/python2.7/site-packages/django/test/runner.py", line 66, in build_suite
    tests = self.test_loader.loadTestsFromName(label)
    File "/usr/lib/python2.7/unittest/loader.py", line 100, in loadTestsFromName
    parent, obj = obj, getattr(obj, part)
    AttributeError: 'module' object has no attribute 'tests'

目录结构:

这里输入图片描述

12个回答

196

我最终在解决另一个问题时找到了答案。问题是我的测试无法找到一个导入项。

看起来如果您的测试未能成功导入,就会出现上述错误。这是有道理的,因为测试套件无法导入一个损坏的测试。至少我认为是这样,因为我修复了测试文件中的导入项,然后它开始正常工作了。

要验证您的测试用例,只需尝试在Python控制台中导入测试用例文件即可。

例如:

from project.apps.app1.tests import *

那个信息中有错误的假设。 - AdamC
1
这也可以通过命令行完成,无需打开Python shell:python -c“from project.apps.app1.tests import *” - Hakan B.
1
+1 使我免于混淆的错误信息。你的建议唯一的问题是你导入了 死星。在控制台中进行实验时可以,但在代码中,始终只导入所需的名称。 - Peter M. - stands for Monica
我刚遇到了这个问题,感到非常困惑。谢谢你的回答。Python在这里没有做正确的事情。它需要一个更清晰的消息。话虽如此,我认为你的“...import *”只是为了检查测试,而不是测试运行器的一部分......我认为后者是不合适的。 - rfportilla
这个答案虽然可行,但不能被接受。在Python中永远不要使用星号进行导入。 - RaphWork
显示剩余2条评论

39

使用:

./manage.py shell

然后执行

import myapp.tests

以查找导入错误的性质。


我很感激你的努力,看起来这对许多人都有效。但是,当我使用./manage.py shell打开Python交互式shell后,无论是执行import myapp.tests还是from myapp.tests import *都没有出现错误。但是,我仍然遇到了OP所描述的错误。 - MikeyE

23

对于我的情况,我需要在app/tests文件夹中创建一个空的 __init__.py文件。


6

感谢Steve Bradshaw提供的示例,可以解决导入错误问题。

其他类型的错误(例如ValueError)也可能会引起问题。

AttributeError: 'module' object has no attribute 'tests'

查看这些错误是什么

./manage.py shell
from myapp.tests import SomeTestCase
t = SomeTestCase()

5
我遇到了和Chris一样的错误。我已经删掉了一个旧模型,然后运行tests.py,但是另一个文件(views.py)仍然尝试导入已删除的模型。
当我删除了现在过时的导入语句时,问题得到解决。

3

确保您在脚本中使用的所有模块都没有问题。我的意思是检查您导入语句中的拼写。

# invalid import
from app.model.notification import Notification
# valid import
from app.models.notification import Notification

您可以通过在Django的交互式控制台中执行导入语句来测试模块。

$root@13faefes8: python manage.py shell
Type "help", "copyright", "credits" or "license" for more information (InteractiveConsole)
>>> from app.model.notification import Notification
Traceback (most recent call last): 
   File "<console>", line 1, in <module>
ImportError: No module named model.notification

2
我通过修复循环导入引用解决了“AttributeError: module 'utils' has no attribute 'name_of_my_function'”错误。我的文件manage.py和utils.py都有一个指向对方的import语句。

2

我也遇到了同样的错误。原来是因为我把模块命名为common.py,然而已经有其他的common.py模块存在了。我只需要重新命名我的模块即可。

最初的回答:

我遇到了相同的错误。原因是我将模块命名为common.py,但已经存在另一个common.py模块。我只需要将我的模块重命名即可。


1
根据Django文档,当您运行测试时,测试工具的默认行为是查找所有测试用例(即,unittest.TestCase的子类)在任何以test开头的文件中,并自动构建一个测试套件来运行这些测试用例。
因此,请尝试这样做:python manage.py test tests.py

1

我遇到了相同的错误,但是检查了这里列出的所有原因,都没有解决我的问题。

最终发现,问题的原因是导入但尚未使用的一个方法的名称不正确。虽然这是一个愚蠢的错误,但它确实会发生。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接