【问题标题】:Django 1.6+ test not Discovering unit tests located in a tests sub-directoryDjango 1.6+ 测试未发现位于测试子目录中的单元测试
【发布时间】:2014-09-07 04:20:29
【问题描述】:

因此,我查看了不少于 10 个与 Django 相关的 Stack Overflow 问题,没有找到单元测试,但每个人都没有解决我的问题。

我正在运行 Django 1.65,并试图让 Django 发现我的测试。

这是我的目录结构

project
  __init__.py
  my_app
    __init__.py
    tests
      __init__.py
      test_template_tags.py
  my_app2
    __init__.py
    tests
      __init__.py
      test_something_else.py  

我在项目目录内的命令行中尝试的命令是: python manage.py test my_app

test_template_tags.py 里面的代码是:

from django.test import TestCase

class MyTestClass(TestCase):

  def setUp(self):
      pass

  def tearDown(self):
      pass

  def test_something(self):
      self.assertTrue(True)

根据另一个 SO 中的提示,此命令 find my_app -name 'test*.py' 已执行并按预期显示所有测试文件。

当我在项目目录中打开 django shell 并尝试导入测试类时,一切正常。

from my_app.tests.test_template_tags import MyTestClass

最后,我将测试代码复制并粘贴到了 app 目录中的 tests.py 文件中,当然,它可以工作,但它不是我要寻找的解决方案。

我在这里还缺少其他一些明显的小东西吗?我所有的__init__.py文件都是按顺序排列的,所有的测试文件前面都有test_,而my_app在settings里的INSTALLED_APPLICATIONS里面。

【问题讨论】:

    标签: python django unit-testing


    【解决方案1】:

    在您的__init__.py 中,您需要import 该目录中的其他测试模块,以便测试运行程序发现它们。如果您的结构如下所示:

    project
      __init__.py
      my_app
        __init__.py
        tests
          __init__.py
          test_template_tags.py
      my_app2
        __init__.py
        tests
          __init__.py
          test_something_else.py  
    

    那么my_app.tests.__init__.py 将包含:

    from test_template_tags import *
    

    my_app2.tests.__init__.py 将包含:

    from test_something_else import *
    

    然后您的测试将使用 python manage.py test 运行

    【讨论】:

    • 所以这绝对有效,我不是 100% 为它疯狂,但如果这就是它应该做的,那就是我会做的。这是 Django 在更改测试运行程序时的意图吗? (显然,这个决定不仅仅是这个)。
    • 这就是所有 python 的实际工作方式。您必须将目录中的所有.py 文件导入__init__.py 文件,以便python 能够找到这些模块。
    • 我没有听懂你在说什么。他们没有理由不能只拥有一个查找 test* 文件的递归发现过程。如果我想拥有多个测试目录或嵌套目录,那么我是否必须将它们全部导入到单个 __init__.py 文件中?对我来说,将其导入__init__.py 的简单事实在某种程度上是多余的,并且违反了 DIY,因为文件系统具有该信息。通常我看到__init__.py 曾经是您希望加载/执行包的某些部分的位置。
    • 我对这种技术的另一个想法。对我来说,执行from module import * 的要求似乎是代码异味/危险信号。这是被标记为不良做法的情况之一。 bit.ly/1qhJxaq此博客的作者将其标记为“最糟糕的做法”。
    • 我打算将其添加到我的评论中。实际上,这是您想使用from module import * 的唯一时间之一。那是粗略的设计决定。如果需要,您可以单独导入您的 test classes
    【解决方案2】:

    在此处尝试任何答案之前,请确保您的测试文件按照惯例标记为 test*.py

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-05
      • 1970-01-01
      • 1970-01-01
      • 2011-08-23
      • 2017-10-27
      • 2012-01-04
      相关资源
      最近更新 更多