jmeter元件,作用域与优先级
一、jmeter元件
1、配置元件:优先级最高
1.1 重点使用元件:csv数据文件设置、用户定义变量、计数器
2、取样器:根据不同协议来编写请求脚本的元件
2.1 是真正发起请求的元件
2.2 执行顺序: 在没有逻辑控制器,是从上往下执行;多用户并发的时候,每个用户的执行顺序,都是从上往下
3、逻辑控制器: 控制取样器的执行逻辑
3.1 先于取样器执行
3.2 作用范围: 只针对它子集取样器
4、前置处理器:
元件:用户参数
4.2 取样器前面执行,放在不同的位置,作用范围 是不一样
5、后置处理器:对取样器的执行结果进行处理
5.2 JSON提取器,正则提取器
不可以放在公共的线程组后测试计划下,否则会识别不到要处理哪一个执行结果
6、查看结果数:根据收到响应的先后顺序显示,先收到,先显示。所以,查看结果树中显示的结果顺序,在单个用户请求的时候,顺序与请求顺序一致, 但是,在多用户并发的时候,就不一定一致了,所以,在多用户并发的时候,不要问, 为什么查看结果树中顺序不对。
二、变量的定义
1、jmeter中变量名称的定义用字母或数字或下滑线(遵循java变量名定义规则)
2、变量的引用:${变量名}
3、变量的定义方法
3.1 配置元件:用户定义变量
3.1.1 添加变量路径一:鼠标右键-配置元件-用户定义的变量
3.1.2 添加变量路径二:测试计划-直接添加
用户定义变量,可以跨线程组被引用,是一个全局变量(但 是,这个全局变量与代码中讲的全局变量有差异)
3.2 前置处理器:用户参数
3.2.1 测试计划下,添加用户参数, 可以多个线程组中引用用户参数
用户参数,不能直接跨线程组被引用。
3.3.3 在一个线程组下,把用户参数,挂在某一个取样器下面,作为取样器的子集,运行时,这个取样器能取到用户参数的值,在这个取样器之后的取样器,也能取到用户参数的值,但是,在这个取样器之前的取样器,是不能取到用户参数的值。
3.3 测试计划:测试计划中有一个独立运行每个线程组(复选框),默认没有勾选,代表测试 计划下,所有的线程组是并行执行,勾选了,那么多个线程组,就从上往 下执行,前面线程组执行结束才会开始执行后面的线程组。
注意:什么时候使用定义变量---在项目中存在后期会变化的参数时用到定义变量,以便于后期更改参数时,只需要更改定义的变量的值,不需要一个脚本一个脚本去改数据
三、函数
1、函数的名称是严格区分大小写, 函数前面是有 两个下划线;在函数助手对话框中,点击生成按钮,结果框中,有正常显示结果,说明你的函数一定 可以正常运行,但是,没有结果或结果报错,并不代表,你的函数在使用的时候会失 败。
2、jmeter函数有两种
2.1 自带函数: Tools > 函数助手对话框 -----jmeter有这些方法,你可以直接 调用来使用它实现你要的功能
2.1.1 Tools--> 函数助手对话框-->选择函数-->点击帮助会跳转到详情介绍页面
2.1.2 使用:Tools--函数助手对话框--选择函数值-填写下方值--点击生成-复制表达式到你定义的变量中:156${__Random(00000000,99999999,)
1.2 扩展函数----第三方扩展包
3、随机函数
比如一个线程组中有两个接口用到同一个用户变量的值,在执行的过程中,函数仅会生成一个随机数,两个接口使用的是一个值
.2 用户参数:在启动时,获取一次值,在运行过程中,还会动态获取值
例如登录的接口想使用注册接口的手机号码
3.2.1.1 把用户参数,放在第1个接口取样器的子集
3.2.1.2 当用户参数在线程组下时,勾选用户参数中 【每次迭代更新一次】复选框也可以两个接口一起使用
4、时间相关函数
4.1 获取当前时间戳:${__time(,)}
4.1.1 定义时间格式:年月日:${__time(yyyyMMdd,)} ---20220416;年月日时分秒:${__time(yyyyMMdd HH:mm:ss,)} --20220416 10:28:03;微秒:${__time(yyyyMMdd HH:mm:ss.S,)}--20220416 10:28:37.617
4.2 时间偏移函数:${__timeShift(,,,,)}
4.2.1 减法操作:比当前时间早4天:${__timeShift(yyyyMMdd,,-p4d,,)} ---20220412 ;比当前时间晚4天:${__timeShift(yyyyMMdd,,p4d,,)} --20220420
4.2.2 有一个接口中时间范围的参数,起始时间、结束时间,我期望从今天 开始,往历史方向减1-5天的一个范围:${__timeShift(yyyyMMdd,,-p${__Random(1,5,)}d,,)}或者${__timeShift(yyyyMMdd,${__time(YMD,)},-p${__Random(1,5,)}d,,)}
4.3 随机日期:${__RandomDate(yyyy-MM-dd,2022-03-01,2022-03-28,,)}
4.4 时间格式转换函数:${__dateTimeConvert(,,,)} :有时开发使用的时间是时间戳,需要用到函数进行转换
5、计数函数
这个函数每次只能加1
5.2 如果每次想加其他数字,则需要使用计数器-配置元件
5.2.1 starting value:开始递增的值 递增:可以自己设置,每次根据设置的值进行递增 Maximum value:最大递增值,当你设置了最大值的时候,使用时,超过最大时的时候,就会从起始值开始循环 引用名称:在应用时调用的参数
5.2.2 与每用户独立的跟踪计数器(复选框):不勾选:所有的线程数及他们的循环请求次数,都使用这一个 计算器进行累加 勾选:多少个线程数,就有多少个计数器
6、${__CSVRead(,)} 暂时请不要用,因为处理不了稍微复杂的场景,会容易出错
7、加密函数
7.1 函数:${__digest(,,,,)}---${__digest(MD5,12345678,,,)} 只能做简单加密
7.2 如果你们的项目中的接口参数值,需要进行加密,而这个加密算法,不是 digest函数支持,那你就需要写代码
在性能脚本中,任何Beanshell元 件都不要用。 Beanshell元件的性能是非常差的,在性能脚本中,请不要使用。
7.2.2 在性能脚本中,写java代码可以使用JSR223的元件,代码写法按照 beanshell语法写法。对应的函数: ${__jexl3(,)} ${__groovy(,)}
7.3 每个公司加密算法都不一样,这个算法的源代码是需要开发人员打包成为jar文件,由测试人员将jar包放到jmeter的\lib中,重启jmeter,写脚本调用jar文件中方法来写代码,不要把jar文件使用jmeter测试计划下的引入库来使用。
8、整数运算:${__intSum(,,)}
9、属性相关函数
9.1 设置属性:${__setProperty(,,)}
9.2 获取属性:${__property(,,)} 简化版:${__P(,)}
10、属性
1、属性是jmeter工具带有的一个参数,jmeter.properties是它的属性配置文件 以.properties结尾的文件,都是 jmeter的属性配置文件。配置文件的属性展示格式为属性名 = 属性值
2、分类:静态属性、动态属性, jmeter属性、系统属性
2.1 静态属性:写在properties文件中的参数,都是我们jmeter的静态属性
2.2 动态属性:在jmeter运行过程中,自定义的一些属性
2.2.1 当我们关闭了了jmeter,这些动态属性就自动消失,动态属性是存储在内存中
2.3 设置属性:${__setProperty(,,)}
2.4 jmeter属性,系统属性查看路径:鼠标右键---非测试元件---属性显示---可以切换查看系统与jmeter属性
3、设置为属性之后,我们可以跨线程组引用用户参数的值
4、设置属性的时候,多个线程组,默认是同时运行的,第一次,可能出现, 获取不到值,但是从第二次开始,一定都能获取到值了。
11、属性与变量的结合使用
1、属性是jmeter工具所有,可以在jmeter的任何地方被调用。把用户 参数的值用属性来接收,然后,我就可以在jmeter的任何地方获取属性值,从而获取到用户参数的变化的值。
12、拼接函数
1、jmeter中的连接:188${__Random(10000000,99999999,)}
2、当我们引用变量的时候,${变量名} 这个变量名是不能进行运算的
3、${__V(var_mobile_${__counter(,)},)} 把前缀相同,后缀不相同的一个变量或函数代替,整体作为V函数传入参数。
4、使用的场景:
4.1 后置提取的时候,有时候会一次提取多个值。
4.2 从数据库获取数据,返回多个值