Python接口测试之requests中session会话对象

在Python接口测试之requests(七)中介绍了requests的库,但是并没有没有介绍到session会话对象这部分,下面还是通过一个实际的案例来看这部分的在企业级产品中的应用。

登录一个系统,使用charles进行争包,见如下抓包获取的信息,见截图:

在如上的截图中,我们首先需要登录,登录成功后,可以获取XX的信息,见login接口响应恢复内容:

{

"code":200

}

在如上中可以看到,登录只返回了code是200,并没有期待中的返回token,那么可以得知该系统使用的是session的方式来记住用户登录后的密钥,也就是说,执行login的接口后,首先需要到sessionID,在下一个接口请求中带上login返回的sessionID,否则执行就会出现401无权限的问题,那么我们先来执行login的接口,见实现的代码:

#!/usr/bin/env python

#-*-coding:utf-8-*-

importrequests

deflogin():

'''登录接口:/auth/login'''

r=requests.post(

url='http://11X.39.63.XX:20080/auth/login',

data={'username':'system','password':'123456'})

printr.status_code

printr.text

调用login的函数,见执行后输出的结果信息:

200

{

"code":200

}

那么我们接着来进行另外一个接口的调用,来获取XX信息,见该接口的代码:

#!/usr/bin/env python

#-*-coding:utf-8-*-

importrequests

defselectable():

r=requests.get(

url='http://11X.39.63.XX:20080/depot/parks/selectable')

printr.status_code

printr.text

执行如上的方法后,并没有打印出所期望的信息,而是打印出需要登录该系统的信息,只所以出现该错误这是因为在该接口请求的时候系统并没有登录,所以第一步首先需要登录然后才可以发送该请求,那么就需要我们对login()的接口进行修改,获取到登录成功后的sessionID,并且selectable()接口请求的时候需要带上该接口,见修改后的代码:

#!/usr/bin/env python

#-*-coding:utf-8-*-

importrequests

deflogin():

'''登录接口:/auth/login'''

r=requests.post(

url='http://11X.39.63.XX:20080/auth/login',

data={'username':'system','password':'123456'})

returnr.cookies.get_dict()

defselectable():

r=requests.get(

url='http://11X.39.63.XX:20080/depot/parks/selectable',cookies=login())

printr.status_code

printr.text

selectable()

在如上的例子中我们可以看到,首先需要获取到sessionID然后再另外一个接口请求中需要带上,这样其实存在很多的缺点的,最主要的缺点是当接口用例很多的时候,都需要带上那么就意味着每调用一个接口都得必须执行login()的函数,下来我们使用另外一种方式,也就是requests的session会话对象来进行处理。会话对象让你能够跨请求保持某些参数。它也会在同一个 Session 实例发出的所有请求之间保持 cookie, 期间使用的connection pooling功能。所以如果你向同一主机发送多个请求,底层的 TCP 连接将会被重用,从而带来显著的性能提升。对代码进行修改,见修改后的代码:

#!/usr/bin/env python

#-*-coding:utf-8-*-

importrequests

deflogin():

'''登录接口:/auth/login'''

s=requests.Session()

r=s.post(

url='http://11X.39.63.XX:20080/auth/login',

data={'username':'system','password':'123456'})

returns

defselectable():

r=login().get(

url='http://11X.39.63.XX:20080/depot/parks/selectable')

printr.status_code

printr.text

selectable()

再次执行如上的代码,见执行后的打印内容:

200

{

"data": [

{

"Text":"\u65b0\u957f\u5b89\u5e7f\u573a\u9053\u8fb9\u505c\u8f66",

"Value":1

}

]

}

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180410G1YPX700?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券