浅学Jmeter性能测试:参数化
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅学Jmeter性能测试:参数化相关的知识,希望对你有一定的参考价值。
参考技术A 将一个常量写成变量的形式,每次调用参数获得不同的数据。PS: 这里要说下Cookie,在后面的参数化过程中发现登录接口请求头里要携带cookie;我一直的误解就是只有登录才有cookie产生,其实是不对的, 一般的cookie是会话被创建时就产生,关闭后就消失 ;可以随便访问项目的网页获取到cookie,然后想办法将cookie加到请求头里去~
1、CSV控制-CSV DATA Set Config
线程组 -> 新建请求 ->参数用变量代替 ,格式$变量名
新建EXCEL文件,写入测试数据-> 另存为.csv文件的格式;
线程组 ->添加配置元件->CSV DATA Set Config->在配置元件里输入csv的绝对地址 ->若CSV不含表头,则在CSV数据文件设置里输入表头变量;反之,则不添加;
2、用户自定义变量
比如有登录接口和获取token的接口,都需要输入用户名和密码,如果我在每个接口请求参数都输入一次,相当于输入了两次;那么,可以使用自定义变量,将用户名和密码的值存在一个变量里,后续的接口需要时直接调用参数即可,减少重复输入的次数。具体操作如下:
线程组-> 添加配置元件->选择用户自定义变量->添加变量名及对应的值(key&value);
线程组 -> 新建请求 ->参数用变量代替,格式为$变量名,调用变量值;
PS: 用户定义变量的所有数据只会初始化一次,不管你多少线程,循环多少次,它的值是不变的(即同一个变量的值写死,不能改变)。 用户自定义变量作用域不同,表示的含义也有区别;放在线程组外,表示全部变量;放在线程组内表示局部变量。
3、用户参数
在调试脚本的时候,可以使用前置处理器中的用户参数组件进行数据的提供,在该数据中可以使用固定值也可以使用变量值。
线程组-> 添加前置处理器->选择用户参数->添加变量名,并输入多个对应的值
每次迭代更新一次:如果选中该选项,则参数的值在每个迭代中保持不变,在新的迭代开始时取下一个值。
PS:在使用用户参数时,如果有n个值,需要设置线程数=n,若设置循环为n,只会调用第一个值执行n遍。
4、函数助手
函数助手里内置了多个函数,如__Random或$__CSVRead(,)等可以按需求使用不同的功能函数;
面板-> 选项-> 函数助手对话框-> 根据需要选择不同的函数-> 设置范围及变量名->后续接口调用。
$__CSVRead(,)可以实现读取CSV数据,()里逗号左边是CSV路径,右边是CSV里存放的变量的索引;索引从0开始依次增加1,如 $__CSVRead(D:\jmeter\logins.txt,0)。 注:这里的CSV文件就不要表头了。
用户自定义变量的值写死,不能改变;而用户参数,可以引入函数助手,使得同一变量有不同的变量值。
性能测试-JMeter参数化CSV Data Set Config
一、参数化的定义
所谓参数化,就是将客户端发送给服务器处理的数据预先保存到一个参数中的过程。
一般来说,对于功能测试,当用不同的数据测试相同的功能时,我们可以使用参数化来精简测试;
对于性能测试,为了真实模拟多个用户的操作行为或应对系统对多个用户同时操作的特殊限制(比如数据唯一性要求),需要使用参数化来解决这些问题。
JMeter提供了非常多的参数化的方式和手段,常见有:
1.配置元件 CSV_Data_Set_Config
2.内置参数化函数,比如__CSVRead()
这1节我们主要讲下CSV_Data_Set_Config参数化。
配置项
Configure the CSV Data Source:
1.Filename:
要读取的数据文件的路径或名称。可以使用绝对路径或相对路径。
当使用相对路径表示文件路径时,测试计划所在目录为当前目录。
当JMeter以分布式模式运行时,参数化的数据文件需要复制到每台Slave中,并且要设置相同的目录结构。
2.File Encoding:
若没有设置则以操作系统的字符编码去读取数据文件。可以指定以何种编码去读取数据文件,以防止出现乱码。
比如操作系统默认字符编码为GBK,而数据文件(CSV文件)的编码为UTF-8,则读出来的数据肯定为乱码,在此情况下要设置File Encoding为“UTF-8”才能读取成功。
3.Variable Names(comma-delimited):
用于保存数据文件列值的变量名列表。变量名之间用,(逗号)分隔。若变量名列表为空,JMeter则将数据文件的第一行各字段值作为各个变量名(不论是否忽略第一行)。
比如数据文件中有如下两行值:
张三,男,25
李四,女,20
在没有设置变量名列表的情况下,会将第一行的三个值当做变量名:
张三,男,25
${张三},${男},${20}的值分别是:李四,女,20
4.Ignore first line (only used if Variable Names is not empty):
是否忽略数据文件的第一行。这个选项只有在设置了参数名列表时才起作用。
选择True表示忽略第一行,选择False表示不忽略第一行。一般用在数据文件中有列标题时,因为标题不是值,故考虑可以忽略
第一行。
比如数据文件中有如下值:
name,sex,age
张三,男,25
李四,女,20
若此项设置为False,则会将name,sex,age当做变量的值读取,设置为True会忽略此行,从第二行开始读取。
5.Delimiter (use‘ ‘for tab):
数据文件中字段的分隔符。根据分隔符将记录拆分保存到定义的变量中。默认值为,(逗号)分隔。
6.Allow quoted data?:
数据文件中的值是否允许使用双引号。True表示允许,False表示不允许。
一般用于当值中包含分隔符时,可考虑将值用双引号括起来,屏蔽分隔符的特殊含义。
比如记录了商品编号,名称,价格的数据文件:
goods_id,goods_name,price
1,Watch_wanguo,"1,500,000"
若没有使用双引号,商品价格为1,使用了双引号,商品价格为
1,500,000
7.Recycle on EOF?:
读取到达数据文件结束(EOF即end of file)处,是否回到文件开始出重新读取。
True循环读取,False不循环读取。
8.Stop thread on EOF?:
读取到达数据文件结束处,是否停止线程。True停止线程,测试不再进行;
False不停止线程,继续循环取值运行测试。
9.Sharing mode:
共享模式。All threads所有线程,Current thread group当前线程组,Current thread当前线程。
1)All threads:
所有线程共享同一个文件。在测试中数据文件只打开一次,每个线程读取不同行的参数值。
每个线程读取的值与线程启动的先后顺序相关;不论线程引用参数与否,每个线程都会分配一个参数值。
2)Current thread group:
当前线程组。测试计划下的每个线程组都单独打开一个参数文件。
3)Current thread:
当前线程。每个线程都单独打开一个参数文件。在此模式下,若每个线程需要从不同的值集中取值,
可以设置一组参数化数据文件,每个线程对应一个文件。将线程编号与数据文件名关联起来将可以了。
比如一组文件为:
testdata1.csv,testdata2.csv,... ,
testdatan.csv
线程编号可以通过内置函数${threadNum}来获取,则数据文件名可设置为: testdata${threadNum}.csv。
举个例子:
这里以前面介绍过的查询被购买商品总金额接口为例来讲解:
参数化步骤:
1.确定接口参数中哪些请求参数需要进行参数化
在设计测试用例时,我们针对商品编号,商品规格,商品数量来准备数据,
故对id,attr,number参数化
2.将测试数据放在外部一个文档保存,文件类型为csv或txt -->
.csv or .txt
新建一个testdata.csv,一行写一个用例,多个参数值默认用,分隔:
case_name,id,attr,number
case1,9,226,3
case2,,226,1
case3,9,,1
case4,9,226,
3.添加并配置CSV Data Set Config配置元件
4.在请求中将写死的数据用第3步中定义的变量进行替换
data --> ${varName}
比如 ${attr}
5.配置参数化
5.1 将线程数设置为用例的个数
5.2 循环控制请求的次数
a.添加一个循环控制器,设置其循环次数为测试用例个数
b.将CSV Data Set Config配置元件与请求移到循环控制器下面
以上是关于浅学Jmeter性能测试:参数化的主要内容,如果未能解决你的问题,请参考以下文章
性能测试-JMeter参数化CSV Data Set Config