django源码分析-test模块分析


该模块是django的单元测试模块,测试web应用是个复杂的任务,因为web应用由很多的逻辑层组成 -- 从HTTP层面的请求处理,到表单验证和处理,到模板渲染。使用Django的测试执行框架和各种各样的工具,你可以模拟请求,插入测试数据,检查你的应用的输出,以及大体上检查你的代码是否做了它应该做的事情。

Django的单元测试依赖于Python的unittest模块。

编写测试用例

from django.test import TestCase
from myapp.models import Animal

class AnimalTestCase(TestCase):
    def setUp(self):
        Animal.objects.create(name="lion", sound="roar")
        Animal.objects.create(name="cat", sound="meow")

    def test_animals_can_speak(self):
        """Animals that can speak are correctly identified"""
        lion = Animal.objects.get(name="lion")
        cat = Animal.objects.get(name="cat")
        self.assertEqual(lion.speak(), 'The lion says "roar"')
        self.assertEqual(cat.speak(), 'The cat says "meow"')

运行测试

./manage.py test

测试客户端

测试客户端是一个Python类,作为一个虚拟的Web浏览器,允许您测试您的视图,并与您的Django供电的应用程序以编程方式交互。

你可以用测试客户端做的一些事情是:

  • 模拟对URL的GET和POST请求,并观察响应 - 从低级HTTP(结果头和状态代码)到页面内容的一切。
  • 查看重定向链(如果有),并在每个步骤中检查网址和状态代码。
  • 测试给定的请求是否由给定的Django模板呈现,其中模板上下文包含某些值。

示例

>>> from django.test import Client
>>> c = Client()
>>> response = c.post('/login/', {'username': 'john', 'password': 'smith'})
>>> response.status_code
200
>>> response = c.get('/customer/details/')
>>> response.content
'<!DOCTYPE html...'

测试响应

get()和post()方法都会返回Response对象。此Response对象不是与Django视图返回的HttpResponse对象相同;测试响应对象具有一些对于测试代码验证有用的附加数据。

该模块的具体内容

  • init.py : 模块初始化文件。
  • client.py : 我们上面提到的客户端,模拟浏览器进行测试。
  • html.py : 解析html。
  • runner.py :运行测试用例。
  • selenium.py :对selenium框架的支持。
  • signals.py :信号接收器。
  • testcases.py :测试用例。
  • utils.py :测试工具类。

更多Django教程

学习更多Django教程