AttributeError:“模块”对象没有属性“测试”


101

我正在运行以下命令:

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

并导致此错误:

AttributeError:“模块”对象没有属性“测试”

下面是我的目录结构。我还已将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'

目录结构:

在此处输入图片说明

Answers:


181

我终于想出了解决另一个问题的方法。问题是我的测试找不到导入。

如果您的测试无法导入,您似乎会收到上述错误。这是有道理的,因为测试套件无法导入损坏的测试。至少我认为这是正在发生的事情,因为我在测试文件中修复了导入,并确定导入已开始起作用。

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

例:

from project.apps.app1.tests import *

该消息中的错误假设。
AdamC

1
这也可以从命令行完成,而无需打开Python shell:python -c "from project.apps.app1.tests import *"
Hakan

1
+1使我免于混淆错误消息。您的建议的唯一问题是您进口了死亡之星。在控制台中可以进行实验,但是在代码中,始终仅导入所需的名称。
Peter M.-代表莫妮卡

不用害怕使用“ 死星 ”,您能不能__all__在每个文件中使用该变量?并指定要使用时导出的类名称,函数和变量的列表from package_name.module import *。我对这种模式很幸运。我知道__all__在每个文件的顶部写一些位会花费更多时间。但是使用“ 死亡之星 ” 导入似乎效果很好。
MikeyE

我刚遇到这个问题,真的很困惑。感谢你的回答。Python在这里做的不正确。它需要更清晰的信息。话虽这么说,我认为您的“ ... import *”仅用于检查测试,并不意味着要成为测试运行程序的一部分……我认为后者是不合适的。
rfportilla

35

用:

./manage.py shell

其次是

import myapp.tests

查找导入错误的性质。


我很感谢您的努力,这似乎对很多人都有效。但是,当我使用来打开python交互式shell ./manage.py shell时,其中一个import myapp.testsfrom myapp.tests import *两个都正常运行而没有错误。但是,我仍然收到OP描述的错误。
MikeyE

21

就我而言,我需要在文件夹中创建一个空的__init__.pyapp/tests


6

上面的Steve Bradshaw的示例可解决导入错误(感谢Steve)。

其他类型的错误(例如ValueError)也可能导致

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

看看这些错误是什么

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

4

我和克里斯有同样的错误。我删除了一个旧模型,然后运行tests.py,但是另一个文件(views.py)仍在尝试导入已删除的模型。

当我取出现在已经过时的import语句时,问题解决了。


3

确保脚本中使用的所有模块均未损坏。我的意思是在您的导入语句中检查拼写。

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

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

$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:模块'utils'没有属性'name_of_my_function'”。我的文件manage.py和utils.py每个都有一个指向彼此的import语句。


1

根据django文档,当运行测试时,测试实用程序的默认行为是在名称以test开头的任何文件中查找所有测试用例(即unittest.TestCase的子类),自动从中构建测试套件。这些测试用例,然后运行该套件。

所以试试这个: python manage.py test tests.py


1

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

最后弄清楚,原因是导入但尚未使用的一种方法的名称不正确。尽管这是一个愚蠢的错误,但它确实发生了。



0

编写unittest.TestCase时遇到类似的错误。当我按原样重新键入相同的方法定义时,它似乎起作用了!

我在PyCharm上注意到的唯一变化是第二次弹出“覆盖”图标,因为setup(self)方法需要覆盖TestCase中定义的原始方法。

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.