jmeter常用功能介绍
jmeter常用组件功能简介
- 线程
jmeter 线程 就是测试里面的一个用户环境,可以认为是一个线程是模拟的一个用户,前置处理器中的·用户信息·实际上就是给 指定变量设置不同线程不同值 (类似 ThreadLocal )。 - 取样器
用于获取数据,比如http请求,数据库查询,比如通过调试取样器查看当前所有变量/属性 - 配置元件
用于存配置,设置变量,存放数据库配置,http头文件,cookie,csv数据文件等 - 前置/后置处理器
取样器执行取样的前后可以做一些操作,比如初始化一些数据,比如把返回值存下来。 - 断言
判断返回值是否符合预期,是一种特殊的后置处理程序 - 监听器
得到报告,请求记录等信息 - 逻辑控制器
控制那些模块需要被使用,控制那些测试片段需要导入,控制是循环,分支(if)等等流程控制,变量一个数组(foreach) - 定时器
用于让线程暂停指定时间(固定定时器),比如让100个用户同时请求一个接口(同步定时器),比如限制接口的吞访问频率10次每秒(吞吐量定时器)
一些基本按键说明
创建一个http请求
jmete所有动作都必须在一个线程组里面发起。有了线程组才能创建采样请求
线程(用户),jmeter工具都在提示我们,这里的线程和用户类似,一个线程模拟的是一个用户的操作,并且不同线程之间变量是隔离的。只有全局变量才能跨线程(用户)使用
有了线程组以后才能创建http请求
一个请求大概是这样的
添加参数
添加header
添加-->配置元件-->http请求头管理器 添加
定义http hearder
定义了头所有请求都会使用这个头,头可以定义多个,都会生效
使用变量
使用 添加-->配置元件-->用户定义的变量 添加用户变量配置文件,可以有多个这个配置文件,如果多个配置文件里面有key重复,下面的覆盖前面的
定义变量
使用变量:${变量名字)}
几乎任何位置都能使用变量
jmeter的变量是线程隔离的,不同线程之间同一个变量可以有不同的值,设置为全局变量可以不同线程之间通用,不同线程组之间全局变量也是通用的
设置全局变量:${__setProperty( 全局变量名字 ,${变量名})}
取全局变量: ${__P(全局变量名字)}
你可以在后置bean shell 后置处理程序,前置处理程序等地方设置它(发送请求前后的一段处理脚本)
全局变量(Property)
请求接口返回参数可以赋值给变量
使用数据文件
效果相当于定义了几个变量,第一次运行读取的是第一行,第二次第二行,读完以后重头再来。
比如只有3行数据,这个请放在一个循环里面跑了5次,那么后2次用的第一行和第行数据。
断言
断言的目的是判断采样器取得结果是否符合预期,选择合适的断言方式
使用 添加-->断言 添加断言
断言示例,你也可以选json断言,可以通过jsonPath语法对返回值是json格式的数据做判断
采集器响应值提取
使用正则表达式提取器,或者接送提取器可以提取返回值中的数
响应值赋值给变量
查看请求结果
使用添加-->监听器-->查看结果树 可以看到请求记录,监听器里面别的组件还能看到汇总报告等等别的信息
请求结果查看
循环请求
循环控制是一个线程指定多次,而不是多线程执行
简单的循环3次,这下面有个数据文件里面有3组测试数据,所以这里循环3次
使用多线性请求
如果线程组设置的多个线程,那么就是每个线程把测试计划都跑一边,不是一个线程跑一段
循环次数就是每个线程跑测试计划的次数。ramp-up 是指多少之间内启动这些线程,线程少直接设置0.
前面创建请求前,第一个添加的就是线程组,线程组是执行用例的基础,可以理解为线程池
测试片段
测试片段的效果是分模块的编写测试计划。比如一个项目由 购物车逻辑,用户中心,商品 三个部分组成。
张三做了 购物车的测试计划,李四做了用户中心,王二做了商品测试计划。分别测试以后可以把他们合起来跑。
添加测试片段
测试片段里面可以包含测试计划
早本地我们通过模块控制器来指定那个片段需要运行(一个测试片段就是一个模块)
测试片段可以导出
合并可以把指定的测试片段加入到当前测试计划,加入以后当前测试计划内创建的测试片段一样,可以通过 模块控制器指定运行。
测试片段的引用
指向别人给你的测试片段
连接数据库取值
测试中需要校验的数据部分来自测试用例,可以通过数据文件导入,还有些数据来自数据库需要和数据库做对比
添加数据库驱动包
添加 数据库连接配置
配置数据库连接池
添加一个数据库连接请求
取样器,或者数据的都在这里面,比如http请求,比如数据库查询
sql 查询请求的内容
数据已经放在变量里面了,在http请求和响应都可以用的上
可以在后可以通过调试取样器查看当前的变量,属性
调用操作命令行取值
取数据都是添加取样器
配置os进程取样器
运行命令:wmic logicaldisk get size,freespace,caption 可以查看磁盘信息
取到的结果
函数助手
可以看到有那些函数,函数参数,也可以在这里测试函数
函数助手对话框打开位置
函数调用格式
${__functionName(var1,var2,var3)}
,无参函数可以写作 ${__functionName}
jmeter默认不支持函数嵌套,如果要取数组下边,并且下标是变量,这时候就需要__V的函数嵌套效果
${data_${n}}
这样嵌套是不支持的, 需要写成__V(data_${n})
,__V()
代替了 ${}
http代理服务器抓包
别的设备连接这个代理地址就能抓到http包
Bean shell
实际就是Java代码片段,并且拥有适配 jmeter 环境的一些变量,语法和Java一样,可以通过jar包导入别的类库
-
bsh.args #bean shell 参数数组
log.info(bsh.args[0]);
-
log
log.info(bsh.args[0]);
-
vars
//获取字符串类型数据获取 vars.get("domain"); //对字符串类似修改 int adultNum = 8; vars.put("adultNum",adultNum.toString()); //非字符串类型获取 vars.getObject("personInfo"); //设置非String类型的值 List list = new ArrayList(); list.add("a"); list.add('b'); list.add("c"); vars.put("list", list); //将list对象放至到jmeter的list变量中
-
props jmeter的全局变量 用法和 var类似
-
ctx 上下文对象
//SampleResult需要import对象 import org.apache.jmeter.samplers.SampleResult; SampleResult result = ctx.getPreviousResult(); //getPreviousResult()返回SampleResult对象 String RequestHeaders = result.getRequestHeaders(); //getRequestHeaders()方法返回请求headers字符串 String ResponseHeaders = result.getResponseHeaders(); //getResponseHeaders() 返回响应headers字符串 String responseCode = result.getResponseCode(); //getResponseCode() 返回响应状态码字符串 URL url = result.getURL(); //getURL() 返回请求URL对象
-
prev 等同于 ctx.getPreviousResult()
String ResponseData = prev.getResponseDataAsString(); //getResponseDataAsString()返回响应文本 String RequestHeaders = prev.getRequestHeaders(); //getRequestHeaders()方法返回请求headers字符串 String ResponseHeaders = prev.getResponseHeaders(); //getResponseHeaders() 返回响应headers字符串 String responseCode = prev.getResponseCode(); //getResponseCode() 返回响应状态码字符串 URL url = prev.getURL(); //getURL() 返回请求URL对象 String urlStr = prev.getUrlAsString(); //getUrlAsString() 返回请求URL字符串
jmeter多机协作
一控制机多执行机模式
控制机 配置,打开bin/目录下的 jmeter.properties 文件
server.rmi.ssl.disable=true #关闭ssl证书
remote_hosts=192.168.124.129,192.168.124.130 #远程主机地址
server_port=1099 #服务端口(以供远程连接),需要运行jmeter-server才生效
编辑从机节点(执行机)的 jmeter.properties 文件,然后运行jmeter-server
server.rmi.ssl.disable=true #关闭ssl证书
server.rmi.localport=1001 #本地端口
server_port=1099 #服务端口
如果执行的脚本有 本地文件引用(csv文件,数据库驱动等),需要保持执行机上也有对应的文件,否者无法执行
jmeter后台运行脚本
jmeter -n -t 功能演示测试计划.jmx -l log.csv -e -o F:\tools\export
参数
- -n 无归运行
- -t 脚本位置 指定脚本位置
- -l 日志文件位置 指定输出的日志文件,需要日志文件是空
- -e 生成报表
- -o 输出报表位置 需要输入位置是空
#如下异常,java版本的问题,我用的 jmeter不支持java17
Error generating the report: org.apache.jmeter.report.dashboard.GenerationException: Error while processing samples: Consumer failed with message :Consumer failed with message :Consumer failed with message :Consumer failed with message :Begin size 0 is not equal to fixed size 5
--P()
和 __property()
区别
--P()
是 __property() 的简化版,获取属性值,但是不能获取值的时候把值赋值给另外一个变量
jmeter的日志
默认日志文件位置 bin/jmeter.log
能耍的时候就一定要耍,不能耍的时候一定要学。
--天道酬勤,贵在坚持posted on 2024-01-24 10:36 zhangyukun 阅读(164) 评论(0) 编辑 收藏 举报