Django文档中关于测试的部分提到:
对于一个给定的Django应用,测试运行器会在两个地方寻找doctests:
-
models.py文件。可以在Module级别定义doctests,也可以为单个模型定义。通常的做法是将应用级别的doctests放入模块注释中,并将模型级别的doctests放入模型注释中。
-
应用目录中的tests.py文件——即包含models.py的目录。这个文件是用来编写所有不与模型相关的doctests的。
出于好奇,我想知道为什么Django的测试运行器只局限于models.py中的doctests,但更现实的问题是我想了解在运行manage.py test时,如何扩展测试运行器的doctests以包含views.py和其他模块。
我非常感谢任何意见。
谢谢。
——Brian
- 解决方案
有多种方法可以解决这个问题:
方法一:
- 在tests.py中添加/编辑suite()函数,该函数定义了django测试运行器将运行哪些测试。
import unittest
import doctest
from project import views
def suite():
suite = unittest.TestSuite()
suite.addTest(doctest.DocTestSuite(views))
return suite
- 然后像往常一样运行测试,你应该会看到views.py中的doctests运行。
$ python manage.py test project
- 这种方法在django测试文档中有更详细的描述。
方法二:
- 在Django 1.6中,事情已经发生了变化:
Doctests将不再被自动发现。要将doctests集成到你的测试套件中,请按照Python文档中的建议进行操作。
- 因此,我所要做的就是(在我的_app/tests.py中):
import unittest
import doctest
from my_app import views
def load_tests(loader, tests, ignore):
tests.addTests(doctest.DocTestSuite(views))
return tests
方法三:
- 这是我基于Jesse Shieh答案实现的tests/init.py:
import doctest
import unittest
list_of_doctests = [
'myapp.views.myview',
'myapp.forms.myform',
]
list_of_unittests = [
'sometestshere', # This file is myapp/tests/sometestshere.py
'moretestshere', # This file is myapp/tests/moretestshere.py
'myapp.tests.othertest', # Absolute paths also work.
]
def suite():
suite = unittest.TestSuite()
for t in list_of_doctests:
suite.addTest(doctest.DocTestSuite(
__import__(t, globals(), locals(), fromlist=["*"])
))
for t in list_of_unittests:
suite.addTest(unittest.TestLoader().loadTestsFromModule(
__import__(t, globals(), locals(), fromlist=["*"])
))
return suite
- 从本质上说,这个解决方案允许向测试套件添加任意“文件”(实际上是模块)。它允许将单元测试拆分成单独的文件,并允许添加任何包含doctests的模块。只需将模块名添加到此文件顶部的相应列表中即可。
方法四:
- 使用具有django插件(django-sane-testing或django-nose)的nosetests,并使用–with-doctest标志。
方法五:
- Django的原生测试系统基于unittest包。因此它并不像它本可以的那样强大。
- 我建议你使用nose,它是unittest的增强版。使用它与使用nose的Django测试运行器一起使用。你可以用多种方式自定义nose,包括使用-m标志将它指向自定义的测试位置。
方法六:
- 我发布了一个github gist,它允许你在项目中的任何文件或模块中运行测试。
- 在特定模块和文件中运行doctests
方法七:
- 你可以尝试编写你自己的测试运行程序,看看是否可以包含其他文件以检查doctests。
- http://docs.djangoproject.com/en/dev/topics/testing/#defining-a-test-runner