接口测试

前端框架: VUE, node.js, React

==> 主要负责页面的展示

后端: 主要负责 业务,逻辑处理

接口:前端和后端的交互

有些,前端做了限制,但是后端并没有,漏洞就是可以绕过前端做一些请求。

 

常用接口方式

webservice:走soap协议,通过http传输,请求报文和响应报文都是xml格式的。

http:  超文本传输协议

https: http+ SSL

 

接口自动化:

项目业务        接口文档        接口用例

自动化脚本    pytest框架      调试&执行

allure报告      结果分析          持续集成

 

http协议概述:

请求报文: 

请求行:     请求方法+url 协议/版本

请求头        由键值对组成,包含 user-agent, content-type, cookie等

空行

请求正文: 请求参数

 

状态码:

200: 请求通了, 但其实不一定成功

30x:请求重定向

40x:连接/路径/资源不存在, url有问题 => 查URL

50x:服务器有问题

 

Cookie&SessionID&Token

token机制是避免频繁访问数据库, 有时效性。

cookie和token是不同的机制。

cookie有时同时存放的有sessionid 和 token。

构建请求时传入cookie时,cookies = 具体的cookie值。

 

主要数据格式:

表单格式: 键值对的形式,用&连接多个键值对

JSON格式:键值对形式的字符串;键必须用双引号

 

请求头 headers :

一般可以直接以字典的形式传入。

 

 

请求方式和对应传参形式:

get请求:

  • 作用:查询资源

params 接收: 可传入字典,也可直接传入字符串

  • params = {"id":1001}
  • params = {"id":[1001,1002]}
  • params = {"id":"1001,1002"}
  • params = {"id":1001,"kw":"北京"}
  • r= requests.get(url,params="id=1001") =》直接字符串传参。

post请求:

  • 作用:新增资源
  • 示例:requests.post(url,json,headers)
  • json: 请求报文
  • headers: 请求头信息

form表单:

data接收字典,会自动转换为表单

json格式:

json直接接收字典

data接收JSON字符串。如果原数据是字典,可以借助json.dumps(dict1) => 转换为json字符串。 data = json.dumps(dict1)

 Put请求:

  • 作用:更新资源
  • 示例:requests.put(url,json,headers)
  • 响应:r.json() , r.status.code()

delete请求

  • 删除资源
  • data  ==》接收字典,可以转换为表单

 

 响应 :

response.text 和 response.json()的区别:

response.text: 以文本的形式解析响应,可以解析html类型,json类型,其他类型,响应是文本内容,类型是字符串。

response.json(): 只能解析响应是json类型的,如果解析其他类型的话,会报错。

response.content: 字节响应内容,返回字节类型,一般是图片,视频等多媒体文件。

response.raw : 原始响应内容,原始格式。

response.url : 获取请求的URL

response.status_code :获取响应状态码

response.url: 查看请求的url ,  有的时候断言的时候会使用

response.encoding : 查看响应头的字符编码

response.headers: 查看响应头部信息

response.request._cookies :获取请求的cookie

response.cookies:获取响应的cookie , 返回的是字典对象,可以通过键来获取对应的值。

response.encoding : 查询响应的默认编码格式​,其实也是请求你的默认编码格式。因为如果不指定,默认的请求编码格式就是请求的编码格式

==>有的时候默认编码格式会导致中文乱码,所以,在使用使用中可以指定编码格式​

r.encoding= 'utf=8'
print(r.text)
# 打印请求头
# 可以查看到user-agent直接发送的话python。。。: 'User-Agent': 'python-requests/2.25.1'
print(reps.request.headers)
# 打印请求体
print(reps.request.body)
# 查看响应头,
print(reps.headers)
# 查看响应体, text文本形式
print(reps.text,type(reps.text))
# 查看响应体, 字典格式。前提,响应体必须是json格式才能用此方法
print(reps.json(),type(reps.json()))
# 取响应中的某个信息,比如 retcode
print(json.loads(reps.text)["retcode"])
print(reps.json()["retcode"])

 

有些请求要依赖于前面接口(比如登录接口请求之后获得的cookie)才能请求成功,

(===> 原理:requests库的session对象能够帮我们跨请求保持某些参数,也会在同一个session实例发出的所有请求之间保持cookies)

方法1:先跑登录请求,获取cookie,然后在后面的接口的请求中都带上该cookie

登录请求的header中返回的sessionid=smbvfuof48lv9klorylz66vlzhcr1nn8 =》 然后将sessionid值提取出来 =》 探后封装在cookie中:
cookie = {"sessionid":"smbvfuof48lv9klorylz66vlzhcr1nn8"}
然后后续的请求中带上即可:requests.post(url,data=payload,cookies = cookie)

方法2:先 requests.Session() 获得session对象 =》然后用获得到的session对象去出路登录请求 =》然后再用session对象去处理后续的依赖于登录请求的请求就可以请求成功。

import requests

url='http://127.0.0.1:80/api/mgr/loginReq'
# 获取session对象
session = requests.Session()
print(session)
data1 = {
"username":"auto",
"password":"sdfsdfsdf"}
# 登录请求
r = session.post(url,data=data1)
print(r)
print(r.headers)

url1= 'http://127.0.0.1:80/apijson/mgr/sq_mgr/'
data2 = {
"action" : "add_course_json",
"data" : {
"name":"小学体育2",
"desc":"小学体育2",
"display_idx":"4"
}
}
# 新增课程请求
resp = session.post(url1,json=data2)
print(resp.json())
#列出课程
url3 = 'http://127.0.0.1:80/api/mgr/sq_mgr/?action=list_course&pagenum=1&pagesize=20'
r = session.get(url3)
print(r.json())

 ==》 关闭session对象: session .close()

 

 

 

data: 请求体参数,默认是表单类型

==》 如果是data的话,header可以不用传

json:请求体参数,默认是JSON类型

**kwargs: 格式:变量=值。  一般传 headers, cookies, proxy, ssl检验

token, cookie 一般封装在header

 

 

unicode转中文:

\u7528\u6237\u6216\u8005\u5bc6\u7801\u9519\u8bef  ==》这种是Unicode码, 可以用工具转为中文。

在代码中,也可以通过指定编码的方式,转为中文==》 reps.encoding="unicode_escape"

 

代码中怎么表示是json格式: 

 

# 请求体;根据要求 请求体是JSON格式,但是代码中具体怎么表示为JSON呢,加引号
payload = {
"action": "add_course",
"data":'''{
"name":"初中语文",
"desc":"初中语文课程",
"display_idx":"1"
}'''
}

 

 

接口测试用例设计:

三个方向:

一:输入参数:

请求头设置:Content-Type, 签名等

普通类:字符,数值等,

关注::是否必填,缺少参数,参数名错误/多余的参数,类型(中英文,大小写,整数小数,特殊符号等),长度,边界值,敏感字(比如论坛什么的,一些敏感字),接口内参数联动(比如说身份校验绑定,比如身份证,护照等,比如选了身份证校验的,就不能选护照等信息)。

 

文件: 文件类型,文件大小

以下是Postman中上传文件的操作截图:

 

二:接口逻辑:

条件判断登录状态(还没登录,后续的接口应该都不能跑),绑定关系(比如绑定的账号才能提交账单),条件限制(比如一些游戏账号啥的,有货币才能充会员,买东西等),权限(比如普通用户权限,管理员权限等等)等

业务逻辑,算法: 其实就是接口正确要实现的业务逻辑, 比如,是自己绑定的账号是要能成功提交账单订单。

三:响应数据

同步响应:

==》1:成功返回(对返回内容的校验,包括响应码,内容等),

==》2:失败返回(参数异常处理[相应的错误码,以及内容返回],服务异常处理[一般有错误页面,需要开发帮忙一起做]),

==》3:超时处理

异步响应:

重定向:校验重定向的地址

 

版本,比如说更新到1.1版本,那么1.1可以用, 1.0是否还要保证可以用?具体看业务需求;

 

posted @ 2021-08-22 23:35  晨义  阅读(272)  评论(0)    收藏  举报