jmeter 参数化学习笔记
上次写了在接口的交互过程中,系统返回的内容,需要在接下来的交互中用到,从而把参数进行参数化的关联,这次写一下在压测过程中,如果每次发起请求参数名相同,单参数值需要替换的,我们需要进行的参数化。
在使用Jemeter做压力测试的时候,比如登录接口,往往需要参数化用户名,密码以到达到多用户使用不同的用户名密码登录的目的.或者注册接口也需要大量不同的用户名和密码的用户以达到目的。
一、使用CSV Data Set Config实现参数化
我们以上次说到的添加学生信息接口为例来实验。
首先通过Test Plan或者Thread Group或http请求的Add->Config Element->CSV Data Set Config添加
以下是CSV Data Set Config各个参数的简要说明:
- FileName:参数化文件的读取位置,
- File Encoding: 选择UTF-8
- Varible Names: 变量名称。这里定义的变量名称,后面就可以直接用来引用了。(多个变量名称以逗号隔开。例如username,passwd。参数化文件中同样有对应的两列数据。)
- Delimiter:分隔符,默认逗号。
- Allow Quoated data: 是非选项,是否允许变量中间有分隔符,这里最好先默认false,数据中间最好不要有分隔符。
- Recycle on EOF: 设置为True后,允许循环取值
- Stop Thread on EOF: Recycle on EOF和Stop thread on EOF按需设置。是否循环,到结尾是否停止测试。
- Sharing Mode: 设置是否线程共享,allthreads表示所有的线程都可以利用此参数化。
准备测试数据
添加学生信息接口
请求URL:http://api.nnzhp.cn/api/user/add_stu
- 请求方式 post
- 参数 ,入参是json类型
参数名 必选 类型 说明
name 是 string 学生姓名
grade 是 string 班级
phone 是 string 电话
sex 否 string 性别,如果不传,默认为男
age 否 string 年龄 ,不传默认为18
add 否 string 地址,如果不传默认为北京市昌平区
返回参数说明
参数名 类型 说明
error_code int 错误编码,1000为操作成功
msg string 提示信息
创建学生账号的时候,手机号码不能重复,姓名我们也设置为不重复,则需要参数化的参数为:name,phone
新建文件userinfo.txt
填写相应的信息
引用方法是 ${} ;其中{}内写入参数化中的变量。
线程数我们设置为1.循环11次,表示一个用户调用这个接口11次;因为文件中只有10条数据,我们可以看一下循环之后的效果;
点击运行,查看结果树
我们可以看到请求调用的11次,第一次的phone为1结尾;第二个请求获取的phone为2结尾;
第10个是调用成功的,第11个是执行失败的,手机号码重复的。
如果只从调用结果中我们看不出添加是否成功,所以可以添加断言来看是否达到了我们预期的效果;
APPly to:适用范围
Main sample and sub-samples:作用于父节点取样器及对应子节点取样器
Main sample only:仅作用于父节点取样器
Sub-samples only:仅作用于子节点取样器
JMeter Variable:作用于jmeter变量(输入框内可输入jmeter的变量名称)
要测试的响应字段:要检查的项
响应报文
Documeng(text):测试文件
URL样本
响应代码
响应信息
Response Headers:响应头部
Ignore status:忽略返回的响应报文状态码
模式匹配规则:
包括:返回结果包括你指定的内容
匹配:(好像跟Equals查不多,弄不明白有什么区别)
Equals:返回结果与你指定结果一致
Substring:返回结果是指定结果的字串
否:不进行匹配
要测试的模式:即填写你指定的结果(可填写多个),按钮【添加】、【删除】是进行指定内容的管理
此处我们选择响应文本,选择规则为包括,内容为:操作成功 ,意思为返回结果中包括“操作成功”则创建用户成功;
我们在来执行一次上面的操作:
我们可以看到最后一次执行的结果是红色的,查看断言结果为匹配失败。
二、使用函数助手对话框实现参数化
jmeter中创造函数随机数的工具在选项->函数助手对话框
在函数里选择一个功能,例如_Random
设置一个最小数,一个最大数和一个参数名,点击生成,生成函数字符串,放入到需要参数化的参数中
${__Random(1000,1100,name2)}
同样的道理,我们对手机号也执行此操作
我们再来执行一下操作
可以看到执行结果中,我们传入的参数为设置的随机数中的随机数,11次调用结果都是成功的,因为没有重复。
jmeter关联、下载文件、简单压测
关联
一、什么是关联
关联是请求与请求之间存在数据依赖关系,需要从上一个请求获取下一个请求需要回传回去的数据。
简单地说就是在测试过程中有些数据的值会经常发生变化,要获取并使用这些数据,把这个动态的信息保存下来,我们就要进行关联。
例如:用户登录后,session信息都不同,有些操作要使用session,就需要将这个动态的信息保存下来。
还有经常遇到的场景,第二个请求提交的参数要从第一个请求的返回数据中获取。
二、关联的用法
常用的两种关联用法
1.json Path Extractor提取参数值
2.正则表达式的方法
我们已学生金币充值的接口为例来实验,由于接口需要权限,需要获取登录时的sign值我们就用关联来实现。
登录接口
请求URL
http://api.nnzhp.cn/api/user/login
- 请求方式 post
- 请求参数 参数为key-value形式
参数名 必选 类型 说明
username 是 string 用户名
passwd 是 string 密码
登陆用户名:niuhanyang
密码:aA123456
返回参数说明
参数名 类型 说明
error_code int 错误编码,0为操作成功
login_info object 登录对象信息
userId int 用户id
sign string 签名
login_time string 登录时间
打开jmeter,添加登录接口请求,调用查看结果
获取学生信息接口
请求URL http://api.nnzhp.cn/api/user/stu_info
- 请求方式 get
- 请求参数
参数名 必选 类型 说明
stu_name 是 string 学生姓名
调用接口结果
学生金币充值
请求URL:
http://api.nnzhp.cn/api/user/gold_add
- 请求方式 post
- 参数 ,
该接口有权限验证,需要admin用户才可以做操作,需要添加cookie
cookie中key为登录的用户名,value从登录接口中获取,登陆成功之后会返回sign
参数名 必选 类型 说明
stu_id 是 int 学生id
gold 是 int 金币数量
返回参数说明
参数名 类型 说明
error_code int 错误编码,0为操作成功
msg string 提示信息
第一种方法比较简单,使用插件json path postprocessorh 或 jp@gc - json Path Extractor
如下:在登录接口添加json path postprocessorh,获取需要参数化的值的信息
$.login_info.sign
提取json串,使用json path extra
意思为给sign赋值,取值第一层为$,第二层为login_info , 第三层为sign ;
{(第一层)
"error_code": 0,
"login_info": {(第二层)
"login_time": "20171210170002",
"sign": "5071cef01583473c7beb6fe1110f937f",(第三层)
"userId": 8
}
}
然后在cookie设置中,sign的值进行参数化,参数化的值用${参数名}
上面的例子中,返回值只有一个结果,如果存在多个结果的场合,我们怎么取值呢?
现在我们以学生ID为例来实验,可以看到上图中的查看学生信息中反回了多个ID号,我们用上边的方式来试一下
添加json Path Extractor
从学生信息返回的结果看,获取内容的json串取为$.stu_info.id,将stu_id进行参数化为${id},执行
可以看到执行结果是失败的,传入的学生id是我们输入的默认值nono。
我们来看一下学生接口的返回信息
{
"error_code": 0,
"stu_info": [
{
"id": 872,
"name": "A",
"sex": "nn",
"age": 33,
"addr": "士大夫是非得失的士大夫士大夫",
"grade": "33",
"phone": "15221223211",
"gold": 9500
},
{
"id": 1053,
"name": "A",
"sex": "nn",
"age": 33,
"addr": "士大夫是非得失的士大夫士大夫",
"grade": "33",
"phone": "16221223211",
"gold": 100
}
]
}
上述的返回结果中,有两组信息,包含了两个学生的信息,如果用$.stu_info.id,计算机不知道要去获取,所以我们需要指定一下要获取哪一个ID号
$.stu_info[1].id
[1]因为计算机的计数是从0,开始的,所以1表示的是取第二个学生信息中的id号,我们再来执行一下
执行结果是成功的。
2.正则表达式 需要进行参数化还有一种方法是用正则表达式,如下
执行
下载文件 1.文件上传我们先来回忆一下在jmeter中文件上传的操作
文件上传类型
请求URL:
http://api.nnzhp.cn/api/file/file_upload
- 请求方式 post
- 参数
参数名 必选 类型 说明
file 是 file 文件
返回参数说明
参数名 类型 说明
error_code int 错误编码,0为操作成功
msg string 提示信息
在jmeter中添加http请求,选择文件,添加参数信息,执行
可以看到上传文件执行成功了。
2.下载文件
现在我们来试一下下载文件是如何操作的
在网络上找到一个图片资源,获取到图片的地址:http://img4.duitang.com/uploads/item/201209/08/20120908180716_3rrvi.jpeg
我们在jmeter中新建一个HTTP请求,填写相应的参数,执行
可以看到下载成功了,那怎么把图片下载到本地呢?这就需要用到Bean Shell Sampler
BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法;
具体如何写java代码这里就不具体介绍了,可以找到一段下载文件的代码。
代码如下:
import java.io.*;
byte[] result = prev.getResponseData(); //这个是获取到请求返回的数据,prev是获取上个请求的返回
String file_name = "C:\\besttest\\jmeter\\xiaer.jpg"; //代表存放文件的位置和文件名
File file = new File(file_name);
FileOutputStream out = new FileOutputStream(file);
out.write(result);
out.close();
执行并查看结果:
可以看到在填写的下载路径文件夹下,可以看到下载好的文件
压测
一、什么是压力测试 压力测试通过确定一个系统的瓶颈或者不能接收的性能点,来获得系统能提供的最大的服务级别的测试。通俗地讲,压力测试是为了发现在什么条件下您的应用程序的性能会变得不可接受。
再直白一点就是被测试的系统,在一定的访问压力下,看程序运行是否稳定/服务器运行是否稳定(资源占用情况)
二、压力测试的工具
最常用的压力测试工具是loadrunner和jmeter
下面我们说一下jmeter中怎么做简单的压测
以上面的登录接口为例
登录接口
请求URL
http://api.nnzhp.cn/api/user/login
- 请求方式 post
-
请求参数 参数为key-value形式
参数名 必选 类型 说明
username 是 string 用户名
passwd 是 string 密码
登陆用户名:niuhanyang
密码:aA123456
添加线程组,添加http请求,添加聚合报告
设置压测的并发数,这里我们设置100个并发,循环10次,持续30s
下面看一下各个参数的含义:
Label:每个 JMeter 的 element(例如 HTTP Request)都有一个 Name 属性,这里显示的就是 Name 属性的值
#Samples:表示你这次测试中一共发出了多少个请求,如果模拟10个用户,每个用户迭代10次,那么这里显示100,我们设置的为100个用户循环10次,所以一共的请求为100*10=1000
Average:平均响应时间——默认情况下是单个 Request 的平均响应时间(单位是毫秒),当使用了 Transaction Controller 时,也可以以Transaction 为单位显示平均响应时间
Median:中位数,也就是 50% 用户的响应时间
90% Line:90% 用户的响应时间
Min:最小响应时间
Max:最大响应时间
Error%:本次测试中出现错误的请求的数量/请求的总数
Throughput:吞吐量——默认情况下表示每秒完成的请求数(Request per Second),当使用了 Transaction Controller 时,也可以表示类似 LoadRunner 的Transaction per Second 数
KB/Sec:每秒从服务器端接收到的数据量,相当于LoadRunner中的Throughput/Sec
根据具体的压测结果与目标需求进行比较来分析是否满足需求以及需要进行的优化操作
3、添加压力机
有时压力测试的时候一台压力机可能不能满足需求,我们需要添加多个压力机,或者用其他人的机器进行压测,这个时候我们就需要添加压力机。
1、先在其他电脑上启动jmeter_server,确保都在一个网段上,确保几台机器能ping通
2、修改jmeter配置文件,在remote_hosts 添加对应的IP地址,端口号默认1099
3、本机启动jmeter,在运行中选择远程启动,可以单独启动压力机也可以全部启动
如果脚本里边又参数化文件的话,那么在其他压力机上相同位置也得有相同的文件。
我们在本地jmeter看一下添加的压力机
运行->远程启动
或者直接点击全部运行按钮,进行运行,就可以进行压测啦,大家一起来试一下吧
好了 这次就学习到这了哦!
还想学习的话,记得收藏及关注哦.
感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:
① 2000多本软件测试电子书(主流和经典的书籍应该都有了)
② 软件测试/自动化测试标准库资料(最全中文版)
③ 项目源码(四五十个有趣且经典的练手项目及源码)
④ Python编程语言、API接口自动化测试、web自动化测试、App自动化测试(适合小白学习)
⑤ Python学习路线图(告别不入流的学习)
在我的QQ技术交流群里(技术交流和资源共享,广告进来腿给你打断)
可以自助拿走,群号768747503备注(csdn999)768747503备注(csdn999)群里的免费资料都是笔者十多年测试生涯的精华。还有同行大神一起交流技术哦。