一:接口
1.概念
- 是指系统或组件之间的交互点,通过这些交互点可以实现数据的交互。(数据交互的通道)
2.接口的类型
- 按协议划分:http、tcp、IP
- 按语言划分:C++、java、php。。。
- 按范围划分:
- 系统之间:
- 内部系统与内部系统之间
- 内部系统与外部系统之间
- 程序之间
- 方法与方法之间
- 函数与函数之间
- 模块与模块之间
- 系统之间:
二:接口测试
1.概念
- 接口测试就是,对系统或组件之间的接口进行测试。校验传递的数据正确性和逻辑依赖关系的正确性
2.原理
- 接口测试,主要针对的测试目标 —— 服务器
- 怎么测?
- 模拟客户端向服务器发送请求。
- 用什么测?
- 工具:fiddler、postman、jemter
- 代码:python + UnitTest框架 + Requests框架
- 测什么?
- 测试服务器针对客户端请求,回发的响应数据是否与预期结果一致!
3.特点
- 符合质量控制前移的理念
- 可以发现一些页面操作发现不了的问题
- 接口测试低成本高效益
- 接口测试是从用户的角度对系统进行检测
三:HTTP协议
1.概念
- 超文本传输协议,是一个基于请求与响应模式的、应用层的协议,也是互联网上应用最为广泛的一种网络协议。
2.HTTP协议的特点
- 支持客户端/服务器模式
- 简单快速
- 灵活
- 无连接
- 无状态
3.URL格式
- 概念:统一资源定位符,是互联网上标准资源的地址。HTTP使用URL来建立连接和传输数据。
- 作用:在网络环境中,唯一的定义一个数据资源。
- 协议:http。规定数据传输的方式
- 域名(IP):在网络环境中找到主机。——用 😕/ 与协议隔分
- 端口(port):在网络主机上,标识一个进程(应用程序)——用 : 与域名
- 资源路径:标识网络资源(文件、图片、音视频、变量。。。)——用 / 与端口隔分
- 查询参数:传递给资源路径对应的数据。——用 ? 与资源路径隔分。参数之间用 & 隔分
四:HTTP请求
- 作用:
- 客户端(app、浏览器),发送请求给服务器时,使用的协议——http请求协议
- 规定发送给服务器的数据传输的语法格式
1.请求行
- http请求方法:
- GET:查询
- POST:添加(常用在登录)
- PUT:修改
- DELETE:删除
2.请求头
- 语法格式:k : v
- User-Agent:产生请求的浏览器类型
- Content-Type:请求体的数据类型
- application/json:JSON数据格式
- application/x-www-form-urlencoded:form表单数据
3.请求体
- GET、DELETE 方法没有请求体
- PUT、POST 方法有请求体
- 数据值的组织形式,受 Content-Type 的值影响
五:HTTP响应
作用
- 服务器端,针对客户端发送的 http 请求,回发响应数据。 ——http应答!
- 规定回发给客服端的数据组织格式
1.响应行(状态行)
- 版本协议 状态码 状态描述
- 1XX:指示信息–表示请求已接收,继续处理
- 2XX:成功–表示请求已被成功接收、理解、接受
- 3XX:重定向–要完成请求必须进行更进一步的操作
- 4XX:客户端错误–请求有语法错误或请求无法实现
- 5XX:服务端错误–服务器未能实现合法的请求
2.响应头:
-
语法格式:k : v
-
Content-Type:描述响应体中数据类型。
3.响应体:
-
绝大多数不为空(请求成功:回发数据,失败:回发错误信息)
-
数据类型受 Content-Type值影响
六:接口测试流程
1.需求分析
- 主要依据需求文档
2.接口文档解析
- 一般是由开发人员编写接口文档(API文档)
3.设计测试用例
4.执行用例
- 使用接口测试工具实现
- 通过编写代码实现
5.接口缺陷管理与跟踪
6.生成测试报告
7.接口自动化持续集成(可选)
七:接口文档(结构)
- 基本信息:
- 资源路径(协议和域名在“系统信息中”)
- 请求方法
- 接口描述
- 请求参数:
- 请求头:
- Content-Type:描述请求体的数据类型
- 请求体:
- 实现该接口使用的数据及对应类型
- 请求头:
- 返回数据:
- 成功:状态码 200
- 失败:错误码 (自定义状态码)
- 码值
- 描述信息
八:接口测试分类
1.功能测试
-
单接口测试
-
手工测试中的单个业务模块,一般对应一个接口。
-
登录业务 ——> 登录接口
-
加入购物车业务 ——> 加入购物车接口
-
订单业务 ——> 订单接口
-
支付业务 ——> 支付接口
-
借助工具、代码。绕开前端界面,组织接口所需要的数据,展开接口测试。
-
-
-
业务场景功能:
- 按照用户实际 使用场景 ,梳理 接口业务 场景。
- 组织业务场景时,一般只需做 正向 测试即可(与手工一致),
- 一般建议用最少的用例覆盖最多的业务场景
- 登录 —— 搜索商品 —— 加购物车 —— 下单 —— 支付 —— 评价
2.性能测试
- 响应时长
- 吞吐量
- 并发数量
- 服务器资源利用率
3.安全测试
- 攻击安全:由专业安全测试工程师完成。
- 业务安全:
- 敏感数据是否加密
- SQL注入
九:接口测试设计方法与思路
1.数值
- 与功能测试数值一致
2.参数
1.正向参数:
- 必选参数:所有的 必选(必填)都包含。
- 组合参数:所有的 必选 + 任意一个或多个可选参数
- 全部参数:所有的 必选 + 所有的可选参数
2.逆向参数:
- 多参:多出一个或多个 非 必选参数(可以任意指定)
- 少参:缺少一个或多个必选参数。
- 无参:没有必选参数。
- 错误参数:参数名输入错误。
十:单接口测试用例
接口测试用例文档要素:
-
用例编号、用例标题、模块/项目、优先级、前置条件、请求方法、URL、请求头、请求体(请求数据)、预期结果
-
例
十一:postman断言
1.断言响应状态码
Status code is 200
// Status code is 200 提示信息
// function 判断状态码是否是200
pm.test("Status code is 200", function () {
pm.response.to.have.status(200);
});
2.判断响应体是否包含某个字符串
Response body : Contains string
pm.test("Body matches string", function () {
pm.expect(pm.response.text()).to.include
// string_you_want_to_search: 所包含的内容
("string_you_want_to_search");
});
3.断言响应体是否等于某个字符串(对象)
Response body : Is equal to a string
// 例
// json数据
{
"success": true,
"code": 10000,
"message": "操作成功!",
"data": "d66ea2d3-c794-4ab4-80e4-1717531b4878"
}
// 断言判断数据
pm.test("Body is correct", function () {
pm.response.to.have.body({
"success": true,
"code": 10000,
"message": "操作成功!",
"data": "d66ea2d3-c794-4ab4-80e4-1717531b4878"
});
});
4.断言json数据
Response body : JSON value check
// 断言json响应结果
/*pm.test("Your test name", function () {
var jsonData = pm.response.json();
pm.expect(jsonData.value).to.eql(100);
});*/
// json数据
{
"success": true,
"code": 10000,
"message": "操作成功!",
"data": "d66ea2d3-c794-4ab4-80e4-1717531b4878"
}
// json断言判断
pm.test("Your test name", function () {
var jsonData = pm.response.json();
pm.expect(jsonData.success).to.eql(true);
pm.expect(jsonData.code).to.eql(10000);
pm.expect(jsonData.message).to.eql('操作成功!');
});
5.断言响应头
Response headers :Content-Type header check
pm.test("Content-Type is present", function () {
pm.response.to.have.header("Content-Type",
"application/json;charset=UTF-8");
});
十二:变量
1.设置变量
- 全局变量
- 手动设置
- 代码设置:pm.globals.set(“var_name”,value);
- 环境变量
- 手动设置
- 代码设置:pm.environment.set(“var_name”,value);
2.获取变量值
- 全局变量值
- 请求参数中获取:{{var_name}}
- 代码中获取:var value = pm.globals.get(“var_name”);
- 环境变量
- 请求参数中获取:{{var_name}}
- 代码中获取:var value = pm.environment.get(“var_name”);
十三:postman工作原理图
十四:postman测试报告
- 执行测试
# 1.批量执行测试用例集
# 2.导出Export用例集
# 3.终端执行命令
newman run 测试脚本文件 -e 环境变量文件 -d 测试数据文件 -r html --reporter-html-export report.html
- 例
newman run 接口数据关联.postman_collection.json -r html --reporter-html-export report.html
十五:参数化
1.CSV参数
2.Json参数
十六:提取和使用登录令牌
- Json数据
{
"success": true,
"code": 10000,
"message": "操作成功!",
"data": "b426880c-e94b-47d9-a0d0-414aa80c1924"
}
- 环境变量存储
// 拼接 data 的值,添加 bearer 和 空格。组成合法令牌
// 获取响应体
var jsonData = pm.response.json()
// 提取 data 的值
var tmp_token = jsonData.data
// 拼接 Bearer 和 空格 到 data 值的前面
var tmp = "Bearer" + " " + tmp_token
pm.environment.set("env_token",tmp)
1.环境变量的配置
- 考虑到登录和员工管理的请求URL部分相似,所以配置到环境变量中
2.登录令牌的提取
-
登录成功后会分配一个 token 令牌,便于后续判断身份,所以将 token 设为环境变量
-
// 目的:将登录返回的 data 值拼接成 token:Berarer data值 // 1.获取登录返回响应值 var jsonData = pm.response.json() // 2.提取响应值里的 data 值 var tmp_token = jsonData.data // 3.进行拼接 var tmp = "Bearer" + " " + tmp_token // 4.存到环境变量中 pm.environment.set("env_token",tmp)
3.令牌的使用
- 在请求URL的时候一起将令牌的值传入
-
// 目的:将登录返回的 data 值拼接成 token:Berarer data值 // 1.获取登录返回响应值 var jsonData = pm.response.json() // 2.提取响应值里的 data 值 var tmp_token = jsonData.data // 3.进行拼接 var tmp = "Bearer" + " " + tmp_token // 4.存到环境变量中 pm.environment.set("env_token",tmp)
3.令牌的使用
- 在请求URL的时候一起将令牌的值传入
=====================待续…