Apache JMeter 是 Apache 组织基于 Java 开发的压力测试工具,用于对软件做压力测试。
JMeter 最初被设计用于 Web 应用测试,但后来扩展到了其他测试领域,可用于测试静态和动态资源,如静态文件、Java 小服务程序、CGI 脚本、Java 对象、数据库和 FTP 服务器等等。JMeter 可对服务器、网络或对象模拟巨大的负载,在不同压力类别下测试它们的强度和分析整体性能。另外,JMeter 能够对应用程序做功能/回归测试,通过创建带有断言的脚本来验证程序是否返回了期望结果。为了最大限度的灵活性,JMeter 允许使用正则表达式创建断言。
Apache JMeter 是 Apache 组织基于 Java 开发的压力测试工具,用于对软件做压力测试。
JMeter 最初被设计用于 Web 应用测试,但后来扩展到了其他测试领域,可用于测试静态和动态资源,如静态文件、Java 小服务程序、CGI 脚本、Java 对象、数据库和 FTP 服务器等等。JMeter 可对服务器、网络或对象模拟巨大的负载,在不同压力类别下测试它们的强度和分析整体性能。另外,JMeter 能够对应用程序做功能/回归测试,通过创建带有断言的脚本来验证程序是否返回了期望结果。为了最大限度的灵活性,JMeter 允许使用正则表达式创建断言。
安装java环境,因为JMeter工具是基于java开发的(安装JDK)
JMeter工具下载与安装
backups目录
:备份脚本(没有写脚本没有此目录)bin目录
:模板,主要jar包,启动文件,jmeter.properties全局配置文件。jmeter-server.bat分布式压测extras目录
:存放和集成第三方的一些文件lib目录
:存放jar包线程组之间在执行是没有顺序。如果希望线程按顺序执行,则需要勾上【独立运行每个线程组】
勾上【独立运行每个线程组】以后,线程组按顺序执行
线程组:
setUp 线程组中的请求会在所有请求之前执行,tearDown 线程组中的请求会在所有请求之后执行
测试片段:可以理解为是特殊的线程组,和线程组同级别。用于多个测试之间协同做接口测试。主要是和模块控制器以及Include控制结合使用
使用情况:
特点:
1.默认是禁用状态
2.单个测试片段无法执行,需要结合模块控制器(自己调试)以及Include控制器(leader-领导)执行
单个测试调试
多个测试调试:多个测试片段需要配合多个模块控制器使用
组员如何保存测试片段:选中要保存的测试片段→鼠标右击→选中部分保存为
模拟Leader调试组员的测试片段
创建一个 “线程组” → 线程组中创建一个 “Include控制器” → 浏览文件 "选择组员的保存的测试片段→创建 “查看结果树” → 运行查看结果
http协议端口:80
https协议端口:443
HTTP Cookie管理器:自动的处理有cookie关联的接口
什么是关联接口:一个接口的返回值会作为另外一个接口的入参
正则表达式提取器:左边界和右边界不能缺失,如果有特殊字符必须用 “\” 转义符
关联接口如何进行接口测试:把接口返回值当做一个变量
返回值如何进行设置到对应变量:
.*?
基本用法:
多个值的用法:
基本用法
(1) $
根节点
(2) .键名
或 ["键名"]
去子节点
(3)如果是数组(llist),则通过下标取值
(4)相对路径用法:$..键名
这里的name一般需要唯一
(5)列表切片:$.tags[0:2]
($.tags[开始下标:结束下标]
取值包括开始下标的值,不包括结束下标的值)
总结:看到字典则用
.
看到列表则用[0]
下标,下标从0开始。
JSON提取器基本用法
参数:表单键值对,表格。
消息体数据:JSON数据,以 {}
和 []
组成的数据
文件上传:文件
工具 → 函数助手对话框
函数:BeanShell(将小写字母变成大写)
函数:javaScript(将小写字母变成大写)
先使用随机字符串函数生成一个3位随机小写字母 → 然后使用BeanShell函数或者javaScript函数将小写字母变成大写
#随机字符串函数生成3位随机小写字母
${__RandomString(3,abcdefghijklmnopqrstuvwxyz,)}
#BeanShell函数将小写变成大写
${__BeanShell("${__RandomString(3,abcdefghijklmnopqrstuvwxyz,)}".toUpperCase(),)}
#javaScript函数将小写变成大写
${__javaScript("${__RandomString(3,abcdefghijklmnopqrstuvwxyz,)}".toUpperCase(),)}
主要通过Failure标识是否失败和FailureMessage标识失败信息。Failure=true 失败,Failure=false 成功
//注释:断言返回的状态码为200
if("200".equals(""+ResponseCode)){
Failure = false;
FailureMessage = "断言状态码为200成功!";
}else{
Failure = false;
FailureMessage = "断言状态码不为200失败,返回的状态码为:"+ResponseCode;
}
//注释:断言返回的结果中包含有某一个字符串
//获取返回的结果
var result = prev.getResponseDataAsString();
if(result.contains("星标组")){
Failure = false;
FailureMessage = "断言返回结果包含[星标组]成功!";
}else{
Failure = false;
FailureMessage = "断言返回结果不包含[星标组]失败,返回的信息为:"+result;
}
数据库断言使用
1.在测试计划中引入数据库驱动jar包或将数据库驱动jar包拷贝到JMeter安装目录中的
lib目录中
2.新建:JDBC Connection Configuration
3.新建:JDBC Request
4.使用BeanShell断言实现数据库断言
//获取数据库查询的数据
//name = 星标组
String name = vars.getObject("result").get(4).get("name");
//打印查看信息
log.info(name);
var result = prev.getResponseDataAsString();
if(result.contains(name)){
Failure = false;
FailureMessage = "断言返回结果包含" + name + "成功!";
}else{
Failure = false;
FailureMessage = "断言返回结果不包含" + name + "失败,返回的信息为:"+result;
}
CSV参数化(CSV 数据文件设置)使用
1.准备一个csv数据文件,按照测试接口需求填写准备对应的数据
2.新建一个 “CSV 数据文件设置” → 填写对应的信息
3.调用 “CSV 数据文件设置” 里面的变量
4.创建一个 “响应断言”(断言响应返回的数据是否跟CSV数据文件里面设置的断言结果相同) → 调用CSV数据文件里设置的断言结果变量
5.创建一个 “循环控制器” → 将测试的接口放到循环控制器中
6.查看执行结果
注意:如果有接口关联,后面的接口需要用到前面接口的数据,那么就要把与预期结果相同的数据放到CSV数据文件的最后,避免后面关联的接口获取不到前面的数据
对第2个接口做基准(压力)测试,但是第二个接口又依赖于第一个接口,那么把他们放到同一个线程组测试则相当于是对两个接口进行测试,而不是单独对第2个接口进行测试,造成测试不准确
跨线程组实现接口关联
1.线程组1中的接口使用了JSON提取器提取了接口返回数据中某个键的值
2.线程组1中的接口新建一个 “BeanShell 后置处理程序”
3.使用 “函数助手对话框” 中的 "setProperty"函数 (如图所示进行操作) → 复制生成的函数字符串 → 在 “函数助手对话框” 中使用setProperty函数生成的函数字符串
4.使用 “函数助手对话框” 中的 "property"函数 (如图所示进行操作) → 复制生成的函数字符串
5.调用"property"函数生成的函数字符串
6.勾选 “独立运行每个线程组” (因为线程组之间在执行是没有顺序,不勾选可能会导致线程2比线程1先执行,就会导致结果错误
)
7.查看测试结果
注意:在测试计划中需要勾选上【独立运行每个线程组】
同一个线程:可以增加HTTP Cookie管理器
就可以自动化管理
如果是跨线程:
1.(可以按照上面的跨线程组实现接口关联方式先操作,操作完成后执行下面步骤)
2.修改JMeter安装目录下的bin
目录中的 “jmeter.properties” 配置文件(修改如图所示——配置完成后关掉命令提示符及JMeter工具,然后重启JMeter)
CookieManager.save.cookies=True
3.查看如下图所示两个地方的Cookie值,如果两组数据一致表示Cookie值百分百正确,如果两组数据不一致,取数据多的那一组
4.从调试取样器中取得Cookie的值并在 “BeanShell 后置处理程序” 中设置为全局变量
注意:变量名不能随便取,必须和响应头里面的变量名一致
5.将 “BeanShell 后置处理程序处理器” 中设置的全局变量添加到 “HTTP Cookie管理器” 中
6.将关联的接口实现Cookie关联
调试取样器
固定定时器
用户定义的变量