jmeter参数化
背景
进行接口,性能测试进行参数化是必然要考虑的场景,自从上次使用了jmeter进行接口测试后,就已经开始思考了jmerer如何进行参数化,来方便测试,通过查阅相关资料,将jmeter参数化分为两个部分进行讲解。
简单参数化
怎么定义简单呢,就是直接在jmeter中设置就可以了,不需要调用其他的东西(数据库、CSV)文件。简单的参数化设置主要有以下:
- 用户定义变量
- 随机变量
- 正则表达式提取器
- 函数助手
用户定义变量
添加用户定义变量主要有两个地方:点击测试计划-用户定义变量。进入某一线程租,右击-添加配置元件-用户定义变量。下面对定义变量的作用域进行实验:
-
在测试计划上添加用户变量:用户名与密码,在第一个线程组也定义用户变量,在第一个线程组的某个请求中定义变量。为了做到区分,对每一组变量定义时,key与value均不一样,具体如下。
通过运行测试计划,发现所有的请求均断言成功,说明只要定义的变量是唯一值,那这个变量就是全局的。从实际情况出发,如果真的是全局的,可以直接定义再测试计划中(域名),如果是局部使用的可以直接定义再某个线程组,因为定义在测试计划中,如果一旦停掉该线程组,则里面用户自定义的变量将不能被引用。当时还想到一个问题:如果是定义的变量重名,引用的规则是什么样的,将线程组2中的用户变量定义与线程组1中请求定义的一致(想当然的以为走最近原则还是会调用同一个线程组的变量),实际上调用的是第二个线程组的变量。其实就一个原则:不要定义两个变量名一致的变量。
随机变量
随机变量有两种方式:用户直接定义,其实就是用户定义变量,只是值不固定,还有就是借用函数助手来生成随机变量。
用户定义随机变量
用户定义随机变量,参考用户定义变量,可以在测试计划、线程组、sample中定义。关于作用域与用户定义变量一致。在线程组中自定义一个变量如下:
为了查看获取的电话号码是否为随机数,将线程的循环次数定为6,校验每次发出请求的参数是否为随机产生的。
经查看我们的随机每次请求中携带的参数是不一样的,所以简单的随机变量这样设置就可以了。但是我们的随机数的设置还有一个两个设置需要说明下:
Seed for Random function 随机数产生器的种子,默认为当前时间(以毫秒为单位)
- Per Thread(User) 如果为False,则随机数产生器在线程组的所欲线程共享,为True,则每个线程都有自己的随机数产生器
通过函数助手生成随机变量
函数助手的中对应的函数非常大,如果有需要可以查阅官方文档查看官方文档说明,这里只是要用随机函数来生成随机变量,所以对随机函数进行说明。
添加随机函数:点击选项函数助手下拉框中选择__Random函数
-
添加对应的的参数,最大值,最小值,变量名
-
点击生成会产生对应的函数字符串,请求中直接进行引用。见下图
-
运行一下请求,查看结果,确实是正常获取了随机变量。见下图
正则表达式提取器
正则表达式提取器主要用在jmeter关联中。关联是请求与请求之间拥有数据关联。可以是同一个线程组关联,也可以是跨线程组关联。因为在使用过程中发现正则表达式会不正确,这里提供一个正则表达式在线校验地址正则表达语法校验
线程组内正则表达是提取使用
通过获取优惠券列表后,直接从返回结果进行优惠券详情查询。
整体的构造如图,有些不用的我直接禁用掉。
-
查询优惠券正常发出请求,对返回结果进行提取
备注:对于正则表达式的配置说明,网上相应的说明比较多,可自行查阅相关资料,这里不进行阐述。
-
进行查看优惠券请求,其中接口相关参数参考优惠券列表接口返回结果,如下
-
看看是否正确获取了相关参数
以上就是同一个线程组内的正则提取。
跨线程正则提取
依然是用优惠券的例子,只是这次查询优惠券的接口与获取优惠券列表不在一个线程组内。主要思路是:将在线程中的变量,设置为属性,这样就可以为全局使用。但是前提是第一个线程组要先执行,否则变量获取不到。所以在测试计划中勾选独立运行每个线程组。
-
测试在获取到优惠券的请求中添加BeanShell PostProcessor ,将通过正则提取获得的变量设置为JmeterProperties。具体操作如下
-
可以通过在工作台中添加非测试元件——Property Display中查看是否设置JmeterProperties 成功
-
新建一个线程组并添加同样的查询用户券,直接引用jmeter属性,具体如下
4.查看请求结果可以看到变量引用正常
这样就实现了跨线程的变量引用。
函数助手
函数助手提供了很丰富的函数功能,在获取随机变量已经使用了随机变量的函数,在跨线程组的时候使用了${__P(coupon,null)},其实可以用函数助手,找到函数助手中的-p函数就行。因为函数助手中的函数偏多,这里不做详述,可以到官网查看函数助手。查看之后,自行判断是否可以使用。
复杂一点参数化
定义复杂,其实就是需要用到外部资源,比如外部文件,比如数据库。
- 读取参数文件
- 读取数据库
读取文件
jmeter即可以读取多种文件,这里只CSV文件进行读取说明,个人觉得这种用的比较多。读取CSV文件有两种方式,一种通过配置CSV Data Set Config 进行读取,还有一种是通过函数助手进行读取。
CSV Data Set Config方式
这里我们模拟的是不同帐号登录场景,用户名,密码均是读取CSV。
- 准备测试数据
建立一份csv数据,用户名为第一列,密码为第二列。如图
-
添加CSV Data Set Config
测试计划-右击添加配置元件-选择CSV Data Set Config进行配置,配置项的说明可以自行在网上查阅。
线程组的循环测试配置的8,config配置Recycle on EOF 为true,这样可以循环读取,否则读到最后一行就停止了。
-
请求配置获取数据,变量名取的是CSV Data Set Config中的variabld Names
-
运行,查看是否请求中读取了csv中的数据。
函数助手读取
-
通过函数助手中的csvRead函数读取。首页也是准备数据,这里就用上面准备的这份数据。选项函数助手_csvRead函数,按如下配置
-
进行请求配置,见下图
-
查看请求参数,是否正确获取了文件内容
以上就是读取csv文件的方法.必须说明的是如果线程组中配置的是线程数大于1则从第一行读取,如果大于配置文件的行数,则循环读取数据。如果线程数配置为1则只会读取第一行数据。
读数据库
csv读取是自己准备一些测试数据,很多情况下我们需要校验落库或是直接从数据库中读取数据来作为请求参数。设想场景是查询数据库,然后循环读取查询结果作为下一个请求的参数。下面就这个场景进行实践。
-
在测试计划中添加数据库配置信息。测试计划_添加配置元件_JDBC Connection Configuration
各个配置项信息在网上又相关资料,这里配置参数说明
- 添加数据库请求
这里对返回的数据设置了两个变量article_id,id 两个变量。如果需要时引用,${article_id_1}是artilce_id 第一行,${article_id_1}取第二行,总数可以用${article_id_#}来获取。id同样也是如此。
- 因为是需要获取循环读取,所以我们可以添加一个循环控制器
循环次数直接用${article_id_#}。
- 因为是逐行读取,所以可以添加个计数器来实现
-
article_id 需要拼接计数器来生成一个变量,所以需要用的函数助手中的--V函数。配置如下:
-
所有准备工作都做好了,现在就准备添加一个请求来读取数据,配置如下
-
校验请求是否正常获取参数
- 备注
配置好后进行链接发出请求,提示cannot load JDBC Driver class "com.mysal.jdbc.Driver",解决方法
jmeter的参数化就这样告一段了,下次考虑进行简单压测脚本编写。