JMeter高阶系列--数据参数化及使用场景

栏目:云苍穹知识作者:金蝶来源:金蝶云社区发布:2024-09-23浏览:5

JMeter高阶系列--数据参数化及使用场景

1 概述

1.1 导语

在测试过程中,我们常常会遇到各种问题。


问题1

测试环境A能正常运行JMeter脚本,拿到其他环境,由于基础数据不兼容导致运行失败。

问题2

对数据进行操作时,如果写死数据,由于数据状态的变化,导致请求无法发送成功,业务逻辑没有正确的得到验证。

问题3

我们在批量操作时,数据量比较大,直接放在请求入参里,脚本显得臃肿,可读性差。


以上问题均可通过动态参数化来解决。

1.2 参数化类型

在JMeter中主要的动态参数化有以下几种方式:

  • beanshell脚本;

  • JDBC协议获取数据;

  • Jmeter自带函数;

  • 正则表达式。

而常常将用户定义的变量、”CSV Data Set Config”、用户参数等定义为静态数据参数化,因为数据需要人为更改,才会变化。


本文承接文章 Jmeter高阶系列—使用JDBC协议获取数据(该文已讲解如何通过JDBC协议从数据库获取到数据,成为Jmeter数组变量),介绍如何对通过JDBC协议获取到的数据数组进行参数化及引用,满足我们日常复杂业务使用场景。


2 使用场景

2.1 使用场景一:随机取值

数组的使用方法之一,随机从数组中取某一个值。

以苍穹供应商为实例,从供应商列表获取fid形成数据池(数组),随机取值。可做提交、审核、反审核、撤销等操作的单条数据请求入参(多用于接口功能自动化)。

另外,造大单据可以通过随机关联基础数据的number或者id,从而让大单据关联的基础数据成均匀分配(多用于造数,性能测试等)。


1)目标


随机取SQL结果集中的一个值作为请求入参。如下图所示:



2)编写beanshell脚本


添加beanshell Sampler,编写beanshell脚本,实现随机取值:

vars.put("materialFidQa",vars.get("materialFidQ1_${__Random(1,${materialFidQ1_#},)}"));

其中${__Random(1,${materialFidQ1_#},)}materialFidQ1_#为数组的长度,该变量值可在Debug Sampler中查看,Random随机函数为Jmeter自带的函数。



3)设置全局变量


如果是跨线程组使用,需将变量设置为全局变量:

${__setProperty(materialFidQb,${materialFidQa},)}


 4)引用变量


请求入参引用变量,全局变量可通过:${__property(materialFidQb,)}引用。


5) 查看响应


在查看结果树中,检查请求结果。

从结果中可看出,供应商的单个提交、撤销均成功从fid数据池(数组)中随机获取id,并请求成功。



响应结果


2.2 使用场景二:转换成Json数组

1)目标


将从数据库中得到的数据转换成Json数组。

使用场景:比如批量对供应商的数据进行提交、审核、反审核等操作(性能测试、造数、接口功能,测批量场景时使用)。

批量操作的入参根据接口的定义,为Json数组。如下图所示:



2)编写BeanShell脚本


编写beanshell脚本,如图中所示,此处需要编写生成Json数组的方法,形参为生成的Json数组的长度len以及变量前缀(上文中,从数据库提取数据池的变量前缀为materialFidQ1_,可在debugsampler中查看)。



结合实例,调用脚本:


//String  materialFidQa=strList("materialFidQ1_",1000).toString();
//表示将前缀为”materialFidQ1_”下标为1到1000的数据转换成Json串
//vars.put("materialFidQa",materialFidQa);
//将得到的Json串--“materialFidQa”转成Jmeter变量“materialFidQa”


也可写成一步调用:


vars.put("materialFidQa",strList("materialFidQ1_",10000).toString())


3)设置全局变量


跨线程组调用,可将其设置为全局变量,如在同一个线程组,该步骤可以省略。



4)引用变量


请求入参引用变量,全局变量可通过“${__property(materialFidQb,)}”引用。

非全局变量直接通过“${ materialFidQb}”引用。



5)查看响应


查看请求。



2.3 使用场景三:结合foreach控制器使用

如果没有特殊设置,foreach控制器会依次执行完变量池(数组)中的每一个值,进行循环遍历。

比如此文实例,从数据库中取出的1999条fid组成的数组(前缀为materialFidQ1),foreach会遍历执行1999次请求(可以用于循环遍历发送请求)。


1)目标


从数据库中取出数据,通过foreach控制器,遍历数组中的每一个值,发出请求。


2)添加foreach控制器


添加foreach控制器,并进行配置。如下图所示:



配置内容。填写输入变量的前缀(Input variable prefix),下标的起始值,以及输出变量,如下图所示:



3)引用变量


在请求中,引用forEach的输出变量:materialFidQb。



4)查看响应


在查看结果树中,Foreach控制器将依次取值执行1999个请求,每个请求的入参按顺序取完1999个id。



2.4 使用场景四:结合循环器和counter计数器使用

1)目标


目标:通过循环器加conter计数器的结合使用,请求可以循环依次取数据池中的参数。

效果同foreach控制器,但是foreach控制器默认是数据池(前缀相同,使用下标标记成员,类似数组)中的所有值遍历,循环控制器可以控制循环的次数以及下标的范围,比foreach灵活。


2)添加循环控制器


添加循环可控制器。



设置循环次数。



3)添加计数器


操作方式如下:




4)引用变量


请求入参引用变量,{"ids":["${__V(materialFidQ1_${index})}"]}

其中,index是计数器输出的计数值变量。



5)查看响应


执行循环控制器下设置的次数,每个请求根据计数的范围循环取值。

比如计数器的范围为1-10,循环次数为30,那请求依次取materialFidQ_1…到materialFidQ1_10后,再从materialFidQ_1…到materialFidQ1_10,循环下去,直到结束。



JMeter高阶系列--数据参数化及使用场景

1 概述1.1 导语在测试过程中,我们常常会遇到各种问题。问题1测试环境A能正常运行JMeter脚本,拿到其他环境,由于基础数据不兼容导致运行...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息