Jmeter 参数化
参数化在接口性能,接口自动化中都非常重要,需要重点掌握,接下来就针对Jmeter 4.0 的参数化做详细介绍。
1、用户定义的变量
应用场景:可定义同时被应用到多个线程且不常变动的公共参数,例如请求协议,IP地址,请求方式,资源,端口号等
变量定义步骤:
1)新增用户定义变量的组件:单击测试计划再右键点击--选择添加--配置原件--点击用户定义的变量

2)设置你要的变量

3)调用变量: ${变量名}--在对应的地方调用变量,第二步定义了三个变量,本步均已调用如下

设置"用户定义的变量"有什么用处呢,最大的好处就是易于维护脚本,例如我们请求的IP地址一般不会变,且每个请求都必须用到,如果变化了,几个请求还好逐个修改就好,可若是成千上万个请求呢,
这时你就要庆幸你在最初设置的变量了,只要修改当初你设置的变量值即可,所有调用了这个变量的值都会一起修改,大大节省了维护脚本的时间及成本。
注:要把"用户定义的变量"这个组件放在最外面,这样才会作用于整个测试计划内的线程,个人建议,在开始创建线程的时候就要完成参数化。
2、函数助手
就是Jmeter中有提供了一些帮助我们完成某项功能的函数,可能不好理解,那么我们以一个例子来解释Jmeter中常用函数的功能以及如何使用。
例子:百度账号登录功能
先来看看百度账号登录的界面,如下截图

1)首先找到Jmeter的函数助手,参考如下。

2)何时需要使用到函数呢,那就是我们要实现某个功能的时候,要实现某个功能首先应该想到的是,是否有一个函数可以帮我们去解决,若没有对应的函数方法则考虑自己封装一个。
我们来分析百度用户名密码登录功能,其至少需要我们输入两个请求参数,分别为用户名,密码,然后通过点击登录按钮触发。
1>我们在做并发测试等多线程操作时,用户名是不能重复的,那么是否有一个函数可以帮我们实现这个功能呢
_RandomString------随机字符串,可以真实模拟客户数据,具体设置参考下图。

2>那如果是用手机号登录呢,那我们要实现手机号的随机,而手机号一般都有前三位数字的限定,函数设置参考下图。
__Random----随机数,可获得某个范围内的随机整数。
手机号前三位我们固定取135,那么调用函数时就是135${__Random(00000000,99999999,)}。
由于除了固定的前三位,还有8位数字要随机产生,所以最小值是八个零,最大值是八个九

3>若提供一些固定的值给你,如何去将这些值作为你的请求参数。
_CSVRead---数据以csv文件方式提供,则用此函数来实现读取,需要准备一个csv文件(文件内只有两列,分别为user_name,user_pwd,含若干条数据)

将生成的函数字符串应用到我们的请求当中去,如下方式调用,用户名需要一列值,密码需要以列值。

调试脚本
确定文件中的值是否有正确被读取到,需要注意的是我们必须在线程中设置线程数>1或是循环次数>1,否则读取的永远是文件中的第一条数据

点击执行登录请求后,查看结果(察看结果数组件),主要查看请求数据是否为文档中的值,若是则说明你已经成功读取了文档中的数据。

当然读取csv文档中的数据还有另外的方法,如在"配置原件"组件的"CSV数据文件设置"中也可设置,在此也给大家简单介绍下,同样看图说话。
个人建议若是配置原件能解决的就用配置原件,不建议用函数,以此为例在配置原件的"CSV数据文件设置"中将每列的值设置成变量,若是以后文件的地址变动了,只要修改这一处的地址即可,若你使用函数实现的,那么有调用的地方都要修改
非常的麻烦,所有建议优先考虑配置原件。

4>其他函数
>>_UUID--生成ID,基本是唯一的,生成随机字符串如(6c29a9d0-55d2-40ce-a4a4-58a96c4de950),调用函数方式 ${_UUID}
>>_counter计数器函数
在函数助手中设置好后,可同其他函数一样被调用,每被调用一次计数器自动加一,这个函数有一个参数是布尔型的,可填写TRUE/FALSE,
FALSE代表全局计数器,通常被用于记录发送了多少次请求,其只作用于调用这个计数器函数的请求,统计这个请求被执行了多少次。
TRUE代表这个函数是每个用户自己的计数器,通常被用于记录测试计划运行了多少遍。

若想查看计数器是否生效可用察看结果树查看,如下

>>_intSum ---求和 调用函数 ${__intSum(1,2,sum)},如下填写的1,2也可换成变量,即可以是确定的数相加也可是变量之间的相加,也可是函数之间的相加,前提是变量或函数的值都为整数,
如 ${__intSum(${__CSVRead(E:\user.csv,0)},${__CSVRead(E:\user.csv,1)},${__CSVRead(E:\user.csv,2)},sum)}
而sum储存了这个函数求得的和,又可以作为一个变量被别处引用。

>>__StringFromFile 从文本文件中读取字符串
---函数原理同CSVRead函数类似,每次调用函数,都会从文件中读取下一行。当到达文件末尾时,函数又会从文件开始处重新读取,直到循环结束。
如果在一个测试脚本中对该函数有多次引用,那么每一次引用都会独立打开文件,即使文件名是相同的(如果函数读取的值,在脚本其他地方也有使用,那么需要修改变量名)。
如果在打开或者读取文件时发生错误,那么函数就会返回字符串"**ERR**"。
备注:1,可连续读取多个文件,文件命名时需要标上编号,如test1,test2,test3,test4等,如下填写1,4,即从test1-test4均会被顺序读取,若是4个文件均被读取完了,循环还未结束,进程会被停止,不会像CSVRead一样从头再读取一遍

推荐:此路径下的文章对某些常用函数有详细介绍https://www.cnblogs.com/linglingyuese/archive/2013/03/06/linglingyuese-three.html
3、读取数据库中表的值作为参数值
1)要读取数据库的数据必须先连接上数据库,我们可在配置原件中选择JDBC Connection Configuration,设置连接数据库。
而连接数据库,需先配置驱动,驱动软件为mysql-connector-java-5.1.25-bin.jar,数据库jar包是由java打包成的数据库驱动,不需要解压,直接放进C:\apache-jmeter-4.0\lib\ext)--重启jmeter
所有的查询接口都是从数据库查数据,执行sql语句是jdbc请求,sql语句注意要放在请求后面,顺序不能反了。

2)连接上数据库后,我们要读取数据里面的数据,那么可以添加取样器中的JDBC Request,查询我们需要的值

3)注意在引用数据库中查到的数据时,要用角标,如 user_name_0
4、动态关联
下个请求要用到上个请求的返回参数,而且这个返回参数里面的数据是动态生成的,然后我们通过技术(比如说正则表达式提取器,json提取器,xpath提取器)
动态的把他的返回参数的值取到,然后给我第二个变量里面去用,这就是我们说得动态关联。
案例描述:充值请求需要用到登录请求的返回参数中的cookie,我们来动态关联一下
1)先看看登录请求返回参数中cookie在哪

2)知道在哪后我们开始去获取这个返回信息,通过正则表达式提取器来获取,重点是要确认左边界和右边界,且通过左边界与右边界只能找到一个,唯一的一个。
因为是要获取登录请求后的返回参数,所以我们要用到置处理器中选择正则表达式提取器来获取返回值,左边界和右边界之间的内容就是要获取的值。

3)由于登录跟充值是在不同的线程,那么我们从登录线程获得的值如何跨线程传递给充值线程呢,我们可用全局变量来实现数据跨线程传递。
设置全局变量setproperty-->beanshell sampler编译--->接收全局变量property
1>设置全局变量,全局变量名称我们取setsession,将从登录请求获得的返回信息session赋值给这个全局变量

2>运行全局变量需要用到取样器中的Bean shell Sampler,这是一个java解释器,我们用它来实现全局变量跨线程操作

3>使用全局变量,用_property函数来实现

4>调试脚本,把获取全局变量函数${__property(setsession,,)}赋值给充值请求的参数,运行并检查充值的请求数据是否有登录的cookie信息。
5、Jmeter脚本录制
1)设置Jmeter代理
1>测试计划--添加--非测试原件--HTTP代理服务器

2>设置脚本归属的线程--注意端口号,目标控制器选择脚本归属的线程(如下选择百度账号注册线程)

3>为了避免Jmeter抓取到太多我们不需要的东西,我们先要设置过滤,过滤掉一些静态资源(如图片),设置如下,点击“启动”

4>设置浏览器代理,本人使用的是Chrome浏览器,步骤为:浏览器右上方有三个竖点,点击并选中设置-->选择高级-->选择打开代理设置->跳出如下对话框进行设置。

5>开始录制脚本,以某个登录功能为例,先输入用户名,密码-->再设置浏览器代理(避免录制到不需要的数据)-->点击登录按钮-->查看线程下就有录制到的登录脚本-->关闭浏览器代理及点击jmeter的":停止"
最后处理并查看我们录制到的登录脚本

如果完全使用文字描述的话,可能大部分人看了也不知道操作,云里雾里,没什么借鉴价值,故本人使用了大量的截图并尽可能的标示清楚,就是希望读者能明白每一句话的含义,从而达到自己动手的能力。
不过这样导致了版面不美观,但个人认为比起美观实用还是最重要的。
浙公网安备 33010602011771号