jmeter简介
jmeter基本概念
- Apache JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试领域。 它可以用于测试静态和动态资源,例如静态文件、Java 小服务程序、CGI 脚本、Java 对象、数据库、FTP 服务器, 等等。JMeter 可以用于对服务器、网络或对象模拟巨大的负载,来自不同压力类别下测试它们的强度和分析整体性能。另外,JMeter能够对应用程序做功能/回归测试,通过创建带有断言的脚本来验证你的程序返回了你期望的结果。为了最大限度的灵活性,JMeter允许使用正则表达式创建断言
jmeter的优点
- 开源免费,基于Java编写,可集成到其他系统可拓展各个功能插件
- 支持接口测试,压力测试等多种功能,支持录制回放,入门简单
- 相较于自己编写框架活其他开源工具,有较为完善的UI界面,便于接口调试
- 多平台支持,可在Linux,Windows,Mac上运行
- 支持的协议
- web:HTTP,HTTPS站点的Web1.0的Web 2.0 (ajax, flex and flex-ws-amf)
- Web Services: SOAP / XML-RPC
- 通过JDBC驱动程序的数据库
- 目录: LDAP
- 面向消息的服务通过JMS
- Service: POP3, IMAP, SMTP
- FTP 服务
jmeter安装
- 1、下载JDK文件安装,并配置环境变量
- 2、jmeter官网下载解压
- 3、bin目录下的jmeter.bat启动即可
- 4、汉化和乱码解决
- 在bin目下修改jmeter.properties文件
- sampleresult.default.encoding=utf-8
- language=zh_CN
- 在bin目下修改jmeter.properties文件
jmeter目录结构
- bin目录(常用文件介绍)
- examples:目录下包含Jmeter使用实例
- ApacheJMeter.jar:JMeter源码包
- jmeter.log:JMeter运行日志文件
- jmeter.properties:JMeter配置文件
- 属性log_level.Jmeter(日志详细度),默认imfo,可以修改为Debug-
- jmeter.bat是启动文件,其中部分参数支持配置
- heap(堆内存)最多设置为物理内存的一半,默认设置521M;如果heap超过物理内存的一半,可能运行jmeter会慢,甚至溢出
- docs目录:JMeter帮助文档
- printable_docs目录
- usermanual子目录:用户手册,
- component_reference.html:最常用的核心文件帮助手册
- usermanual子目录:用户手册,
- extras目录:提供对ant的支持,利用ant来实现自动化;例如批量执行脚本,产生html报表
- lib目录
- ext子目录是jmeter的核心jar包;
- junit子目录是方junit脚本的
- 用户扩展所依赖的包直接放在lib目录下即可
jmeter使用
测试搭建
- 搭建步骤及含义
- 配置元件(config elements) ---作用范围内的所有元件
- 前置处理器(Per-processors) ---作用范围内的每一个sampler元件之前执行
- 定时器(timers) ---作用范围的每一个sampler有效
- Sampler元件不和其它元件相互作用,因此不存在作用域的问题
- 后置处理程序(Post-processors)---作用范围内的每一个sampler元件之后执行
- 断言(Assertions) ---作用范围内的每一个sampler元件执行后的结果执行校验
- 监听器(Listeners) ---收集其作用范围的每一个sampler元件的信息并呈现
- 执行顺序与作用域
- 按照树状结构自上而下执行
- 某个sampler下的控制元件只对该sampler生效
线程组
- 各字段含义
- 线程数:模拟用户数量
- ramp-up period:准备时长,设置的虚拟用户需要多长时间全部启动
- 循环次数:单个用户、单个接口的循环次数
- 字段扩展
- 总线程数:线程数 * 循环次数
- 总时长:ramp-up period * 循环次数
- 场景加载策略:ramp-up period / 线程数
HTTP请求
- 协议及端口
- http:80
- https:443
- 请求方法(常用)
- get
- 参数在url中,以?变量1&变量2
- post
- key=value格式:放在参数中
- json格式:放在消息体中
- 需要加http请求头Conten-type:application/json
- key=json格式:放在参数中
- get
- 超时设置(单位:ms)
- 请求、响应超时(建议5s或者10s)
BeanShell相关
-
分类
- 前置处理器:BeanShell PreProcesser
- 采样器:BeanShell Sampler
- 后置处理器:BeanShell PostProcesser
- 断言:BeanShell断言
脚本内直接写脚本
-
- log:写日志到控制台
- log.info('变量名')
- vars:操作jmeter变量
- vars.get(“skuId”):从jmeter中获取${skuId}变量的值
- vars.put(“name”,”test”):将”test”保存到${name}变量中
- prev:获取前面sampler返回的信息
- getResponseDataAsString():获取响应信息
- getResponseCode():获取响应code
- log:写日志到控制台
-
调用jar包
- 在测试计划中导入jar包
- import 所需类;
-
调用java源代码
- source('jar路径')
-
BeanShell断言
- Failure:是否失败,boolean类型
- FailureMessage:失败日志,在断言失败时显示
检查点(断言)的使用
- 断言分类(常用)
- 响应断言
- Json Assertion
- 断言持续时间
- Size Assertion:响应字节大小
参数化
- 三种参数化方式
- 用户参数
- CVS Data Config:导入文件
- 随机变量---通过函数助手生成
- 常用随机函数
- __Random:生成随机数
- __RadndomString:生成随机字符串
- __time:时间戳
- __UUID:生成唯一的UUID
- __CSVRead:CSV文件读取
- 一个线程只选第一行
- 函数生成的可选参数
- 函数生成时可以把随机数保存到一个变量中
- 该变量可以被再次调用
逻辑控制器
- 常用的逻辑控制器
- 循环控制器:可以设置该控制器内的sampler执行的次数,循环次数与线程的循环次数各自独立
- if控制器:根据判断条件决定是否执行该控制器内的请求,如果是字符串比较条件,参数和字符串都需要加引号
- 条件格式:{__jexl3({__jexl3(“${num}” == “10”)}
- jex
- 仅一次控制器:该控制器内的请求只执行一次,无论线程循环多少次
- foreach控制器:可以遍历某个参数数组,循环获取数组中的参数
定时器
- 常用的定时器
- 固定定时器:设置一个固定的sleep时间
- 同步定时器(集合点)
- 常数吞吐量定时器
- 同步定时器(集合点)
- 什么是集合点?
- 多个用户集合到一个时间点同时并发
- 集合点设置
- 用户组数量:0,等同于设置为线程组中的线程数
- 用户组数量:非0,代表达到设置的用户(线程)后,并发执行后续操作(不可超过线程数)
- 超时时间:0,Timer将等待线程数直到达到了设置用户组数的值后才执行,不够则一直等待
- 超时时间:非0,如果超过了所设置的最大等待时间后,还没有达到用户组数量设置的值,Timer将不再等待
- 什么是集合点?
- 常数吞吐量定时器
- 什么是常数吞吐量定时器?
- 控制接口的TPS
- 为什么要控制?
- 为控制TPS过高的接口,占用CPU
- 字段
- 目标吞吐量
- 基于计算吞吐量:建议选当前线程组中所有活动线程
- 什么是常数吞吐量定时器?
配置元件
- HTTP Cookie管理器
- Jmeter自动关联cookie的处理方式
- 1、在线程组中加一个空的HTTP Cookie管理器
- 2、通过正则提取后带入
- Jmeter自动关联cookie的处理方式
- HTTP信息头管理
- 存在接口header中的数据
动态关联
- 两种方式
- 正则表达式提取器
- 引用名称:变量名称
- 正则表达式生成
- 1、拷贝目标数据和左右边界
- 2、把目标数据用括号括起来
- 3、把目标数据用.+?代替
- 模板:
- 匹配数字:1
- json提取器
- 格式:$.路径
- 调试取样器结合查看结果树使用
- 正则表达式提取器
插件扩展
- 插件官网
- 几个好用的插件
- 3 Basic Graph:windows下可用的实时的TPS和响应时间的插件
- Customer Jmeter Functions:扩展函数
- Random CSV Data Set Config:随机csv文件参数化
- PerfMon:服务端性能实时监控插件
数据库的使用
- 步骤
- 在测试计划中加入mysql驱动的jar包
- Add directory or jar to classpath
- JDBC Connection Configuration
- DataBaseURL
- JDBC Driver Class
- Username
- Password
- JDBC Request
- query type
- Select Statement 查询
- Update Statement 更新
- 如需要多个用户配置不同的SQL,可以把SQL语句放在csv文件中,通过参数化进行调用
- query type
- 断言
- 监听器
- 在测试计划中加入mysql驱动的jar包
分布式性能测试
- 为什么要进行分布式?
- 答:jmeter由java开发,耗内存、cpu,所以大并发下还是需要分布式的
- 步骤
- 关闭防火墙
- 选择一台机器作为controller,其他的机器作为agent,全部安装jmeter应用,并运行agent机 器bin目录下的jmeter-server文件
- 在controller机器的bin目录下找到jmeter.properties文件中修改remote_hosts地址
- 在controller机子的jmeter应用点击运行-->远程启动即可
监听器
- 常用的监听器
- 断言结果
- 查看结果树
- 聚合报告
- 用表格查看结果
- 图形结果
- aggregate graph
- 等等。。。。。
- 文件保存
- 默认保存为jtl文件
- jtl文件分析
- 聚合报告含义及分析
- 各个字段的含义(单位:毫秒)
- Lable:定义HTTP请求名称
- Samples:这次测试中一共发出多少个请求
- Average:平均响应时长
- Median:50%用户的响应时长
- 90%Line99%Line:90%99%用户的响应时长
- Min:最小响应时间
- Max:最大响应时间
- Error%:错误率
- Throughput:吞吐量--默认表示每秒完成的请求数量
- Received KB/src:每秒从服务器端接收的数据量
- Sent KB/src:每秒从客户端发送的请求数量
- 性能指标分析
- 并发数(用户数量)
- 响应时间
- 吞吐量(TPS)
- 流量
- 硬件指标
- CPU
- I/O
- 内存(memory)
- 各个字段的含义(单位:毫秒)
命令行执行
- 准备工作
- 1,压力机安装并配置好JDK
- 2、配置jmeter的环境变量
- 3,调试好jmeter脚本
- 单机器测试步骤:
- 执行 jmeter -n -t test.jmx -l result.jtl
- -n: 命令行模式,no-gui
- -t:jmx脚本路径;
- -l:jtl结果文件存放路径
- 执行 jmeter -n -t test.jmx -l result.jtl
- Html报表生成步骤
- 1、进入jmeter的bin目录下,修改reportgenerator.properties
- 2、修改jmeter.reportgenerator.overall_granularity=1000(报表中数据展示间隔1秒)
- 3、创建一个存放数据报表的文件夹
- 4、执行命令:jmeter –g result.jtl –o ./output
- -g: 指定jtl文件的路径
- -o: 指定html报表生成到哪个文件夹下
项目实操
文件上传和下载
- 上传
- POST请求,勾选 use …for post
- 同请求一起发送文件里,填写文件名称,参数名称
- MIME类型: application/octet-stream
- 下载
- 如何判断是否下载成功?
- 判断响应体的字节比真实文件的字节大
- 如何判断是否下载成功?
webservice接口
- webservice的网址
- webservice接口和http接口的异同点
- webservice是基于http接口封装的,是xml的
- webservice接口调用关键点
- 1、把参数放在消息体中
- 2、添加header:Conent-type:text/xml
接口签名校验
--------------待补充-------------------
性能测试报告
- 目录:
- 测试计划
- 参考资料
- 术语解释
- 系统介绍
- 测试环境
- 测试指标
- 测试工具和测试策略
- 测试数据收集
- 测试结果数据与截图
- 测试结论