接口协议相关概念
一、接口测试基本概念
- 接口:不同系统之间相互连接的部分,是一个传递数据的通道;
- 接口测试:检查数据的交换、传递和控制管理过程;
1、接口测试的价值
- 接口测试相比UI测试,可以更早发现问题,成本低,效率更高,发现问题更快,修复的代价也比较低;
- 接口大多数比较稳定,自动化测试成本更低,效果也更好;
- 接口测试也无法代替UI测试;
2、常见接口协议
(1)网络模型
应用层:为应用程序或用户请求提供各种请求服务。 OSI参考模型最高层,也是最靠近用户的一层,为计算机用户、各种应用程序以及网络提供接口,也为用户直接提供各种网络服务。
表示层:数据编码、格式转换、数据加密。 提供各种用于应用层数据的编码和转换功能,确保一个系统的应用层发送的数据能被另一个系统的应用层识别。如果必要,该层可提供一种标准表示形式,用于将计算机内部的多种数据格式转换成通信中采用的标准表示形式。数据压缩和加密也是表示层可提供的转换功能之一。
会话层:创建、管理和维护会话。 接收来自传输层的数据,负责建立、管理和终止表示层实体之间的通信会话,支持它们之间的数据交换。该层的通信由不同设备中的应用程序之间的服务请求和响应组成。
传输层:数据通信。 建立主机端到端的链接,为会话层和网络层提供端到端可靠的和透明的数据传输服务,确保数据能完整的传输到网络层。
网络层:IP选址及路由选择。 通过路由选择算法,为报文或通信子网选择最适当的路径。控制数据链路层与传输层之间的信息转发,建立、维持和终止网络的连接。数据链路层的数据在这一层被转换为数据包,然后通过路径选择、分段组合、顺序、进/出路由等控制,将信息从一个网络设备传送到另一个网络设备。
数据链路层:提供介质访问和链路管理。 接收来自物理层的位流形式的数据,封装成帧,传送到网络层;将网络层的数据帧,拆装为位流形式的数据转发到物理层;负责建立和管理节点间的链路,通过各种控制协议,将有差错的物理信道变为无差错的、能可靠传输数据帧的数据链路。
物理层:管理通信设备和网络媒体之间的互联互通。 传输介质为数据链路层提供物理连接,实现比特流的透明传输。实现相邻计算机节点之间比特流的透明传送,屏蔽具体传输介质和物理设备的差异。
2、常见接口协议
常见接口协议:
各接口协议之间的关系:
3、TCP与UDP–TODO
4、RPC协议
-
RPC(Remote Procedure Call);
-
以本地代码调用的方式实现远程执行;
-
主要用于公司内部的服务调用;
-
有点:传输效率更高、性能损耗更低、自带负载均衡策略、更好的服务治理能力;
-
常见的RPC协议:
- Dubbo:Java基础之上的高性能RPC协议;
- gRPC:高性能通用RPC框架,基于Protocol Buffers,PB是一个语言中立、平台中立的数据序列化框架;
- Thrift:与gRPC类似的多语言RPC框架;
5、HTTP(HTTPS)协议
(1)请求与相应
- 请求:
- 请求行:url、protocol、method、http版本号;
- 请求方法:get、post、put、delete、head;–(RESTful架构)
- 请求头:Host、Cookie、User-Agent、Connection、Content-Type、Accept等;
- 请求参数:query;
- 请求体:JSON、XML、FORM;
- 响应:
- 响应状态行:http版本号、响应状态码;
- 响应头:Connection、Content-Type、Date、Server、Keep-Alive;
- 响应体:;
(2)HTTP与HTTPS的区别
-
HTTP:
-
HTTP(HyperText Transfer Protocol:超文本传输协议)是一种用于分布式、协作式和超媒体信息系统的应用层协议。 简单来说就是一种发布和接收 HTML 页面的方法,被用于在 Web 浏览器和网站服务器之间传递信息。
-
HTTP 默认工作在 TCP 协议 80 端口,用户访问网站 http:// 打头的都是标准 HTTP 服务。
-
HTTP 协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,HTTP协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。
-
-
HTTPS:
-
HTTPS(Hypertext Transfer Protocol Secure:超文本传输安全协议)是一种透过计算机网络进行安全通信的传输协议。HTTPS 经由 HTTP 进行通信,但利用 SSL/TLS 来加密数据包。HTTPS 开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。
-
HTTPS 默认工作在 TCP 协议443端口,它的工作流程一般如以下方式:
- 1、TCP 三次同步握手;
- 2、客户端验证服务器数字证书;
- 3、DH 算法协商对称加密算法的密钥、hash 算法的密钥;
- 4、SSL 安全加密隧道协商完成;
- 5、网页以加密的方式传输,用协商的对称加密算法和密钥加密,保证数据机密性;用协商的hash算法进行数据完整性保护,保证数据不被篡改。
-
三、接口测试用例设计
1、接口测试测试点
- 功能测试:
- 单接口功能:
- 一个单独的业务,就对应一个独立的接口,如:登录业务,对应登录接口;—正向用例、反向用例、等价类、边界值…
- 业务场景功能:
- 多个接口被连续调用,模拟用户的实际使用场景;
- 单接口功能:
- 性能测试:
- 响应时长:从发送请求到接受到服务器回发响应包所经历的时间;
- 错误率:服务器运行出错的概率;
- 吞吐量:服务器在单位时间内,处于请求的数量,一秒内能接受多少个请求;
- 服务器资源使用率:cup、内存、网络、磁盘等硬件资源的占用率,服务器能否支撑客户端的访问;
- 安全测试:
- 业务安全:
- 必须登录才能访问用户数据;
- 敏感数据是否加密传输和存储:
- sql注入;
- 攻击安全:木马、病毒。。。由具备专业安全技术,会使用专业安全测试工具的安全测试工程师负责;
- 业务安全:
2、接口功能测试用例设计思路
- 单接口测试用例设计思路:
- 正向测试:
- 必填参数组合(注意默认值的校验);p0
- 必填+任意非必填组合;p2/p3
- 全部参数组合;p1
- 反向测试:
- 功能异常(覆盖反向需求)–数据格式正确,但是不能履行接口功能;p1
- 数据异常(空、类型不符、长度不符—等价类和边界值)–数据格式不正确;p2
- 参数错误码及对应提示信息;P2
- 参数异常(多出必选参数、少必选参、无参、错误参数名);p3
- 正向测试:
- 业务场景功能测试用例设计思路方法:—一定在单接口测试之后!
- 尽量模拟用户实际使用场景;
- 尽量用最少的用例,覆盖最多的接口请求;
- 一般情况下,覆盖正向测试即可,如果需要覆盖反向用例再说;
- 从功能业务用例转换,针对业务功能用例中操作步骤,分析对应的接口请求;p0
3、接口测试用例要素
- 用例编号
- 功能模块
- 用例名称
- 优先级
- 前置条件
- 接口地址
- 请求方式
- 请求头部
- 请求参数
- 预期结果
四、postman强化
**注意:**postman卡顿问题解决:设置环境变量;
变量名:POSTMAN_DISABLE_GPU
变量值:true
1、postman中变量
(1)postman中变量的种类和作用域及优先级
- Data:在测试集中上传的数据;
- Environment:环境范围;
- Collection:测试集范围;
- Global:全局范围;
- Local:在脚本中定义的局部变量;
- 同名变量优先级:Data → Environment → Collection → Global → Local;
(2)变量设置
- 环境变量Environment:Environments页面 - > +;
- 测试集变量Collection:Collection页面 - > Variables;
- 全局变量Global:Environments页面 - > Globals,或者在脚本中通过封装好的语句进行设置;
(3)变量的使用
- 请求URL、Params参数或Body表格或JSON/XML文本中通过
{{变量名}}
使用; - 在Pre-request Script和Tests脚本中使用封装好的语句获取或者设置对应变量;
// 保存全局变量token
pm.globals.set("ego_token",res_data.token)
// 获取全局变量保存的token
token = pm.globals.get("ego_token");
// 控制台打印
console.log(token)
// 获取用例集变量
pm.collectionVariables.get("id")
2、数据驱动
- 准备数据:JSON 或者 CSV 格式;
- JSON文件数据:整体是一个数组(
[]
),元素是每一个对象({}
),一个对象就是一条用例的数据;
- JSON文件数据:整体是一个数组(
- 修改参数设置;
- 修改断言;
- 在测试集中定义数据变量;
- Run运行测试集,选择准备好的数据,再运行用例
run XXX
;
3、测试集的导入和导出
- 注意:导出的测试集的名称和后置最好不要做任何修改;
4、使用 Cookies
- 如果站点的鉴权方式使用了cookie,那直接在postman中设置使用cookie即可;
- 1、先发送一个站点的请求,postman会自动保存cookie;
- 2、继续请求同一站点的另外接口,postman会把保存的cookie自动写入到header中;
- 3、也可以获取到cookie之后通过postman手动的添加cookie值–先添加域名,再添加cookie值即可;
5、鉴权方式
1、 API Key(接口定义的认证方式,比如token);
- 创建登录接口;
- 成功后在 Test 中提取 token;
- 保存 token 到测试集变量;
- 在
Authorization
中添加API Key
; - postman会自动在接口的header中传入设置的token信息;
或者:
- 也可以在请求前脚本
Pre-request Scrip
中设置变量;-----只是把登录获取token的接口放在了脚本中去执行,而不是单独的一个postman登录接口请求,个人感觉多此一举,只是提供了一种方式而已;
// 构造登录请求
const loginRequest = {
url: 'http://litemall.hogwarts.ceshiren.com/wx/auth/login',
method: "POST",
header: 'Content-Type: application/json',
body: {
mode: 'raw',
raw: JSON.stringify({'username': 'user123', "password": "user123"})
}
};
// 发送登录请求
pm.sendRequest(loginRequest, function (err, response) {
if (err) {
console.log(err);
} else {
console.log(response.json());
// 保存获取的token到测试集变量
pm.collectionVariables.set("token", response.json().data.token);
}
});
2、 默认的inherit auth from parent
从父类继承方式;
-
如果是token认证方式,直接在需要token的接口header中引用保持的测试集变量即可,这样还简单,此时的鉴权方式需要使用默认的
inherit auth from parent
从父类继承方式;
6、导出代码
五、Charles代理抓包工具
六、使用curl发送请求
1、 客户端模拟请求工具
- nc:tcp/udp 协议发送;
- curl:最常使用的 http 请求工具;
- postman:综合性的 http 协议测试工具;
- 代理工具、IDE 工具、浏览器插件工具;
2、curl常见用法
-
url=http://www.baidu.com
; - get请求
curl $url
; - post请求
curl -d 'xxx' $url
; - proxy使用
curl -x 'http://127.0.0.1:8080' $url
;
重要参数:
curl命令参数
-
-H "Content-Type: application/json"
消息头设置; -
-u username:password
用户认证; -
-d
要发送的post数据 @file 表示来自于文件; -
--data-urlencode 'page_size=50'
对内容进行url编码; -
-G
把data数据当成get请求的参数发送,长与–data-urlencode结合使用; -
-o
写文件; -
-x
代理 http代理 socks5代理; -
-v
verbose 打印更详细日志-s
关闭一些提示输出;