django提供了一小系列工具在你写测试工具
测试客户端client
测试客户端client是个可以充当虚拟web浏览器的python类,可以让你测试你的视图层, 以编程的方式与你的django应用互动。
你可以使用测试客户端做一些事情
模拟url的get和post请求和观察返回结果, 包括返回的请求头和响应的状态码以及页面内容
查看跳转链接并检查重定向和状态码
测试给定请求是否呈现的是给定的模板
请注意, 测试客户端并非要带带slecuium或者其他浏览器框架, django的测试客户端有一个不公的关注点, 简而言之
使用django测试客户端是为建立正确的样例呈现, 并且该样例能正确的通过上下文测试数据
使用像selenium这样内置浏览器的框架测试呈现的html和页面行为, 也就是javascript函数。django对这个这些框架进行了特别的支持;看LiverServerTestCase部分了解更多的详情
一个全面的测试套装应该两种测试的的组合
概况及简单样例
要使用测试客户端, 先实例一个django.test.Client,然后获取页面
>>> from django.test import Client
>>> c = Client()
>>> response = c.post('/login/', {'username': 'john', 'password': 'smith'})>>> response.status_code200
>>> response = c.get('/customer/details/')
>>> response.contentb'<!DOCTYPE html...'
这是个示例, 你当然也可以在python交互式回话中实例化Client
在测试工作时有一些重要的事情值得注意
测试客户端不需要web服务器运行, 实际上在没有web服务器运行的情况下将运行的更好
当你请求页面时,请不要填写全部域名,而是指定路径
例子, 正确形式
>>> c.get('/login/')
错误形式
>>> c.get('https://www.example.com/login/')
测试客户端对不是你的django项目web页面是无能为力的, 如果你需要请求其他的web页面,可以使用python的标准库urlllib
对于解释urls, 测试客户端可以使用任何由你的ROOT_URLCONF设置的URLconf
即使以上的样例都能工作在python的交互性解释器上, 但是像模板相关功能只能在测试运行的时候才能测试
这是测试runner的一点黑魔法, 为了确定view已经加载了给定的模板
默认在你自己的站点测试端将取消所有CSRF检查动作
在某些情况下,你想要测试CSRF, 你可以实例化一个强制执行CSRF检查的测试客户端, 你可以使用enforce_csrf_checks参数构建一个测试客户端
>>> from django.test import Client >>> csrf_client = Client(enforce_csrf_checks=True)
发出请求
使用django.test.Client类发送请求
class Client(enforce_csrf_checks=False, json_encoder=DjangoJSONEncoder, **defaults)
测试客户端构建不需要参数, 然后你可以使用关键值指定某些默认的请求头, 例如, 你可以发送User-Agent请求头在每次http请求中
c=Client(HTTP_USER_AGENT='Mozilla/5.0')
传递给get, post请求的额外参数有先有构造测试客户端的默认参数
enforce_csrf_checks参数被用测试CSRF保护机制
json_encoder参数允许在post请求中设置一个定制的json编码器来序列化json
json_encoder 是在django2.1中加入
一旦你有一个测试客户端, 你可以请求下面任意一个方法