02_Jmeter加强之参数化

  • 首先我们了解一下什么叫做参数化

简单的举例就是:1+1=2,但是现在我把其中的一个“1”替换一个的字符“A”,这个A我们给赋值A=1,那么1+A=2成立,继续延伸一下,A是不是也可以等于3、4、5...,给A替换不同的值,结果也不一样,把其中的一个1替换成A 这个就叫做参数化

参数化是自动化测试脚本的一种常用技巧。简单来说,参数化的一般用法就是"将脚本中的某些“输入”,改为使用参数来代替",在脚本运行时指定参数的取值范围和规则;
这样,脚本在运行时就可以根据需要选取不同的参数值作为输入。这种方式通常被称为数据驱动测试,参数的取值范围被称为数据池!

  • 先创建一个jmeter脚本,创建好线程组,HTTP请求、填写好相关内容,然后来学习一下jmeter中的几个简单的参数化
  • 1. 用户自定义变量
  • 然后“添加”一个变量,然后给变量赋一个值
  • 下面我们引用这个变量,引用变量的格式:{userName}
  • 然后执行脚本,在查询结果数看请求的参数是否成功


  • 参数化成功,要输入数据的成功引用变量名指向的数据

  • 2. 函数助手对话框
  • 这是一个随机字符函数 __Random String
    Random string length:要随机的字符长度
    Chars to use for random string generation:要随机的字符


  • 下面把我们生成的函数放到请求中,然后运行一下查看效果,如图:右边显示的是左边函数生成的随机数据,每次随机的都不一样!
  • 3. CSV Data Set Config:导入本地CSV文件中的数据

首先我们在本地E盘中创建一个CSV文件,在CSV文件中输入数据。


  • 输入数据后,保存>然后选择CSV格式,选择替换
  • ① 在jmeter中右键线程组,选择“配置元件→CSV Data Set Config”;
  • ② 配置路径;
  • ③ 配置读取数据的编码格式;
  • ④ 配置变量,CSV文件中每列对应一个变量
:变量之间用英文逗号分隔,结尾处也不能有空格
  • 然后我们去应用这些变量,这里我选择了在http请求中的名称里引用变量,只是为了演示用!可以看到每个变量都取到值了。

  • 如果要都用到,这个时候只要在线程组里设置一下循环次数,就可以把CSV中的数据全部使用到!


  • 这里我只展现了最下面,可以看见一只使用到了G008
  • 4. 正则表达式提取器:
  • 一个接口返回值多个,每个结果都对后续的业务流程或调用的接口有影响,这个时候jmeter就需要一个(if控制器)来进行对返回值做判断.
  1. 首先需要在提取响应值的case下添加一个“后置处理器>正则表达式提取器”
  2. 对需要判断的结果做提取,格式xxx(.*?)xx提取出需要的字段
  3. 在if控制器中引用“正则表达式提取器”中声明的变量,并且==预期的结果
  4. 如果响应结果和预期结果相等,则执行“if控制器”下的case,不相等则跳过“if控制器”下的case,继续往下执行

首先创建一个if控制器,然后在要判断返回结果的接口上,添加一个后置处理器>正则表达式提取器



在正则表达式提取器中,上面的选择可以不用做修改:
① 直接设置一个提取值存放的“变量” 命名result
② 对接口的响应报文中定位,并提取出需要的数据(.*?)这里先用一个统一的正则表达式,后续单独写一篇“正则表达式”的使用
③ 模块和匹配数字可以先不管,因为我们只提取一串字符
④ 试运行一下,看有没有提取成功

  • 如下图:正则提取"respDesc":"(.*?)","respCode":"0000"}分成三个部分,respDesc":"()"}两边起到定位左右,左边要有respDesc":",右边是","respCode":"0000"},中间就是我们提取的内容!这里创建了一个空的http请求,用名称验证提取的变量,验证通过!
  • *注下图的响应报文做了修改,正则表达式改成了"respDesc":"(.*?)","respCode":"0000"}提取的字符串不变,还是“成功”

  • if控制器中条件的意思:正则表达式提取的实际结果==预期的结果
    预期的结果肯定是提前知道的。
    if判断如果成功,就执行“if控制器”下的子case,然后去执行下面的case;
    if判断如果不成功,则不执行“if控制器”下的子case,直接去执行下面的case;

  • 下图可以看到,我设置的if条件是,"${result}"=="成功",但是实际的值是另外的,所以if控制器下的case没有执行,直接执行了登录接口

  • 下图可以看到,我设置的if条件是,"${result}"=="成功",实际结果就是"成功",所以先执行if控制器下的case然后去执行了登录接口

  • 5. JDBC Request SQL查询数据库,返回测试数据

上面介绍了一个CSV的链接方法,但是如果我需要参数化的数据都在数据库中怎么办???难道我复制出来然后放到CSV文件中,然后去读取、使用?这里可以使用到JDBC Request,把要测试的数据查询出来!
① 我们需要下载一个jdbc.jar包,不同的数据库用的jar不同,需要自行百度下载
② 把jdbc存放到apache-jmeter-3.0\lib文件下,然后右键测试计划,找到这个jar包!


③ 添加一个 JDBC Connection Configuration,然后配置:

一下是:sqlserver 配置连数据库

  1. Variable Name:随便起个名称,后面的JDBC Request要用到,才能读取JDBC Connection Configuration里的配置
  2. Database URL:jdbc:sqlserver://IP:默认端口;databaseName=实例名
  3. JDBC Driver class: com.microsoft.sqlserver.jdbc.SQLServerDriver写死的,每个数据库有不同的jdbc driver
  4. Username: 数据库账号
  5. Password : 数据库密码

  • 引用JDBC Connection Configuration里的配置的Variable Name配置的Name,然后在输入框里输入要查询出数据的SQL
  • 给查询的字段设置变量名称
  • 引用变量
    因为我们查询出的数据有很多,是以数组的方式存放的,jmeter并不能直接引用,需要去指定一行一行的去拿
  • ① 单行提取数据: 这里我们可以用${FC_0}、${FC_1}......${FC_N}去拿单行的数据
  • ② case循环,全部使用: 这里我们只需要把${FC_N}的N设置一个变量数组,且不会重复就行,这里我使用了“计数器”

启动的时候是0,每次增加1,并设置了一个变量ID


  • 下面就是把两个变量拼接成一个变量就OK了! 格式:${_V(xx_${xx})} 我们的就是:{ID})},后面就是把这个拼接变量放到你的case中OK啦,而且每次取的数据都不重复,具体的演示结果就不展现了!

6. 后置处理器_JSON Extractor (提取json响应结果)


如果要提取王康健:那么就是:$.countactName

{
  "matchId":200,
  "subMatchId":${subMatchId},
  "contactName":"王康健",
  "contactPhone":"${randomPhoneNum}",
  "country":"上海市",
  "school":"新东方烹饪学校",
  "extraInfo":{
      "email":"[email protected]",
      "schoolEn":"xxxxxxxxxx",
      "detailAddress":"闵行区马桥镇",
      "postCode":"111111"
  },
  "subMatchName":"${subMatchName}"
}

你可能感兴趣的:(02_Jmeter加强之参数化)