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长时小并发
  • 合理的最大并发数
  • 短时超限
  • 系统的健壮性
  • 运营系统的完备配置:监控、报警、灾备 等