Django中的单元测试

^

上篇文章《Python中的单元测试》有提到,“TestResult和TextTestRunner这两个很有用的东西”,但并没有展开讲,这篇介绍Django中的单元测试的文章,在后面一小部分会以Django源码为例简单展开下。

先进入主要部分,简单讲解Django中单元测试的使用。

show me the code

照例,先来一段简单示例代码作为讲解。

比如,有如下一个简单的功能代码,意思是GET方式请求一个URL,200返回需要JSON的响应。代码如下:


from django.http import HttpResponse
from django.utils import simplejson
from django.views.decorators.http import require_GET

@require_GET
def get_json(request):

    return HttpResponse(simplejson.dumps({
        'name': u'大卷的耶稣', 'age': 13
    }), mimetype='application/json')

如果平时手工测试,我们可能就访问下浏览器,看下是否返回结果是否符合预期,如果每次测试都这样,其实很烦,所以我们写个测试,比如访问的URL地址是“/get-json/”,那么代码如下:

from django.core.urlresolvers import reverse
from django.utils import simplejson


class ExampleTestCase(TestCase):

    def test_get_json_200(self):
        response = self.client.get(reverse('get_json'))
        self.assertEqual(response.status_code, 200)

Django有自己一套测试框架,所以Django的项目提供了一个运行单元测试的命令:

python manage.py test

这只是一个简单的示例,展示下Django里写单元测试然后执行。

另外,< Python 2.7的建议安装unitest2

常见场景

  • 测试数据库模拟
  • 测试数据构造
  • HTTP请求:POST、GET
  • response:200/404/30X、content、context
  • 表单验证
  • 测试模版
  • 测试数据定义
  • 需要登录/注销
  • 测试cookie/session
  • 浏览器:selenium
  • override_settings
  • 执行所有/某个app/某个TestCase/某个测试条目
  • 出错了,立马报错,结束测试
  • 忽略某些测试
  • 额外:MongoDB、修改文件
  • 运行
  • 测试数据库
  • client
  • fixtures
  • assert,这文章会讲到的Django中的单元测试框架,封装了不少适合Web开发中的assertXXXX,比如:判断是否URL跳转等。
  • MongoDB特殊处理

Django单元测试框架源码简析

  • runner
  • 模拟

$

这里介绍的其实也很简单,更详细的内容,就直接: * RTFM - Read The Fucking Manual * RTFS

后续

既然讲到了Web开发,那就离不开Web前端开发,而JavaScript又是Web前端开发中的主流,下次就以JavaScript为例来说明下单元测试好了。

资源下载

示例代码