Django在views.py中进行了docte

Bri*_*unt 23 python django doctest unit-testing

有关测试的Django 1.4 文档说明:

对于给定的Django应用程序,测试运行器在两个位置查找doctests:

  • models.py文件.您可以为单个模型定义模块级doctests和/或doctest.通常的做法是将应用程序级doctests放在模型docstring中的模块docstring和模型级doctests中.

  • tests.py在应用程序目录中调用的文件- 即包含models.py的目录.此文件是您要编写的任何和所有doctest的钩子,它们不一定与模型相关.

出于好奇,我想知道为什么Django的testrunner仅限于doctests models.py,但更实际上我想知道如何views.py在运行时扩展testrunner的doctests包括(例如)和其他模块manage.py test.

我很感激任何意见.

谢谢.

布赖恩

Jes*_*ieh 22

您可以通过在tests.py中添加/编辑suite()函数来执行此操作,该函数定义了django测试运行器将运行的测试.

import unittest
import doctest
from project import views

def suite():
    suite = unittest.TestSuite()
    suite.addTest(doctest.DocTestSuite(views))
    return suite
Run Code Online (Sandbox Code Playgroud)

然后像往常一样运行测试,你应该在views.py中看到你的doctests运行.

$ python manage.py test project
Run Code Online (Sandbox Code Playgroud)

这在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
Run Code Online (Sandbox Code Playgroud)

  • 使用Django 1.8,这仍然是正确的方法吗?Andre Miras的回答表明它已经更新. (3认同)
  • @BrianM.Hunt不确定1.8但是在1.6中我觉得`suite()`不再被调用了.安德烈的回答是`load_tests()`. (3认同)

And*_*ras 15

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

将不再自动发现Doctests.要在测试套件中集成doctests,请遵循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
Run Code Online (Sandbox Code Playgroud)

  • 在我的应用程序test.py文件的末尾(我已经更新了我的答案). (2认同)

Den*_*aia 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
Run Code Online (Sandbox Code Playgroud)

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


Alm*_*mad 5

使用带有django(django-sane-testing或django-nose)插件的nosetests并使用--with-doctest标志.