【问题标题】:AttributeError: 'module' object has no attribute 'tests'AttributeError:“模块”对象没有属性“测试”
【发布时间】:2014-10-23 20:48:00
【问题描述】:

我正在运行这个命令:

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'

目录结构:

【问题讨论】:

    标签: python django python-2.7 python-unittest


    【解决方案1】:

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

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

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

    例子:

    from project.apps.app1.tests import *
    

    【讨论】:

    • 该消息中的错误假设。
    • 这也可以从命令行完成,无需打开 Python shell:python -c "from project.apps.app1.tests import *"
    • +1 让我避免了令人困惑的错误消息。您的建议的唯一问题是您导入了 death star 。可以在控制台中进行实验,但在代码中,始终只导入所需的名称。
    • 不要担心使用“死亡之星”,难道你不能在每个文件中使用__all__ 变量吗?并指定使用from package_name.module import *时要导出的类名、函数和变量列表?我对这种模式很幸运。我知道在每个文件的顶部写下__all__ 位需要更多时间。但是使用“death star”导入似乎效果很好。
    • 我刚遇到这个问题,真的很困惑。感谢您的回答。 Python在这里没有做正确的事情。它需要一个更清晰的信息。话虽如此,我假设您的“...import *”只是为了检查测试,而不是成为测试运行器的一部分...我认为后者是不合适的。
    【解决方案2】:

    用途:

    ./manage.py shell

    紧随其后

    import myapp.tests

    找出导入错误的性质。

    【讨论】:

    • 感谢您的努力,而且似乎这对很多人都有效。但是,当我使用./manage.py shell 打开python 交互式shell 时,import myapp.testsfrom myapp.tests import * 都可以正常工作。但是,我仍然收到 OP 描述的错误。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      Steve Bradshaw 的上述示例适用于导入错误(感谢 Steve)。

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

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

      看看这些错误是什么

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

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

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

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

          $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
          

          【讨论】:

            【解决方案7】:

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

            【讨论】:

              【解决方案8】:

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

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

              【讨论】:

                【解决方案9】:

                遇到同样的错误,但检查了此处列出的所有原因,但没有解决我的问题。

                终于弄明白了,原因是导入了一个还没使用的方法名不正确。虽然这是一个愚蠢的错误,但它确实发生了。

                【讨论】:

                  【解决方案10】:

                  我有同样的错误。原来是因为我将我的模块命名为 common.py,但已经有一些其他的 common.py 模块。我所要做的就是重命名我的模块。

                  【讨论】:

                    【解决方案11】:

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

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

                    【讨论】:

                      【解决方案12】:

                      我的解决方案只是重命名我的模块。

                      【讨论】:

                      • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
                      • 你的意思是this answer?
                      猜你喜欢
                      • 2017-08-01
                      • 2010-11-18
                      相关资源
                      最近更新 更多