文章目录
一、什么是接口、接口测试,为什么要做接口测试?
API,应用编程接口,简称接口;通过接口,可以是程序和程序之间,能够相互交互;
接口分为两大类:基于TCP全双工(不适用于Postman)和基于HTTP半双工(适用于Postman)
接口测试是测试项目和项目之间,模块和模块之间,组件和组件之间的数据交互和权限鉴定。
二、接口分类
内部:开发的接口给内部系统使用
外部:①被测项目调用外部接口;②被测项目提供接口给外部使用
测试重点: 接口功能正确性,参数的正确性,异常的处理能力,鉴权,兼容性
性能测试步骤:
- 性能测试准备 ①需求分析; ②明确性能测试目标(指标值); ③了解软件功能制定测试计划; ④编写测试用例; ⑤执行测试用例并得到测试报告。
- 搭建性能测试环境
- 性能脚本开发
- 性能测试脚本执行
- 结果分析与调优
- 测试报告与结果追踪
http协议
HTTP协议是一种超文本传输协议,是客户端和服务端互交数据,分为请求和响应两个部分;
请求:请求行(请求方式和请求路径),请求头,请求报文
请求方式:get post put delete
请求路径:url
请求头:Accept : application/json指定客户端接受的数据格式;
X-Requested-with :异步请求(登录,ajax);
User-Agent :客户端的类型;
Content-Type :客户端发送的数据的类型;
Cookie :服务器返回给客户端并且保存的Cookie信息。
响应:响应行(响应码和响应信息),响应头,响应报文
- 1xx : 指示信息 – 表示请求已接收,继续处理
- 2xx : 成功 – 表示请求已被成功接收,理解
- 3xx : 重定向 – 要完成请求必须进行更进一步的操作
- 4xx : 客户端错误 – 请求有语法错误或请求无法实现
- 5xx : 服务器端错误 – 服务器未能实现合法的请求
三、Jmeter介绍
什么是JMeter?
JMeter是一款Java开源工具,用于性能负载测试,它旨在分析和衡量Web应用程序和各种服务的性能和负载功能行为。
JMeter工作原理?
JMeter就像一群将请求发送到目标服务器的用户一样,他收集来自目标服务器的响应以及其他统计数据,这些统计数据通过图形或表格显示应用程序或服务器的性能。
性能测试指标:①响应时间;②并发用户数;③吞吐量;④系统性能计数器;⑤思考时间
- 响应时间(2 5 8):对请求做出响应所需要的时间,使用户感知软件性能的主要指标,响应时间包括:用户客户端响应时间、请求/响应数据网络传输时间、应用服务器处理时间、数据库系统处理时间
- 并发用户数 用户数包括:系统用户数(软件系统注册的用户总数);在线用户数(某时间段内访问的用户数,这些用户只是在线,但不一定同时做某一件事情);并发用户数(某一个事件同时向软件系统提交请求的用户数)
- 吞吐量 性能测试:指单位时间 内系统处理用户的请求数 从业务角度看:吞吐量可以用:请求数/秒,页面/秒 人数/天 或 处理业务数/小时等单位来衡量 从网络角度看:吞吐量可以用字节/s来衡量 对于交互式应用来说,吞吐量指标反映的是服务器承受的压力,能够说明系统的负载能力 TPS:每秒事务数 -> 吞吐率 以不同方式表达的吞吐量可以说明不同层次的问题 以字节数/秒方式:表示要受网络基础设施,服务器架构,应用服务器制约等方面的瓶颈; 已请求数/秒方式:主要是受应用服务器和应用代码的制约体现出的瓶颈。 公式 : F=VUR/T=1001/5=20 F:吞吐量 VU:表示虚拟用户个数 R: 表示每个虚拟用户发出的请求数 T:表示性能测试所用的时间
- 系统性能计数器:描述服务器或操作系统性能的一些数据指标 内存 CPU磁盘等资源使用率使用资源监控
- 思考时间:消息和消息之间发送的间隔时间 从业务角度来看,这个时间指用户进行操作时每个请求之间的时间间隔; 在做性能测试时,为模拟这样的时间间隔,引入了思考时间这个概念更加真实的模拟用户的操作。
backups:备份目录,jmx的脚本。自动的保存你的接口项目。
bin目录:存放jmeter的启动脚本,配置文件,模块文件。
jmeter.bat,启动文件
jmeter.propties全局配置文件
如果要修改为中文,则在此配置 language = zh_CN
docs离线帮助文档
extras存放和第三方集成构建文件。比如: Ant, build.xml
lib 库文件,jar包
licenses许可证文件
printable_docs用户手册
组件(元件)介绍
- 测试计划:jmeter的起点和容器
- 线程组:代表一定的虚拟用户
- 取样器:发送请求的最小单元
- 逻辑遥控器:控制组件的执行顺序
- 前置处理器:在请求之前的操作
- 后置处理器:在请求之后的操作
- 断言:判断请求是否成功
- 定时器:是否延迟或者间隔发送请求
- 配置元件:取样器的配置信息
- 监听器:负责收集测试结果
执行顺序:测试计划 -> 线程组 -> 配置元件 -> 前置处理器 ->定时器 ->取样器 -> 后置处理器 -> 断言 -> 监听器(察看结果树)
定时器:固定,高斯,同步
作用域:组件会作用于它的父级组件,同级组件以及同级组件的子组件 。
接口测试流程
1:拿到接口文档(抓包、录制),熟悉接口业务,接口地址,鉴权,入参,出参,错误码,兼容。
2:接口测试用例的设计和评审
正例:
反例:①鉴权反例(必填,错误,鉴权码过期…)
②参数反例(必填,参数类型异常,参数长度异常)
③其他场景(黑名单,调用次数限制,分页场景)
④兼容性(一个接口对应多个版本App)
3:执行接口测试
4:团队协作,持续集成并生成报告发送邮件等。
Jmeter接口测试
cookie鉴权(HTTP Cookie管理器)的原理:
客户端第一次访问服务器,服务器就会自动生成Cookie,然后通过响应头里的Set-Cookie传输到客户端,然后保存客户端;
第2~N次访问服务器时,那么在请求头里面通过Cookie把我们保存在本地的Cookie信息传输到服务器以实现鉴权。
接口关联
1:正则表达式提取器
2:Jsonpath提取器
① $ 表示根目录
②取子节点 $[“access_token”]
③取得复杂节点的值(结合下标和子节点用法) $.tags[17].name
当没有接口文档时,如何使用jmeter录制和创建脚本
①抓包
②badboy
③jmeter自带的HTTP代理服务器
新建线程组 -> 新建代理服务器(测试计划上:非配置元件->代理服务器) -> 端口8888 -> 目标控制器:设置为你录制的目标线程组 -> Type:默认httpclient4 -> 启动,运行代理服务器 -> 客户端设置:让客户端的请求通过代理服务器发送 -> 客户端设置:让客户端的请求通过代理服务器发送。 在控制面板 -> Internet选项 -> 连接 -> 局域网配置
④调试接口测试脚本
Jmeter执行数据库操作
① 引入数据库的驱动jar包;放到jmeter/lib目录下
② 新建JDBC connection configuration
四、Postman接口测试
(一)请求
1.请求方法
2.接口地址 URL
3.查询字符串 GET参数,会成为URL的一部分
4.鉴权方式:
- 继承上级
- 不需要鉴权
- APIKEY:常用,在请求头添加指定的内容
- Bearer Token:有明确约定的使用方式
- 其他… 5.请求头:key-value结构 ,支持批量编辑Bulk edit 6.请求正文
- form-data:表单(会进行编码) kv结构+文件上传
- x-www-form-urlencoded : 表单(会进行编码) kv结构
- raw:原始内容(不会进行编码) json传递数据
- binary:选一个文件会将二进制内容上传
- GraphQL:特殊的接口类型
json的数据格式:
基本特点:数据结构简单,适合程序解析
基本数据类型:数字、字符串、布尔值、空值null
容器数据类型:数组、对象
特殊的规范:①字符串一定使用双引号
②容器的最后一项,不加逗号
7.请求预处理:请求发送之前执行js,改变请求
8.测试用例:响应收到后执行js,断言响应
9.设置:改变传输细节
10.发送请求
11.cookies:自动更新,自动发送; 可以禁用
接口四要素:方法、地址、鉴权、参数
(二)响应
1.响应方式
- 查看方式:美化、原始、浏览器预览、自定义可视化
- Cookie
- 响应头
- 测试结果
- 状态码、耗时、文档大小
(三)环境
- 环境和变量
- 生成代码
- 控制台
(四)使用集合来管理请求
- 创建集合
- 创建文件夹
- 创建请求
(五)场景引用
1.接口关联
第二个接口,需要第一个接口的数据时,需要用到接口关联
最常用的方式:使用变量
①创建变量 ② 使用变量
步骤:
获取变量
使用变量:从变量值取值
{{vars}}
2.Postman中的变量
①变量是一个标签,代表着一个动态改变的值;
②创建变量
1).变量有作用域:GCEDL
基本规则:作用域优先级,范围越小优先级越高
G:全局变量 C:集合变量 E:环境变量
③设置变量值
1).创建时
2).选中字符串时
(六)局限性
- 所有操作都是手动的,需要进化成自动
- 自动的断言响应,需要进化成测试用例
- 参数化测试,自动构建请求
(七)Postman脚本
1.使用js语言;
let a ;
a =1+1;
console.log(a)
2.pm对象
(八)自动完成接口关联
1:json引用
//接口响应
console.log(pm.response.json())//获取tokenlet token = pm.response.json().access_token
console.log(token)//自动保存到全局变量
pm.globals.set('token',token)
2:正则表达式
处理非结构化文档
//接口响应
console.log(responseBody)//re的方式获取tokenlet token = responseBody.math('"access_token":"(.*?)"')
console.log(token)//自动保存到全局变量
pm.globals.set('token',token[1])
3:自动断言封装
- pm.test:创建测试用例
- pm.expect:创建预期条件,进行断言
底层使用BDD测试框架
① 内置的断言示例
pm.test("Status code is 200",function(){
pm.response.to.have.status(200);//断言状态码});
pm.test("Body matches string",function(){
pm.expect(pm.response.text()).to.include("string_you_want_to_search");//断言响应正文包含指定字符});
pm.test("Your test name",function(){var jsonData = pm.response.json();
pm.expect(jsonData.value).to.eql(100);//断言json值==100});
pm.test("Body is correct",function(){
pm.response.to.have.body("response_body_string");//断言响应正文完全相等});
pm.test("Content-Type is present",function(){
pm.response.to.have.header("Content-Type");//断言响应头});
pm.test("Response time is less than 200ms",function(){
pm.expect(pm.response.responseTime).to.be.below(200);//断言响应时长小于等于200});
pm.test("Successful POST request",function(){
pm.expect(pm.response.code).to.be.oneOf([201,202]);//断言状态码[201,202]之间});
pm.test("Status code name has string",function(){
pm.response.to.have.status("Created");//断言状态文本});
状态码201的文本是Created
② 断言的封装
集合:统一断言条件
//响应耗时 小于3000ms
pm.test("响应耗时 小于3000ms",function(){
pm.expect(pm.response.responseTime).to.be.below(3000)})//响应字节 小于10MB
pm.test("响应字节 小于10MB",function(){
pm.expect(pm.response.responseSzie).to.be.below(1024*1024*10)})
请求:专属的断言条件
状态码、数据格式、数据值
版权归原作者 丢丢丢Dr. 所有, 如有侵权,请联系我们删除。