jmeter 参数化

2018-03-20  本文已影响0人  小小_糊涂虫

jmeter参数化

背景

进行接口,性能测试进行参数化是必然要考虑的场景,自从上次使用了jmeter进行接口测试后,就已经开始思考了jmerer如何进行参数化,来方便测试,通过查阅相关资料,将jmeter参数化分为两个部分进行讲解。

简单参数化

怎么定义简单呢,就是直接在jmeter中设置就可以了,不需要调用其他的东西(数据库、CSV)文件。简单的参数化设置主要有以下:

用户定义变量

添加用户定义变量主要有两个地方:点击测试计划-用户定义变量。进入某一线程租,右击-添加配置元件-用户定义变量。下面对定义变量的作用域进行实验:

  1. 在测试计划上添加用户变量:用户名与密码,在第一个线程组也定义用户变量,在第一个线程组的某个请求中定义变量。为了做到区分,对每一组变量定义时,key与value均不一样,具体如下。


    在不同位置用户自定义变量.png

通过运行测试计划,发现所有的请求均断言成功,说明只要定义的变量是唯一值,那这个变量就是全局的。从实际情况出发,如果真的是全局的,可以直接定义再测试计划中(域名),如果是局部使用的可以直接定义再某个线程组,因为定义在测试计划中,如果一旦停掉该线程组,则里面用户自定义的变量将不能被引用。当时还想到一个问题:如果是定义的变量重名,引用的规则是什么样的,将线程组2中的用户变量定义与线程组1中请求定义的一致(想当然的以为走最近原则还是会调用同一个线程组的变量),实际上调用的是第二个线程组的变量。其实就一个原则:不要定义两个变量名一致的变量。

随机变量

随机变量有两种方式:用户直接定义,其实就是用户定义变量,只是值不固定,还有就是借用函数助手来生成随机变量。

用户定义随机变量

用户定义随机变量,参考用户定义变量,可以在测试计划、线程组、sample中定义。关于作用域与用户定义变量一致。在线程组中自定义一个变量如下:


用户定义的随机变量.png

为了查看获取的电话号码是否为随机数,将线程的循环次数定为6,校验每次发出请求的参数是否为随机产生的。


电话号码随机获取.png 。
经查看我们的随机每次请求中携带的参数是不一样的,所以简单的随机变量这样设置就可以了。但是我们的随机数的设置还有一个两个设置需要说明下:
通过函数助手生成随机变量

函数助手的中对应的函数非常大,如果有需要可以查阅官方文档查看官方文档说明,这里只是要用随机函数来生成随机变量,所以对随机函数进行说明。

  1. 添加随机函数:点击选项函数助手下拉框中选择__Random函数

  2. 添加对应的的参数,最大值,最小值,变量名


    随机函数助手配置.png
  3. 点击生成会产生对应的函数字符串,请求中直接进行引用。见下图


    引用函数助手生成的变量.png
  4. 运行一下请求,查看结果,确实是正常获取了随机变量。见下图


    运行结果.png

正则表达式提取器

正则表达式提取器主要用在jmeter关联中。关联是请求与请求之间拥有数据关联。可以是同一个线程组关联,也可以是跨线程组关联。因为在使用过程中发现正则表达式会不正确,这里提供一个正则表达式在线校验地址正则表达语法校验

线程组内正则表达是提取使用

通过获取优惠券列表后,直接从返回结果进行优惠券详情查询。
整体的构造如图,有些不用的我直接禁用掉。


线程组内正则表达式提取.png 正在表达式提取useid.png

备注:对于正则表达式的配置说明,网上相应的说明比较多,可自行查阅相关资料,这里不进行阐述。

以上就是同一个线程组内的正则提取。

跨线程正则提取

依然是用优惠券的例子,只是这次查询优惠券的接口与获取优惠券列表不在一个线程组内。主要思路是:将在线程中的变量,设置为属性,这样就可以为全局使用。但是前提是第一个线程组要先执行,否则变量获取不到。所以在测试计划中勾选独立运行每个线程组。

  1. 测试在获取到优惠券的请求中添加BeanShell PostProcessor ,将通过正则提取获得的变量设置为JmeterProperties。具体操作如下


    变量设置为jmeter属性.png
  2. 可以通过在工作台中添加非测试元件——Property Display中查看是否设置JmeterProperties 成功


    校验是否设置jmeter属性成功.png
  3. 新建一个线程组并添加同样的查询用户券,直接引用jmeter属性,具体如下


    传入提取的jmeter变量.png

4.查看请求结果可以看到变量引用正常


jmeter属性获取正常.png

这样就实现了跨线程的变量引用。

函数助手

函数助手提供了很丰富的函数功能,在获取随机变量已经使用了随机变量的函数,在跨线程组的时候使用了${__P(coupon,null)},其实可以用函数助手,找到函数助手中的-p函数就行。因为函数助手中的函数偏多,这里不做详述,可以到官网查看函数助手。查看之后,自行判断是否可以使用。

复杂一点参数化

定义复杂,其实就是需要用到外部资源,比如外部文件,比如数据库。

读取文件

jmeter即可以读取多种文件,这里只CSV文件进行读取说明,个人觉得这种用的比较多。读取CSV文件有两种方式,一种通过配置CSV Data Set Config 进行读取,还有一种是通过函数助手进行读取。

CSV Data Set Config方式

这里我们模拟的是不同帐号登录场景,用户名,密码均是读取CSV。

csv文件.png

线程组的循环测试配置的8,config配置Recycle on EOF 为true,这样可以循环读取,否则读到最后一行就停止了。

函数助手读取

以上就是读取csv文件的方法.必须说明的是如果线程组中配置的是线程数大于1则从第一行读取,如果大于配置文件的行数,则循环读取数据。如果线程数配置为1则只会读取第一行数据。

读数据库

csv读取是自己准备一些测试数据,很多情况下我们需要校验落库或是直接从数据库中读取数据来作为请求参数。设想场景是查询数据库,然后循环读取查询结果作为下一个请求的参数。下面就这个场景进行实践。

各个配置项信息在网上又相关资料,这里配置参数说明

数据库请求配置.png

这里对返回的数据设置了两个变量article_id,id 两个变量。如果需要时引用,${article_id_1}是artilce_id 第一行,${article_id_1}取第二行,总数可以用${article_id_#}来获取。id同样也是如此。

循环控制.png

循环次数直接用${article_id_#}。

计数器.png

配置好后进行链接发出请求,提示cannot load JDBC Driver class "com.mysal.jdbc.Driver",解决方法

jmeter的参数化就这样告一段了,下次考虑进行简单压测脚本编写。

上一篇下一篇

猜你喜欢

热点阅读