使用Django doctests进行视图测试

Django文档中关于测试的部分提到:

对于一个给定的Django应用,测试运行器会在两个地方寻找doctests:

  1. models.py文件。可以在Module级别定义doctests,也可以为单个模型定义。通常的做法是将应用级别的doctests放入模块注释中,并将模型级别的doctests放入模型注释中。

  2. 应用目录中的tests.py文件——即包含models.py的目录。这个文件是用来编写所有不与模型相关的doctests的。

出于好奇,我想知道为什么Django的测试运行器只局限于models.py中的doctests,但更现实的问题是我想了解在运行manage.py test时,如何扩展测试运行器的doctests以包含views.py和其他模块。

我非常感谢任何意见。
谢谢。
——Brian

  1. 解决方案
    有多种方法可以解决这个问题:

方法一:

  1. 在tests.py中添加/编辑suite()函数,该函数定义了django测试运行器将运行哪些测试。
import unittest
import doctest
from project import views

def suite():
    suite = unittest.TestSuite()
    suite.addTest(doctest.DocTestSuite(views))
    return suite
  1. 然后像往常一样运行测试,你应该会看到views.py中的doctests运行。
$ python manage.py test project
  1. 这种方法在django测试文档中有更详细的描述。

方法二:

  1. 在Django 1.6中,事情已经发生了变化:
Doctests将不再被自动发现。要将doctests集成到你的测试套件中,请按照Python文档中的建议进行操作。
  1. 因此,我所要做的就是(在我的_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

方法三:

  1. 这是我基于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
  1. 从本质上说,这个解决方案允许向测试套件添加任意“文件”(实际上是模块)。它允许将单元测试拆分成单独的文件,并允许添加任何包含doctests的模块。只需将模块名添加到此文件顶部的相应列表中即可。

方法四:

  1. 使用具有django插件(django-sane-testing或django-nose)的nosetests,并使用–with-doctest标志。

方法五:

  1. Django的原生测试系统基于unittest包。因此它并不像它本可以的那样强大。
  2. 我建议你使用nose,它是unittest的增强版。使用它与使用nose的Django测试运行器一起使用。你可以用多种方式自定义nose,包括使用-m标志将它指向自定义的测试位置。

方法六:

  1. 我发布了一个github gist,它允许你在项目中的任何文件或模块中运行测试。
  2. 在特定模块和文件中运行doctests

方法七:

  1. 你可以尝试编写你自己的测试运行程序,看看是否可以包含其他文件以检查doctests。
  2. http://docs.djangoproject.com/en/dev/topics/testing/#defining-a-test-runner
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值