Django的单元测试

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 会跳过一系列的验证步骤

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值