24

关于测试的 Django 1.4文档指出:

对于给定的 Django 应用程序,测试运行程序在两个地方查找 doctest:

  • models.py文件。您可以为单个模型定义模块级 doctest 和/或 doctest。将应用程序级文档测试放在模块文档字符串中,将模型级文档测试放在模型文档字符串中是常见的做法。

  • 在应用程序目录中调用的文件tests.py——即保存models.py 的目录。该文件是您要编写的任何和所有与模型无关的文档测试的挂钩。

出于好奇,我想知道为什么 Django 的 testrunner仅限models.py于.views.pymanage.py test

如有任何意见,我将不胜感激。

谢谢你。

布赖恩

4

7 回答 7

23

您可以通过在 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 测试文档中有更详细的描述

当您运行测试时,测试实用程序的默认行为是在 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
于 2010-06-12T20:59:57.373 回答
18

Django 1.6 中的情况发生了变化:

Doctests 将不再被自动发现。要将 doctest 集成到您的测试套件中,请遵循Python 文档中的建议

所以我自己要做的就是(在 my_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
于 2013-12-13T10:39:17.093 回答
8

这是我的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

基本上,该解决方案允许向测试套件添加任意“文件”(实际上是模块)。它允许将单元测试拆分为单独的文件,并允许添加任何包含 doctest 的模块。只需将模块名称添加到此文件顶部的相应列表中即可。

于 2011-01-27T12:28:07.293 回答
5

使用带有 django 插件的鼻子测试(django-sane-testing 或 django-nose)并使用--with-doctest 标志

于 2010-03-04T18:35:20.207 回答
2

Django 的原生测试系统是基于unittest包的。所以它没有它可以有的那么强大。

我建议您使用在类固醇上向后兼容的鼻子。unittest将它与使用 nose 的 Django 测试运行器一起使用。-m您可以通过多种方式自定义鼻子,包括使用标志将其指向自定义测试位置。

于 2010-03-05T11:11:45.973 回答
2

我发布了一个 github gist,让您可以在项目中的任何文件或模块中运行测试。 从特定模块和文件运行 doctest

于 2011-02-16T08:09:05.323 回答
1

您可以尝试自己编写testrunner,看看是否可以包含其他要检查文档测试的文件。

http://docs.djangoproject.com/en/dev/topics/testing/#defining-a-test-runner

于 2010-03-04T16:33:15.800 回答