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请求,主要有以下几步:
- 通过
reverse('logger_upload')
获取上传的url data=msg
通过data传入POST
的body
- 通过
content_type='text'
指定body
的类型,这一步非常重要,如果不加设定的话, Django会认为这是一个MULTTYPE
,会按照字典对data
进行遍历,而msg不是一个字典,所以会出错 - 通过
HTTP_DEVICEID
指定header
,Django这个header
的处理比较特别,Django所有的HTTP header中都在request.META
的字典中,Django还会自己加入一些自己可能用到的变量,所有HTTP中含有的header
都会将变量名变为大写,-
替换为_
, 加以HTTP_
前缀。所以在指定POST header时也要按照这个步骤对header进行处理。 - 数据写入数据库中后通过ORM取出,对结果进行比较。
需要说明的是Django在运行测试的时候会自动建立一个测试用的数据库,这样可以在不影响原有数据的基础上实现测试。
最后更新于 2017-11-01 02:56:22 并被添加「」标签,已有 1940 位童鞋阅读过。
本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。