API接口测试:
什么是接口:通过API接口实现计算机软件之间的相互通信
为什么要做接口测试:
不通过前端UI界面或者UI界面还没有设计出来
需要对功能做测试,这也是测试工程师尽早介入测试的一个点
业务的逻辑,数据的资源,安全,需要通过接口去进行测试
接口测试的流程
需求评审-接口评审
需求分析-接口分析
接口用例设计
执行测试用例
Bug的定位与追踪
专项测试报告
接口分类
接口对象
内部接口-集成测试,灰盒,一般开发去做
外部接口-联调测试,方案,联调测试通过准则
协议分类
Web Service接口-SOAP协议
Http Api接口-HTTP协议
接口文档
接口名称-功能描述
接口地址URL
支持的格式(xml/json)-请求数据格式
请求方式-get/post
请求参数-参数名称,类型,是否必填,参数说明请求头等,测试用例设计
返回参数-返回码,返回值信息,返回json或xml信息-预期结果
接口测试
excel表存储接口测试用例
postman进行接口测试
记录测试结果,提交bug
接口测试过程中,如果系统已经完成,验证地方:
接口响应值
系统对应的功能数据
数据库的数据验证
http协议
http协议原理
超文本传输协议,服务器传输文本到本地浏览器的传送协议
基于TCP/IP通信协议传输的
网络型协议
OSI七层模型
物理层
数据链路层
网络层
传输层
会话层
表示层
应用层
TCP/IP四层模型
网络接口层
网络层IP协议
传输层TCP/UDP协议
应用层http、smtp、telnet协议
http协议特点
无连接、无状态、简单灵活
http与https的区别
https-有证书,密文传输,443端口,有身份证验证,完整性检验
http-无证书,明文传输,80端口,无身份证校验,无完整性校验
http请求报文
请求行-包含请求方法,请求路径,请求协议/版本组成
请求头-键值对,如数据类型,版本
空行
请求正文
http响应报文
状态行-包含协议/协议版本,状态码,状态描述符
响应头
空行
响应内容
请求方法
GET
向指定资源发出请求
大小有限制,2千字符以内,提交的数据直接显示URL中,提交数据不安全
POST
向指定资源提交请求数据,如提交表单,上传文件
提交的数据没有限制,数据在请求体中,数据安全,速度慢
PUT
向指定资源位置上上传其新内容上传文件
DELETE
请求服务器删除Request-URL所标识的资源
PATCH
更新部分资源
响应状态码
200-客户端请求成功
301-永久性重定向
302-临时重定向
403-服务器收到请求,拒绝访问
404-请求的资源不存在
500-服务器发生不可预期的错误
SSL通信过程
SSL安全套接层,基于对称密钥与非对称密钥传递数据
浏览器访问https网站,要求与web服务器建立SSL连接
服务器根据客户端发的请求信息确定是否重新生成新的主密钥,若需要服务器响应给客户的信息将包含生成密钥所需信息
客户根据收到服务器响应信息,产生一个主密钥,并用服务器的公开密钥加密后传给服务器
服务器回复该主密钥,并返回给客户一个用主密钥认证的信息,以此让客户认证服务器
Cookie、Session、Cache缓存、Token
Cookie
什么是Cookie
状态的保持,辨别用户身份,保持通信状态
Cookie保存于浏览器,来自于服务器
Cookie包含的信息
Key_Value值
Path路径
Exprises过期时间
Secure传输格式
HttpOnly防止XSS攻击
Cookie类型
持久Cookie
会话Cookie
Session
服务器创建的,保存于服务器内存中
Session标识是全局唯一的
使用场景:记住用户名和密码登录,购物车功能
Browser Cache浏览器缓存
节约网络的资源加速浏览,浏览器在用户磁盘上对最近请求过的文档存储
当再次请求这个页面时,浏览器就可以从本地磁盘显示文档,这样就可以加速页面的浏览
Token
客户端可以将Token保存到任何地方
无限制,无状态,利于分布式部署
Cookie与Session的区别
cookie数据存放在客户的浏览器,session数据存放在服务器
cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应使用session
session在一定时间内保存在服务器上,当访问增多,会占用服务器性能,考虑到减轻服务器性能方面,应使用cookie
单个cookie保存的数据不能超过4k,很多浏览器都限制一个站点最多保存50个cookie
一般建议,将登录信息等重要信息存放在session,其他信息如果需要保留,可以放在cookie
Cookie与缓存的区别
缓存只是对静态资源的处理,Cookie是一种动态机制
缓存大小受资源和磁盘空间的限制
Cookie本身有大小限制,一般浏览器限制大小不能超过4Kb
缓存不会发送服务器,cookie会与请求一并发送
作用不一样,缓存浏览器就可以从本地磁盘显示文档,可以加速页面的阅览。Cookie是服务器辨别用户身份,维持通信传输状态。
JSON
什么是json
存储和交换文本信息的语法
更快,更小,易解析
json格式
{“key”:"value"}
[{},{}]
接口测试用例
正常场景
功能是否按照接口文档要求实现
异常场景
参数为空
参数多填
参数少填
参数类型错误
参数数值取值范围错误
异常场景下是否有正确的处理逻辑和响应提示
必填参数
对于必填参数要设计传参数和不传参数,接口的返回情况
必填参数传参数
必填参数都正确
必填参数类型错误(非法、特殊字符)
必填参数数值范围错误(超过边界)
必填参数空格(前面、中间位置、尾部)
必填参数不传参数
必填参数全部为空
必填参数部分为空
选填参数
一般接口对于非必填参数都不会做非正常性传值的判断,所以只要测试接口返回的内容是否正确即可
如果有接口文档说明对非必填参数做了非正常的验证的话,也要对其验证
覆盖所有参数,正向用例
覆盖所有必填参数,正向用例
某一必填参数为空,逆向用例
必填参数基础上,少传一个参数
多传一个参数,逆向用例
必填参数数据类型错误,数据值错误,逆向用例(例如整型变字符串)
任意组合可选参数,正向用例
与业务逻辑相关的,用户身份认证为空或者错误,逆向用例
字段的唯一性校验,如插入数据字段不能重复,发送两次请求,查看第二次返回结果
Postman工具使用
创建Collection
Add Folder
Add Request
常用变量
局部变量Variables
对于单个请求
比较少用
数据变量
txt/csv文件存储数据
参数化,批量执行接口测试
环境变量Environment
一般用户测试环境的区分
正式环境,预发布环境
集合变量Collection
针对于集合
集合下edit-Varables设置集合变量
全局变量Golable
变量的优先级及格式
引用格式:{{变量名}}
局部变量--数据变量--环境变量--集合变量--全局变量
传参脚本
获取token及传参
var data = JSON.parse(responseBody); pm.globals.set("token",data.token);
获取响应信息中的ID及传参
/获取前面请求的客户ID var data = pm.response.json(responseBody); pm.globals.set("Cid",data.obj.id); console.log("客户ID:"+pm.globals.get("Cid"));
常用变量的脚本
备注详情
![](https://i-blog.csdnimg.cn/blog_migrate/a2b7024cb6a8cccd23244148c90016f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/aa7790439652fcf252898472b6dc57b7.gif)
//1.设置环变量 pm.environment.set("hosttest", "192.168.1.1"); //获取环境变量 var env = pm.environment.get("hosttest"); console.log("1.获取设置的环境变量env:"+env); //2.设置全局变量 pm.globals.set("glo", "设置全局变量glo"); //获取全局变量 console.log("2.获取设置的全局变量:"+pm.globals.get("glo")); //3.设置局部变量 pm.variables.set("var","设置的局部变量var"); //获取局部变量 console.log("获取设置的局部变量var:"+pm.variables.get("var")); //4.集合变量在集合下edit--Varibles设置集合变量 //5.清除全局变量 pm.globals.unset("teID"); //6.清除环境变量 pm.environment.unset("env"); //7.创建请求,发送请求,登录操作 const echoPostRequest = { url: 'http://localhost/api/mgr/loginReq', method: 'POST', header: 'Content-Type:application/x-www-form-urlencoded', body: { mode: 'urlencoded', urlencoded: "username=auto&password=sdfsdfsdf", } }; pm.sendRequest(echoPostRequest, function (err, res) { console.log(err ? err : res.json()); });
常用断言脚本
备注详情
![](https://i-blog.csdnimg.cn/blog_migrate/a2b7024cb6a8cccd23244148c90016f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/aa7790439652fcf252898472b6dc57b7.gif)
常用断言: //1.状态码断言 pm.test("Status code is 200", function () { pm.response.to.have.status(200); }); //2.查看响应体中是否包含的内容 pm.test("Body matches string", function () { pm.expect(pm.response.text()).to.include("成功"); }); //3.响应值中JSON值的验证 pm.test("Your test name", function () { var jsonData = pm.response.json(); pm.expect(jsonData.code).to.eql("0000"); }); //4.查看响应体中包含的内容 pm.test("Body is correct", function () { pm.response.to.have.body("responsebodystring"); }); //5.查看响应头 Conten-Type 是否存在 pm.test("Content-Type is present", function () { pm.response.to.have.header("Content-Type"); }); //6.查看响应时间是否小于200毫秒 pm.test("Response time is less than 200ms", function () { pm.expect(pm.response.responseTime).to.be.below(200); }); //7.成功的响应状态码是否包含 pm.test("Successful POST request", function () { pm.expect(pm.response.code).to.be.oneOf([200,202]); }); //8.状态码包含的字符串 pm.test("Status code name has string", function () { pm.response.to.have.status("OK"); }); //9.xml格式转换json的格式 var jsonObject = xml2Json(responseBody); //10.为json数据使用tiny验证器 var schema = { "items": { "type": "boolean" } }; var data1 = [true, false]; var data2 = [true, 123]; pm.test('Schema is valid', function() { pm.expect(tv4.validate(data1, schema)).to.be.true; pm.expect(tv4.validate(data2, schema)).to.be.true; });
postman到处报告
本地导出
执行结合-->run-->export result
newman run 命令导出
安装Node.js
node -v命令显示版本即可
安装newman
安装命令:npm install newman -global
newman -v 显示版本即可
安装html报告格式库
安装命令:npm install -g newman-reporter-html
执行命令:
![](https://i-blog.csdnimg.cn/blog_migrate/a2b7024cb6a8cccd23244148c90016f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/aa7790439652fcf252898472b6dc57b7.gif)
newman run c.json(执行的集合文件) -g d.json(全局变量文件) -e e.json(环境变量文 件) -d csv.txt(数据文件) -n 6(迭代次数) --reporters html --reporter-html-export d: \2020\webapi\reporter.html(报告文件路径)
Fiddler工具使用
Fiddler抓包工作原理
就是客户端和服务器之间建立一个代理服务器,默认地址127.0.0.1,端口:8888
浏览器发送请求会先发送到fiddler,fiddler再发送到服务器
服务器的响应也是先发送到fiddler,fiddler在发送到客户端
Rules--Automatic Breakpotins
请求前断点Before Request
步骤
暂停抓包,进入响应的界面输入数据
回到页面进行数据提交
回到fiddler,webform修改请求数据
点击break on response -->run to completion 继续执行
使用场景
假设前台页面限制某个输入框只能输入20个字符
需要测试接口该输入框长度超过20个字符接口是怎么处理的
请求后断电After Response
步骤
设置请求后断点,页面操作,抓取数据
修改相应内容
run to completion 继续执行
查看页面数据
使用场景
假设你测试某个UI功能,其中某个字段的长度最大值是200,但是你的请求获取到的内容都很小
无法看到字段长度很长时界面的展示情况,那么,你可以修改响应报文,把返回的内容自行修改
AutoResponder自动响应
步骤
抓包请求
选择请求右击save-->response-->save response body
修改保存数据
启动autorespnseder
把刚才的请求add rule-->添加刚才修改的json文件-->save
刷新页面
使用场景
前端工程师设计好界面后,想调试一下页面效果,但是后端工程师接口功能还未完成,无法调试
此时,前端工程师可以把某些请求设置为自动应答,响应返回本地测试数据
Composer模拟器使用
步骤
开启抓包,发送请求(该请求要有参数)
拖动请求到compser中,绿色状态松开即可
修改请求参数
执行,会有新的请求加载,点击查看inspector中响应信息
使用场景
模拟后端,查看相应结果
Filters过滤器,域名过滤
只显示特定域名记录,Filters--勾选Use Filters--Hosts
选择Show only the following Hosts--输入需要显示的域名--点击actions生效
https抓包设置
tools-->option-->https-->左边选项进行勾选操作
tools-->option-->https-->action-->export 导出证书--浏览器导入证书
手机抓包设置
tools-->option-->connections-->设置好端口--勾选allow remote computers to connect--点击ok
手机设置
设置--无线局域网WIFi--代理设置--设置代理服务器电脑的ip(就是打开fiddler那台电脑的IP)--端口
手机浏览器--输入代理服务器电脑的ip+端口:如:192.168.3.8:8888
下载安装证书即可
手机弱网测试
Rules-->Customize Rules-->查找(ctrl+f)300数值--数值向上增加改值保存
启动Rules-->Performance-->勾选Simulte Modem Speeds
执行发送请求,弱网测试,看响应时间
参考地址:
https://www.processon.com/view/5e9fdf9ff346fb177b8b7627#map