JMeter上传文件和数据库操作
操作数据库常见的场景
- 准备、制造测试数据
- 获取、查询测试数据
- 清理测试环境、删除过程数据
- 数据库压测
数据库实战操作之一:制造测试数据
1、过程描述:通过Insert语句,向数据库中添加测试数据
2、使用语句类型:Prepared Update Statement
3、SQL语句:INSERT INTO `jmeter_class`.`user`(`username`,`password`) VALUES(XXX, XXX)
数据库实战操作之四:数据库压测
了解数据库性能
测试一下不同语句之间的性能差距
实战环境配置
- 四个JDBC请求
- insert 插入一条数据
- select 查询该条数据
- select count计数
- delete清楚数据
添加聚合报告
关于线程组
认识线程组
- 性能测试资源调度池
- 控制性能测试运行调度、参与人数(并发数)、执行策略
- 分类setup, teardown, normal
- 不同的分类在整个压测执行的生命周期内的执行时间点不同
线程组的配置参数
- 第一部分:在请求取样器执行错误时需要执行的下一步动作
- continue :继续执行
- start next thread loop :忽略错误,执行下一个循环
- stop thread :退出该线程(不再进行此线程的任何操作)
- stop test :等待当前执行的采样器结束后,结束整个测试
- stop test now:直接停止整个测试
- 第二部分:线程属性
- number of thread(users):线程数,模拟的用户数量
- Ramp-up Period(in seconds):达到指定线程数所需要的时间。举例:线程数设置为50,此处设置为5,那么每秒启动的线程数 -> 10个
- Delay thread creation until needed:当线程需要执行的时候,才会被创建。如果不选择这个选项,呢么,在计划开始的时候,所有需要的线程就都被创建好了
- Scheduler:时间计划,第三部分说明
- 第三部分:调度配置
- Duration(seconds):持续时间(秒),在此选项填入N,说明这个计划,从某个时间算起,执行N秒后结束。(会忽略 结束时间的选项)
- Startup delay(seconds):启动延时(秒),在此选项填入N,手动点击开始执行计划,然后延迟N秒后,计划菜真正开始执行。(会忽略 启动时间的选项)
setup线程组与teardown线程组
- setup线程组 - 压测执行准备阶段,准备测试数据,设定参数
- teardown线程组 - 压测执行结束之后清理数据,环境归零
JavaRequest实战技巧
为什么需要Java request呢?
- 不是所有的接口都是http协议
- 稀有协议的请求必须定制化用程序开发
- jmx本质上只是配置文件,不是程序代码
- 团队一起开发jmx会很头疼,JMeter UI中处理XML冲突!!
Java Request是啥?
- 纯Java程序,实现了JMeter中提供接口 - “JavaSamplerClient”
- 将Java程序集成到JMeter中,通过Java Request实现调度
- Java程序实现与压测“目标”的交互
- JMeter来控制Java程序的生命周期、并发调度、收集结果报告等处理
优势
- 自己写程序,流程控制自由、灵活
- 纯代码编程,源码管理方便,容易推进团队合作开发
- 只要Java程序可以实现的就是能够支持的
短板
- 必须学编程
- Java编程,入门曲线高,路上坑多
Java Request实例讲解
压测对象 Order service
交互接口Restful API
Java Request实现知识点
- Java Request 执行类必须继承AbstractJavaSamplerClient抽象类
- 各种Post Get Delete 请求需要使用Java的HttpClient来实现
- 接口请求之间的交互在Java代码中来控制
- HttpResponse中的Json返回值解析使用java中的json解析库来进行解析
- 除了最终的运行和数据交互需要进入jmeter,基本上已经俨然变成了java程序开发活动
Intellij Idea
Java Request 实例代码知识点汇总
Java Request 的入口类必须集成抽象类:AbstractJavaSamplerClient
关于Java Request类中函数的执行顺序:
- getDefaultParameters()
- setupTest(JavaSamplerContext context)
- runTest(JavaSamplerContext arg0)
- teardownTest(JavaSamplerContext arg0)
获取JMeter的全局变量函数
- arg0.getJMeterVariables();
获取Java Request中的变量
- public Arguments getDefaultParameters()
Java Request结果变量
- SampleResult sampleResult = new SampleResult();
Java Request 结果的成功与失败控制
- sampleResult.setSuccessful(true);
- sampleResult.setSuccessful(false);
Java Request结果内容数据
- sampleResult.setResponseData("".getBytes());
Java Request开始与结束时间
- sampleResult.sampleStart();
- sampleResult.sampleEnd();
Java Request实例代码知识点汇总
- Java Client 控制HTTP请求与相应的各种操作
- Java json解析返回值中的数据参数
- Maven依赖库配置与编译、打包、部署
打包工具:Maven
例子程序:https://github.com/ulibob/iJava_Request
java request程序jar包存放位置<jmerer_path>/lib/ext
JMeter依赖配置,需要将iJava_Request/jars/json-20080701.jar复制/粘贴到<jmeter_path>/lib/ext
JMeter监听器与压测监控
JMeter原生测试报告带来的“痛苦”
- 不具备实时性
- 报告中的数据是测试时间段内的平均值
- 长相问题
性能监控平台的优势
- 实时展示JMeter压测数据
- 数据范围可选
- 界面更友好
JMeter性能监控平台组成
- JMeter:压测工具,产生压测数据
- InfluxDB:开源时序数据库,特别适合用于处理和分析资源监控数据,用于存储压测数据
- Grafana:度量分析与可视化图标展示工具,可以支持不同种类的数据源,用于将存储于InfluxDB中的数据以图表的形式展示出来
性能监控平台部署 - InfluxDB
- 部署方法:Docker部署
- 事先准备:
- 安装Docker
- 下载influxDB镜像:
docker pull influxdb
- 启动influxDB容器
- 将influxDB容器命名为jmeterdb,执行docker创建容器命令:
docker run -d -p 8086:8086 -p 8083:8083 --name=jmeterdb influxdb
- 执行如下命令进入容器内部:
docker exec -it jmeterdb bash
- 在容器内部创建jmeter数据库,用于收集JMeter发送的压测数据
- 执行influx命令进入命令台
- 执行类sql语句 创建jmeter数据库:
create database jmeter;
- 创建完jmeter数据库之后执行如下命令验证数据库已经创建成功:
show databases;
docker常见基础命令汇总
- 列出已下载docker镜像: docker images
- 列出运行中的docker容器: docker ps
- 列出运行中 + 已停止docker容器: docker ps -a
- 停止容器: docker stop [docker container id]
- 启动容器: docker start [docker container id]
- 删除容器: docker rm [docker container id] (只有在停止的情况下删除)
性能监控平台部署 - JMeter
- 在JMeter线程组中添加 Backend Listener监听器
- 在Backend Listener implementation中选择InfluxdbBackendListenerClient
- 在influxdbUrl中配置实际URL端口和数据库
- 在application中填写order
- 在testTitle中填写Order Testing
- 其余配置保持不变
性能监控平台部署 - Grafana
- 部署方法:Docker部署
- 下载镜像:
docker pull grafana/grafana
- 启动镜像:
docker run -d -p 3000:3000 --name=jmeterGraf grafana/grafana
- 在grafana中添加数据源
- 选择 add data source
- 找到InfluxDB
- 单击选择该DB
- 配置InfluxDB数据源
- 输入URL :
http://[hostname or IP]:8086
- Access:browser
- Database:jmeter
- 其余参数保持默认值
- 在Grafana内导入JMeter Dashboard
- 进入Home Dashboard 页面,选择import
- 打开jmeter_dashboard.json文件
- 将json文本赋值/粘贴到paste JSON文本框中
- 单击load按钮导入
- 在DB NAME 中选择 influxDB
- 单击import按钮完成Dashboard导入
常用断言设置
断言:
- 响应断言(Response Assertion)
- 大小断言(Size Assertion)
- XPATH断言(XPATH Assertion)
- JSON断言(JSON Assertion)
- ……
性能测试场景设计
工具 vs 手段
- 压测工具 - JMeter
- 监控工具 - influxDB
- 自动化工具 - shell
- 手段 - 逐步加压,寻找系统的瓶颈
痛点是啥
- 客户反馈页面访问慢,是个别现象还是普遍现象?
- 不同地域的访问速度是什么?
- 稳定性?
- 功能测试和性能测试关注点不一样
- 运营情况,服务器死掉
- 系统发布不稳定(版本迭代时不能及时切换)
- 最大并发数 与 接口响应时间
短时大并发 vs长时小并发
- 合理的最大并发数
- 短时超限
- 系统的健壮性
- 运营系统的完备配置:监控、报警、灾备 等