测试进阶:实现跨请求地保持登录的神器session你get了么?
前言
在学习自动化或者是去面试自动化相关岗位时,难免会遇到的一个问题是:如何处理自动化请求中的登录信息?不论是在学习接口自动化还是出去面试自动化测试岗位,测试人员遇到的一个问题都是如何处理登录?
举例一个很简单的例子:
在做接口自动化测试的时候,肯定会遇到一种测试场景在进行操作的时候会提示用户进行登录或者直接返回HTTP状态码401(未授权)。
例如:我们在进行电商平台购物时,要创建订单前都会提示我们先进行登录。 因为HTTP协议是无状态的,所以在创建订单时,服务器不知道哪个用户在操作。因此,用户在创建订单时必须要先进行登录,登录成功后服务器会返回一个特定的标识,该标识用于识别用户并跟踪用户 。
常见的身份信息
在进行自动化过程中一般遇到的登录一般会听到2个名词:一个是token,一个是cookie。
Cookie 是由 Web 服务器保存在用户浏览器上的小文本文件,它包含有关用户的信息,一般是服务端创建会话后通过请求的response请求返回给客户端(浏览器或者其他客户端)。cookie 类似我们用身份证入职一个公司,然后公司给我们一个员工编号,后面工作过程中,我们都是通过员工编号进行工时统计或薪资发放等。
Token则是由应用商通过账号密码生成的有时效有权限的随机数,token的使用类似是我们出生后有了身份证,后面生活的时候直接给看自己身份证。
实战-自动保存/获取cookie
自动获取cookie的原理
python有一个非常强大的接口测试第三方库 – requests。很多学习Python的同学们可能都知道requests库常见用法一般如下两种:
1.第一种方式:
requests.get(url,params,headers)
requests.post(url,data,headers)
2.第二种方式:
requests.request(url,method.params,headers)
requests.request(url,method.data,headers)
使用上述两种方法,在遇到接口需要依赖登录信息时,需要通过手动的方式提取cookie再通过变量传递给下一个接口使用。
实际上,除了上述手动获取cookie方法外,requests还有另外一种用法:requests.session()。session其实是一个会话类,requests的所有请求方法,底层都是调用的这个类的对象。
其他方法和session的区别在于:
直接使用requests调用请求方法发送请求,每次都会创建一个新的session(会话对象),所以没有之前请求的cookies信息
直接创建一个session会话对象来发请求,那么每次发请求用的都是同一个会话对象,能够自动保存之前的会话信息(cookies数据),那么其他接口使用同一个会话时会自动调用会话已保存的cookie信息。
如果接口依赖cookies,则可使用session自动管理,s=requests.session(),那么依赖的接口可通过s.get()/s.post()自动关联cookies了
认识可自动的标识 Set Cookie
大家可能会疑问,什么样的情况下session会自动获取对应的cookie呢?这个时候可以用到Charles抓包工具,Charles这个抓包工具能很清楚地划分接口的各个数据,包括Response的headers、Set Cookie(存储登录的cookie信息)、Text(对应响应数据正文)。
请看下面截图!
通过上面截图可知悉,用户登录成功后,服务端通过登录接口返回的响应数据的set cookie返回对应的用户的cookie信息。
如何自动获取?
从上面原理地介绍我们可以知道,接口请求之前我们先创建会话与服务端建立连接后,就会产生对应的cookie。通俗点地说呢,就好比我们拿身份证去注册,注册成功后对方的数据库就会产生一个ID编号,接下来我们都是通过这个编号进行验证身份。
代码实现方法如下:
1.创建会话:s=requests.session()
2.发起登录请求:s.post(url,data,headers) #登录请求一般是post请求
3.查看订单详情页:s.get(url,params,headers) #查看数据一般是get请求
注意:进行创建订单或者查询订单详情等请求必须放在登录请求之后,否则session对应的cookie信息是空的
其他:查看保存的cookie信息—response.cookies.values()
代码片段
运行结果:
总结
Requests的session自动保存cookie的功能,其实就类似jmeter的cookie管理器,不同的点在于使用jmeter时,我们需要先将登录的cookie手动提取后保存到管理器内,然后将其他请求放在管理器下,才会默认去调用该管理器内的cookie;而通过s=requests.session()的作用是,先发起一次对话,然后进行不同请求直接使用同一个对话,服务端返回cookie后进行自动保存,其他接口需要cookie是直接通过s.get()或s.post()进行自动获取。
我是谁?
我是一名从事了多年软件测试的老测试员,今年年初我花了一个月整理了一份最适合2020年学习的软件测试学习干货,可以送给每一位对软件测试感兴趣的小伙伴,想要获取的可以关注我的头条号并在后台私信我:【头条】,即可免费获取。