接口测试理论
一 概念
-
接口概念 : 系统与系统间数据交互的方式 (类似存取款时的验钞机)
-
接口测试 :
-
概念 : 校验预期结果与实际结果是否一致
-
特征 : 接口测试绕过前端,符合质量前移理念,低成本高收益
-
-
实现方式 : postman/jmeter/代码python+pytest+requests
HTTP协议
-
概念 :
- 超文本传输协议 : 基于客户端和服务器应用层协议
url格式
-
格式 : 协议://域名:端口号/资源路径?查询参数
-
协议 : 数据传输的方式
- http(80)和https(443)
-
域名(本质IP地址) : 网络地址中,定位一台主机
-
端口号 : 网络环境中,定位一个进程(应用程序)
-
资源路径 : 指定要访问的数据资源,没有默认为/
-
查询参数 : 给数据资源传递的参数,使用k=v键值对的方式
-
请求行
-
组成 : 请求方法 URL 协议版本(默认为http/1.1)
- 请求方法 : get(查) , post(添加,用于注册与登录) , delete(删) , put(修改)
请求头
-
内部所有数据采用k:v格式
-
Content-Type : 描述请求体数据类型
-
application/json : 请求体为json格式数据
-
application/x-www-form-urlencoded : 请求体为表单格式数据类型
-
-
请求体中的数据类型受请求头中的Content-Type的值影响
http响应
-
收到http请求后,回发响应数据
-
组成 : 协议版本 状态码 状态码描述
-
1xx : 指示性信息
-
2xx : 成功类信息,200 OK
-
3xx : 重定向类信息
-
4xx : 语法错误(客户端错误) 404 Not Found
-
5xx : 服务器端错误
-
响应头(体) :
-
数据组织格式为k:v的键值对格式
-
响应体中 包含测试需要的实际结果,不受请求方法影响.
接口测试流程
-
需求分析 : 产品经理产出需求文档
-
接口文档解析 : 开发产出
-
编写接口测试用例
-
编写接口测试脚本
-
工具生成脚本(postman)
-
python代码编写生成脚本
-
-
执行脚本 , 跟踪缺陷
-
生成测试报告
-
(可选)接口自动化持续集成
解析接口文档
-
什么是接口文档
- api文档,描述接口信息
-
核心目标 :
-
http请求相关数据 : 请求方法 , URL , 请求头 , 请求体(数据类型)
-
http响应数据(预期结果) : 响应状态码 响应体
-
Postman示例
-
示例1 : 传递参数查询,在tpshop中查找iphone
-
示例2 : 提交表单数据
-
示例3 : 提交json数据
接口用例设计
-
功能测试:
-
单功能业务 : 一个业务就对应一个接口,eg : 登录业务---登录接口,注册业务---注册接口,修改员工---修改员工接口
-
业务场景功能 : 按照用户的使用场景,模拟连续调用多个接口,测试功能正确性
-
-
性能测试
-
响应时长 : 从请求发送到接受服务器响应所需要的所有时间
-
吞吐量 : 衡量服务器处理并发请求的能力,参考TPS查看
-
错误率 : 处理请求失败的比率
-
服务器资源利用率(CPU,内存 IO等): 系统资源使用情况
-
Postman断言
- 概念 : 借助postman,程序判断预期结果与实际结果是否一致,断言写在Tests标签中
常用断言
-
断言响应状态码
-
步骤 : New Collection ----> New Request ----> Scripts -----> Snippets选中状态码生成对应代码
-
适当调整test()方法参数和匿名函数中的预期结果
-
点击send按钮发送请求,执行断言代码,查看断言结果
-
Status code : Code is 200
//断言响应状态码是否为200
pm.test("Status code is 200", function () {pm.response.to.have.status(200);
});
pm代表postman一个实例
test()是pm一个方法,有两个参数,// 参数1:在断言结束后给出的文字提示:"Status code is 200"可以修改// 参数2:匿名函数
pm.response.to.have.status(200);
// postman响应结果中应该包含状态码200
关联
-
解决的问题:应用于多个http请求之间,有数据关联或依赖关系
-
依赖 : 1个http请求响应结果中的数据,被另一个http请求使用
- eg : 登录http请求,返回的令牌被添加员工请求依赖(请求头中使用),可以使用postman关联技术
-
实现步骤 :
A接口响应结果,被B接口依赖
-
发送A接口请求,得到响应结果
-
将响应结果关联数据,存入公共容器 [全局变量或环境变量] 中
-
B接口从公共容器中提取数据,发送B接口请求
核心代码
-
获取响应结果: var jsonData = pm.response.json();
-
将数据设置到全局 环境变量中.
-
全局变量:pm.globals.set(“全局变量名”,全局变量值),唯一且不可重复定义,整个 postman全局生效的变量.
-
环境变量:pm.environment.set(“环境变量名”,环境变量值)在特定(生产开发测试环境)下才能使用的变量
-
-
示例1 : 请求获取天气接口(B接口),提取响应结果中的城市名(全局变量),将城市名给百度搜索接口(A接口)使用
-
get 方法 获取http://www.weather.com.cn/data/sk/101010100.html数据
-
在scripts-response响应中定义全局变量
// 1.获取响应结果 var jsondata = pm.response.json() // 2.一层一层获取 var city = jsondata.weatherinfo.city // 2.将获取结果设置为全局变量 pm.globals.set("glb_city",city)
-
查看百度获取天气结果
-
-
示例2 : 添加员工
-
登录成功提取令牌,创建新环境并切换,并将令牌保存至环境变量
-
添加员工,在Headers中写入环境变量
-
Postman参数化
-
数据文件简介
-
csv格式
-
优点 : 组织形式简单,适用于数据量大,数据组织格式简单
-
缺点 :
-
不能测试 bool 类型,postman读取csv文件会将所有非数值类型数组自动添加""变为字符串
-
不能存储复杂数据类型元组,列表,嵌套字典
-
不支持多少错误无参的接口测试
-
-
-
csv导入外部数据文件
-
数据写入到csv文件中,第一行写入的是数据对应的"字段名",第二行向后依次是对应的数值,数据间用逗号隔开
-
在postman中选中使用数据文件的用例集,导入数据文件,在runner中导入
-
-
json格式
-
优点 : 支持bool类型,支持多少错误无参类型,支持复杂数据类型,适用于数据量较少,数据组织格式复杂
-
缺点 :
-
对于相同数据量,json数据文件大小大于csv文件
-
按照语法写入json数据,数据最外层必须是[ ],内部数据用{ },无论是否字符串都可以""包裹值
-
适用于测试数据量较少,需要进行参数测试!!!(其它导入步骤同理csv)
-
-
-
示例1 : 查询运营商
-
导入csv文件测试,并替换字段
-
测试结果(我这个有问题但不报错,正确结果应该是三个都通过)
生成测试报告
-
准备工作 :
-
导出测试用例集.json
-
导出环境文件json
-
打开终端
newman run 测试用例集文件.json -e 环境文件.json -r html --reporter-html-export 测试报告名.html或newman run 测试用例集文件.json -e 环境文件.json -r htmlextra --reporter-htmlextra-export 测试报告名.html
-