Django 在 views.py 中的 doctests
Django 1.4的测试文档中提到:
对于一个Django应用,测试运行器会在两个地方寻找文档测试(doctests):
第一个地方是
models.py
文件。你可以在这个文件里定义模块级别的文档测试,或者为每个模型单独写文档测试。通常的做法是把应用级别的文档测试放在模块的文档字符串里,而模型级别的文档测试放在模型的文档字符串里。第二个地方是应用目录下的一个叫
tests.py
的文件,也就是存放models.py
的那个目录。这个文件是用来写任何你想要的文档测试的,虽然这些测试不一定和模型有关。
我很好奇为什么Django的测试运行器只限制在models.py
里的文档测试,但更实际的是,我想知道如何在运行manage.py test
时,把测试扩展到包括(例如)views.py
和其他模块。
如果有任何建议,我会非常感激。
谢谢。
布莱恩
7 个回答
这是我在 tests/__init__.py
文件中的实现,参考了 Jesse Shieh 的回答:
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
简单来说,这个解决方案可以让你把任意的“文件”(实际上是模块)添加到测试套件中。它允许把单元测试分成不同的文件,并且可以添加任何包含文档测试的模块。只需要把模块的名字加到这个文件顶部的相应列表里就可以了。
在Django 1.6版本中,事情发生了一些变化:
文档测试(doctests)将不再自动被发现。如果你想把文档测试加入到你的测试套件中,可以参考Python文档中的建议。
所以我自己需要做的就是(在我的应用程序的tests.py文件中):
import unittest
import doctest
from my_app import views
def load_tests(loader, tests, ignore):
tests.addTests(doctest.DocTestSuite(views))
return tests
你可以通过在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中的文档测试被执行。
$ python manage.py test project
关于这个内容,Django的测试文档中有更详细的说明,链接在这里:django testing documentation
当你运行测试时,测试工具的默认行为是查找models.py和tests.py中的所有测试用例(也就是unittest.TestCase的子类),自动构建一个测试套件并运行它。
还有第二种定义模块测试套件的方法:如果你在models.py或tests.py中定义一个叫做suite()的函数,Django测试工具会使用这个函数来构建该模块的测试套件。这种方式符合单元测试的推荐组织结构。想了解更多关于如何构建复杂测试套件的信息,可以查看Python文档。
不过,要记住,自己构建测试套件意味着Django测试工具不会自动运行你在tests.py中的任何测试。你需要手动将这些测试添加到你的套件中,例如:
import unittest
import doctest
from project import views
class FooTestCase(unittest.TestCase):
def testFoo(self):
self.assertEquals('foo', 'bar')
def suite():
suite = unittest.TestSuite()
suite.addTest(doctest.DocTestSuite(views))
suite.addTest(unittest.TestLoader().loadTestsFromTestCase(FooTestCase))
return suite