五、jmeter脚本参数化

发布于:2025-06-09 ⋅ 阅读:(12) ⋅ 点赞:(0)

目录

1、脚本参数化

1.1 用户定义的变量

1.1.1 添加及引用方式

1.1.2 测试得出用户定义变量的特点

1.2 用户参数

1.2.1 概念

1.2.2 位置不同效果不同

1.2.3、用户参数的勾选框 - 每次迭代更新一次

总结用户定义的变量、用户参数

1.3 csv数据文件参数化

1、脚本参数化

        在编写Jmeter脚本的时候,很多数据是不能写死固定的,比如注册的手机号码,那些做了唯一性检查的参数。此时我们就需要进行参数化,这样的值就可以动态发生变化。

        重复调用的数据也建议参数化:避免修改的时候多次修改。

        参数化: 先不写具体的值,然后使用变量先代替。

        定义参数的方法有四种:

                用户定义的变量

                用户参数

                csv数据文件参数化

                属性:后边我们讲到函数的时候再着重说

1.1 用户定义的变量

1.1.1 添加及引用方式

 添加方式1:在测试计划中直接创建

 添加方式2:配置元件 -> 用户定义的变量

        

引用方式:${变量名}   变量名命名包含数字字母下划线

我们可以使用调试取样器查看变量的引用结果, 按照下图添加

运行后我们可以看到,引用的参数已经被替换成具体的值

1.1.2 测试得出用户定义变量的特点

首先我们替换刚刚的值为一个随机数(具体的生成会在函数中讲,这里大家先用这个)

替换我们在测试计划中创建的user_id     

# 在000-999之间随机生成3位数 

${__Random(000,999,)}     

替换我们在线程组中创建的user_name     

# 在“你好我是小黄鸭”中随机生成3个字
${__RandomString(3,你好我是小黄鸭)} 

场景一:单个用户功能测试

运行后得到结果:我们只得到一个值,如果是用户注册,则每次都是新的数据,每次都可以成功获取。

场景二:并发用户(多线程)测试

运行后结果:多个并发用户数一次运行的结果都是一样的,如果是用户注册那只会有第一个用户是成功的,后边的用户都hu失败,因为用户已经存在了

场景三:多个线程组

场景:我们新建线程组2,但是不定义用户定义的变量,直接在调试取样器中调用user_name

 运行后结果:线程组1、线程组2得到的结果是一样的。 线程组2在没有定义“user_name”的情况下,直接引用也得到了值

通过上述测试得出用户定义变量的特点总结:

        1、每次启动值都会变一次,运行过程中不会改变值;所以在性能测试中很少用,因为不符合性能需求,一个用户不可能在系统中同一时间既登录有下单的,

        2、用户定义的变量可以跨线程组使用,一次定义全局使用。

1.2 用户参数

1.2.1 概念

        作为前置处理器,每次接口请求之前都会调用执行这个用户参数;在性能测试时多个并发用户数同时运行请求,用户参数的值针对每个并发用户会动态变化。

1.2.2 位置不同效果不同

        注:大家可以自己动手使用登录注册接口实操一下

1、如果用户参数放在线程组下,里面所有的请求都会每次去调用:作用域是整个线程组,下面的取样器都可以使用,那么每个取样器每次都会拿到新的值。

        引入问题: 注册新用户可以成功  但是登录也是新的用户没注册过就会报错;

2、如果放在某个接口下面,作用域就是这个接口,只有这个接口执行前会调用,其他接口执行之前不会调用执行这个前置;

      因为前置处理器在注册之前会调用,生成值保存在变量里;登录没有这个用户参数,就不会调用生成新数据,可以直接调用之前存的变量的值

1.2.3、用户参数的勾选框 - 每次迭代更新一次

迭代:线程组下所有的取样器执行一次,算一次迭代完成。

默认:为不勾选,每个请求都会执行一次用户参数。(如:下边4次请求,执行了四次用户参数)

勾选:一次迭代只执行一次用户参数,下次迭代时再执行第二次。(如下两次迭代)

总结用户定义的变量、用户参数

1、用户定义的变量:可以跨线程组被引用;用户参数不能夸线程组、只能作用于当前线程组

2、用户定义的变量,在每次启动运行的时候会获取一次值,在运行过程中值永远不会变。【循环和用户并发都不会变】;用户参数在每次运行时,都会动态获取值,每次调用的时候就会改变值;如果希望不要变化,就勾选每次迭代更新一次;或者放在第一个取样器下面就会调用一次。

3、重点掌握用户参数的时候用 因为性能里用户定义变量用很少。

4、用到的大部分的变量 - 后置处理器等都是用户参数类型变量不能跨线程使用。-- 后面通过属性实现

1.3 csv数据文件参数化

注:配置元件中添加,配置元件执行优先级最高,如果出错了后边不会运行,可能看不到查看结果数的结果(可以在工具日志里看到报错信息)

1.3.1 基础概念

 使用场景:批量执行并需要构造真实数据的时候,可以从数据库里导出数据到CSV文件中,接口通过CSV文件批量进行操作。

元件的每个配置解释:

        文件名:可以写绝对路径(浏览选择文件),也可以写相对路径(相对的起始点是jmx文件的位置)

1、相对路径: 相对的起始点是jmx脚本的位置 | 或者jmeter的bin文件目录两个都可以,所以写的文件名会默认去这两个目录下找这个csv文件;

2、推荐使用相对路径

3、如果写绝对路径,会自动适配/ 和\路径盘符,因为适配各个平台【win和mac】路径 【但是换台机器容易找不到文件】-- D:/apache-jmeter-5.2.1/bin/testdata.txt
4、文件是支持多种格式: txt 、csv 等

        文件编码:由选择的文件自身编码来选择

1、csv文件,字符集编码不一定是utf8。如果csv文件自身不是utf8编码的,而jmeter中csv选的字符集选择了utf8,可能出现中文字符集不同而导致乱码;

2、如果我们用数据的文件是 csv,数据又有中文,Jmeter获取数据的时候已经出现乱码了,用notepad++把csv文件打开,切换字符编码为utf8或者重新保存的时候选择编码为utf8。
3、使用csv文件容易产生乱码现象。所以我们一般建议文件选择用 txt;默认就是utf8编码

        变量名称:自己定义变量名,多个时候用英语的逗号隔开,这个逗号是固定的,与文件种的列分隔符没有关系

1、如果第一个变量接受第一列,第二个变量接受第三列,中间写逗号 + 空格【name,  ,pid
2、这个变量名就可以被后续的接口调用 ${name} ,拿到 csv 文件里对应列的值。

        忽略首行:True不要第一行,False要第一行(表头去掉的时候选True)

        分隔符:就要看你读取的文件的列与列的分隔符号(tab就是制表符\t;空格,默认csv文件是英文逗号)

        是否允许带引号:这个只能是txt文本操作,csv文件不会生效

1、False: 不允许带引号, 如果有引号就会当做数据的整体组成部分 “1344555555”

2、True :允许带引号 , 如果有引号就会自动去掉引号。

        遇到文件结束符再次循环吗?

1、True: 是的,继续循环,继续循环取文件中值。当文件内容从头到尾,全部都取了1次值之后,再从头开始取值。

2、False: 不,不再循环取值,如果还要用值,就是一个空值。 如果遇到数据是EOF数据 要检查这个地方配置数据库行数 +检查文本之后是否有空行。

        遇到文件结束符停止线程吗?

1、True: 是,停止线程,jmeter就会 停止运行。

2、False :不,继续运行, jmeter 还会继续跑
3、如果上面的两个配置冲突了  以上面的配置为准。后面配置失效。

以下是默认配置 

 

线程共享模式:

        所有现场(所有线程):所有线程共享,不管jmeter有多个线程组,总共有多少个线程,所有的线程都共用一份文件

1、所有的线程,在使用这个文件的时候, 排队使用文件中的数据。【第一个线程使用第一行,依次排列取值】

2、当2个线程组共享这个CSV文件: csv放测试计划下共享,否则不能跨线程组。

3、两个线程组执行: 几乎同时执行

         当前线程组:这个线程组的所有线程,共用一份数据。有多个线程时,有n个线程组那么内存中就有n份相同的数据。

单独线程组里单独读取自己内存的数据。不会混用。每个线程组都从头开始取。

        当前线程:每个线程(用户)私有一份,有n个线程,在内存中就有n份数据,运行中取值时都取自己的那一份,都是从头开始的。

如果设置循环,那么单个线程就会取第二行的值

 注:以上三种情况,最后一个【当前线程】选项占用内存最多。所以比较少用。