Django测试用例编写

Django一直都是一个大而全的框架,不仅包含了网站开发的大量插件,包包含了测试相关的一些组件,近期开发的一个项目中,为了方便测试,学习了一下简单的测试用例的编写,下面就对这一部分做一个简单的介绍。

基本测试用例的编写

Django中所有的测试都需要继承自一个TestCase的类,所有以test_命名的方法都是一个测试单元,比如

from django.test import TestCase
from .utility import add_func

Class SimpleTest(TestCase):
    def test_add_func(self):    
        print("Start to test add func")
        a = add_func(2, 3)
        self.assertEqual(a, 5)

上述就是一个简单的方法测试,可以看到TestCase类中包含了一些用于判定测试结果的方法,写起来还是非常方便的

和HTTP相关的测试

Django毕竟是一个网络框架,所以很多测试还是和网络相关的,Django内部集成了一个Client可以用于实现HTTP请求,从而实现服务端的验证,比如一个简单的get请求测试:

from django.test import TestCase
from django.urls import reverse

Class SimpleTest(TestCase):
    def test_get_func(self):    
        print("Start to test get a url")
        response = self.get('url_name')
        self.assertEqual(response.status_code, 200)

上述测试就实现对一个View的get请求的测试。

一个比较复杂的例子

一般HTTP的get请求是没有太多参数需要传递的,而POST请求则会传很多东西,Django的test.Client也是支持POST请求的,不过对于一些特殊的请求则需要特别处理。

在我的项目里面有一个View是实现logger数据上传的,数据直接在body里面,另外还有一个id是在header里面,这个东西就有点复杂,不像是一般的POST会有JSON或者表单,先贴代码再分析吧。

from django.test import TestCase
from django.urls import reverse
from .models import RawData

# Create your tests here.
class EloggerUploadTest(TestCase):
    def test_upload_data(self):
        id="device id header"
        print("Running logger test")
        msg = 'post body is here'
        response = self.client.post(
            reverse('logger_upload'),
            data=msg,
            content_type='text',
            HTTP_DEVICEID=deviceid
        )
        self.assertEqual(response.status_code, 200)
        raw = RawData.objects.all()[0]
        self.assertEqual(raw.id, id)

上面这个例子就是一个比较完整的测试,上面的代码首先构造了一个比较特别的POST请求,主要有以下几步:

  1. 通过reverse('logger_upload')获取上传的url
  2. data=msg通过data传入POSTbody
  3. 通过content_type='text'指定body的类型,这一步非常重要,如果不加设定的话, Django会认为这是一个MULTTYPE,会按照字典对data进行遍历,而msg不是一个字典,所以会出错
  4. 通过HTTP_DEVICEID指定header,Django这个header的处理比较特别,Django所有的HTTP header中都在request.META的字典中,Django还会自己加入一些自己可能用到的变量,所有HTTP中含有的header都会将变量名变为大写,-替换为_, 加以HTTP_前缀。所以在指定POST header时也要按照这个步骤对header进行处理。
  5. 数据写入数据库中后通过ORM取出,对结果进行比较。

需要说明的是Django在运行测试的时候会自动建立一个测试用的数据库,这样可以在不影响原有数据的基础上实现测试。

发表新评论