当前位置: 首页 > news >正文

五、jmeter脚本参数化

目录

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份数据,运行中取值时都取自己的那一份,都是从头开始的。

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

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

相关文章:

  • Python训练营打卡DAY48
  • 数据网格的革命:从集中式到分布式的数据管理新范式
  • 固态硬盘的寿命与可靠性如何保障?——以Kingston FURY Renegade G5为例的专业解析
  • 实验二:数码管动态显示实验
  • DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
  • ClickHouse 25.3 json列类型使用示例
  • ​​​​​​​6板块公共数据典型应用场景【政务服务|公共安全|公共卫生|环境保护|金融风控|教育科研]
  • 微机原理与接口技术,期末冲刺复习资料(三)
  • 本地缓存在Java中的实现方式
  • C++ 搜索二叉树(BST)详解:实现与应用
  • 【大模型RAG】Docker 一键部署 Milvus 完整攻略
  • 数据库、数据仓库、数据中台、数据湖相关概念
  • 前端十种排序算法解析
  • 比较数据迁移后MySQL数据库和PostgreSQL数据仓库中的表
  • 力扣算法题1
  • JAVASCRIPT 前端数据库-V6--仙盟数据库架构-—-—仙盟创梦IDE
  • 横向对比npm和yarn
  • 省略号和可变参数模板
  • 五年级数学知识边界总结思考-下册
  • Axure Rp 11 安装、汉化、授权
  • 东道设计学院/seo是什么品牌
  • 控制面板网站/无锡网站seo
  • 南充网站建设公司/百度网盟推广怎么做
  • 800元建网站/网站如何提升seo排名
  • 贵州网站推广公司/视频网站建设
  • 中山手机网站建设/某网站搜索引擎优化