django为我们提供了一组在测试的时候可以用得上的工具。
首先当我们要使用一个测试客户端的时候,我们需要去实例化一个django.test.Client 然后进行网页检索 :
>>> 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
b'<!DOCTYPE html...'
测客户端并不要求Web服务器正在运行 ,它可以避免Http的开销直接处理框架,这将有助于单元测试快速运行 。
请求页面的时候,我们需要记住的是指定的URL的路径 而不是整个域。
比如说,这样子是正确的:
>>> c.get('/login/')
但是这样子是错误的:
>>> c.get('https://www.example.com/login/')
测试客户端无法请求不受django项目支持的web页面,如果需要请求其他的页面,请使用Python标准库模块,例如说urllib。
虽然说上面的交互可以在Python交互解释器中运行 ,但是一些测试客户端的功能,特别是和模板相关的功能,仅仅在测试运行的时候才可以使用 。
原因是django的测试运行器执行一些黑魔法以确定给定视图加载了哪个模板 这种黑魔法仅仅在测试运行期间发生
默认情况下 测试客户端将禁用您的站点执行的任何CSRF检查。
但是出于某种原因 如果确实需要执行csrf检查 我们可以传相关的参数:
>>> from django.test import Client
>>> csrf_client = Client(enforce_csrf_checks=True)
我们可以使用关键字参数来指定默认标头:
>>> c = Client(HTTP_USER_AGENT='Mozilla/5.0')
额外传递给get和post的参数 优先于传递给类构造函数的默认值:
>>> c = Client()
>>> c.get('/customers/details/', {'name': 'fred', 'age': 7})
并且这种请求方法等效于:
/customers/details/?name=fred&age=7
可以使用额外的关键字参数来指定在请求中发送的头信息。例如:
>>> c = Client()
>>> c.get('/customers/details/', {'name': 'fred', 'age': 7},
... HTTP_X_REQUESTED_WITH='XMLHttpRequest')
以上是一种测试是否是django.http.HttpRequest.is_ajax()的好方法。
我们也可以使用URL编码形式的GET参数,如下:
>>> c = Client()
>>> c.get('/customers/details/?name=fred&age=7')
如果两者都要,那么data参数优先。
我们可以追踪重定向:
>>> response = c.get('/redirect_me/', follow=True)
>>> response.redirect_chain
[('http://testserver/next/', 302), ('http://testserver/final/', 302)]
如果设置secure为True客户端将模拟HTTPS请求。
发送一个post请求额例子:
>>> c = Client()
>>> c.post('/login/', {'name': 'fred', 'passwd': 'secret'})
要给给定的键提价多个值:
{'choices': ('a', 'b', 'd')}
提价文件一种特殊的情况 :
>>> c = Client()
>>> with open('wishlist.doc') as fp:
... c.post('/customers/wishes/', {'name': 'fred', 'attachment': fp})
调用login方法,测试客户端将拥有相应的cookie和会话数据:
>>> c = Client()
>>> c.login(username='fred', password='secret')
# Now you can access a view that's only available to logged-in users.
验证参数取决于你正咋使用的身份验证后端。如果你使用的是其他身份验证后端,可能就需要不同的凭据。
login()返回True说明凭据被接受,登录成功。
测试运行在测试数据库上,该数据库默认情况下是不包含任何用户,我们需要去创建用户作为测试的一部分。
如果我们希望 测试用户拥有密码 必须使用 set_password() 或者是 create_user()创建具有正确哈希密码的新用户。
force_login 会跳过一系列的验证步骤