-
首先我们了解一下什么叫做参数化
简单的举例就是: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控制器)来进行对返回值做判断.
- 首先需要在提取响应值的case下添加一个“后置处理器>正则表达式提取器”
- 对需要判断的结果做提取,格式xxx(.*?)xx提取出需要的字段
- 在if控制器中引用“正则表达式提取器”中声明的变量,并且==预期的结果
- 如果响应结果和预期结果相等,则执行“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 配置连数据库
- Variable Name:随便起个名称,后面的JDBC Request要用到,才能读取JDBC Connection Configuration里的配置
- Database URL:jdbc:sqlserver://IP:默认端口;databaseName=实例名
- JDBC Driver class: com.microsoft.sqlserver.jdbc.SQLServerDriver写死的,每个数据库有不同的jdbc driver
- Username: 数据库账号
- 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":"wangkangjian@126.com",
"schoolEn":"xxxxxxxxxx",
"detailAddress":"闵行区马桥镇",
"postCode":"111111"
},
"subMatchName":"${subMatchName}"
}
网友评论