接口测试理论
一 概念
- 
接口概念 : 系统与系统间数据交互的方式 (类似存取款时的验钞机) 
- 
接口测试 : - 
概念 : 校验预期结果与实际结果是否一致 
- 
特征 : 接口测试绕过前端,符合质量前移理念,低成本高收益 
 
- 
- 
实现方式 : 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 
 ![image]() 
 ![image]() 
- 
示例2 : 提交表单数据 
 ![image]() 
 ![image]() 
- 
示例3 : 提交json数据 
 ![image]() 
接口用例设计
- 
功能测试: - 
单功能业务 : 一个业务就对应一个接口,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数据 
 ![image]() 
- 
在scripts-response响应中定义全局变量 // 1.获取响应结果 var jsondata = pm.response.json() // 2.一层一层获取 var city = jsondata.weatherinfo.city // 2.将获取结果设置为全局变量 pm.globals.set("glb_city",city)
- 
查看百度获取天气结果 
 ![image]() 
 
- 
- 
示例2 : 添加员工 - 
登录成功提取令牌,创建新环境并切换,并将令牌保存至环境变量 
 ![image]() 
 ![image]() 
- 
添加员工,在Headers中写入环境变量 
 ![image]() 
 
- 
Postman参数化
- 
数据文件简介 - 
csv格式 - 
优点 : 组织形式简单,适用于数据量大,数据组织格式简单 
- 
缺点 : - 
不能测试 bool 类型,postman读取csv文件会将所有非数值类型数组自动添加""变为字符串 
- 
不能存储复杂数据类型元组,列表,嵌套字典 
- 
不支持多少错误无参的接口测试 
 
- 
 
- 
- 
csv导入外部数据文件 - 
数据写入到csv文件中,第一行写入的是数据对应的"字段名",第二行向后依次是对应的数值,数据间用逗号隔开 
 ![image]() 
- 
在postman中选中使用数据文件的用例集,导入数据文件,在runner中导入 
 ![image]() 
 ![image]() 
 
- 
- 
json格式 - 
优点 : 支持bool类型,支持多少错误无参类型,支持复杂数据类型,适用于数据量较少,数据组织格式复杂 
- 
缺点 : 
 - 
对于相同数据量,json数据文件大小大于csv文件 
- 
按照语法写入json数据,数据最外层必须是[ ],内部数据用{ },无论是否字符串都可以""包裹值 
- 
适用于测试数据量较少,需要进行参数测试!!!(其它导入步骤同理csv) 
 ![image]() 
 
- 
 
- 
- 
示例1 : 查询运营商 
 ![image]() 
- 
导入csv文件测试,并替换字段 
 ![image]() 
 ![image]() 
- 
测试结果(我这个有问题但不报错,正确结果应该是三个都通过) 
 ![image]() 
生成测试报告
- 
准备工作 : - 
导出测试用例集.json 
- 
导出环境文件json 
- 
打开终端 
 newman run 测试用例集文件.json -e 环境文件.json -r html --reporter-html-export 测试报告名.html或newman run 测试用例集文件.json -e 环境文件.json -r htmlextra --reporter-htmlextra-export 测试报告名.html
- 


















