持续更新…
标记
- 1. JMeter开始
- 1.1 JMeter简介
- 1.2 安装JMeter
- 1.3 JMeter和LoadRunner的区别
- 2. JMeter应用
- 2.1 JMeter发送GET请求
- 2.2 JMeter发送POST请求
- 2.3 JMeter请求参数类型(参数、消息体数据、文件上传)
- 2.4 JMeter的HTTP请求默认值
- 2.5 断言(做判断)
- 2.6 设置变量
- 2.6.1 用户自定义变量
- 2.6.2 函数生成变量
- 2.6.3 BeanShell变量
- 2.6.4 CSV数据文件变量
- 2.7 JMeter的正则表达式
- 2.8 测试用例分离(测试驱动)
- 2.9 JMeter的cookie管理器
- 2.10 JMeter的授权设置
- 2.11 测试报告-聚合报告
- 2.12 如何将JMeter做成自动化测试平台
- 2.13 优化自动化模板
- 2.14 JMeter连接MySQL数据库
1. JMeter开始 1.1 JMeter简介
Apache JMeter是Apache组织开发的基于Java的压力测试工具。
适用的测试领域:
- 用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试领域。他可以用于测试静态和动态资源,例如静态文件,Java,小服务程序,CGI(公共网关接口),脚本,Java对象,数据库,FTP,服务器等等;JMeter可以用于对服务器,网络或对象模拟巨大的负载,来自不同压力类别下测试它们的强度和分析整体性能。
- JMeter能够对应用程序做功能/回归测试,通过创建带有断言的脚本来验证你的程序是否返回了预期的结果;为了最多限度的灵活性,JMeter允许使用正则表达式创建断言。
- JMeter可以用于对静态和动态资源(文件、Servlet、Perl脚本、Java对象、数据库和查询、FTP服务等等)的性能进行测试
- 接口测试
- 数据库压力测试
- 批量产生测试数据
下载JMeter
选一个下载
解压
JMeter是免安装的,所以我们直接将文件夹移动到想要存放的位置即可
配置环境变量
当前我的JMeter的路径为D:InstalledSProgram Filesapache-jmeter-5.4.1
新建系统变量
变量名:JMETER_HOME
变量值:D:InstalledSProgram Filesapache-jmeter-5.4.1
配置Path环境变量 %JMETER_HOME%bin
配置Classpath
添加%JMETER_HOME%libextApacheJMeter_core.jar;%JMETER_HOME%libjorphan.jar;
测试
启动JMeter
- bat方式
- jar方式
jar的方式,直接双击
使用bat的方式,双击,是在cmd中命令行中打开
cmd窗口关闭,jmeter也关闭
将ApacheJMeter.jar发送到桌面快捷方式,重命名,更改图标
接口文档 docsapiindex.html:
- 都是压力测试工具,都可以用来做性能测试,但是JMeter比较轻量级;
- JMeter是用java语言编写的,需要java环境,LR不需要;
- JMeter更偏向于功能和技术,LR更偏向于业务;
- LR有强大的图表系统,但是JMeter这一方面的表现稍弱。
eg:
1)添加线程组
添加->线程(用户)->线程组
2)发起一个HTTP请求
添加->取样器->HTTP请求
3)填写信息
4)添加<察看结果树 >查看请求结果
添加->监听器->察看结果树
5)运行
关于响应结果是乱码的形式
我们这里要进行设置
对配置文件进行修改 bin目录下的jmeter.properties
查找sampleresult.default.encoding将编码方式改为utf-8,将#去掉
保存
重启JMeter,运行,发现已经没有乱码了
eg:
添加<管理员登陆>POST请求
添加HTTP信息头
添加>配置元件->HTTP信息头管理器 Content-Type:application/json
添加<察看结果树>,运行
保存测试计划
文件->保存测试计划为
保存完成后
参数:键值对
参数和消息体数据只能二选一,设置了其中一个就无法设置另一个
消息体数据:可以是json或xml格式的参数
比如下面这种情况:
文件上传
作用:HTTP请求默认值,会在发送HTTP请求发送的时候,自带参数,当你不填写请求信息的时候生效,填写信息后会取代默认值。
设置了默认值,方便我们后期改动地址。
eg:
添加HTTP请求默认值
添加->配置元件->HTTP请求默认值
由于我们将服务器名称和端口号设置为了HTTP请求默认值
所以<登陆管理员>和<查看指定id的床位信息>请求的服务器名称和端口号都不必填写
运行
eg:
给<登录管理员-POST>请求添加断言
添加>断言>响应断言
匹配模式
- 包括:响应内容包括需要匹配的内容即代表响应成功,支持正则表达式。
- 匹配:响应内容要完全匹配需要匹配的内容即代表响应成功,支持正则表达式。
- 相等:响应内容要完全等于匹配的内容才代表成功,区分大小写,需要匹配的内容是正则表达式。
- 字符串:返回结果包括指定结果的字符串,区分大小写,不支持正则表达式。
- 否:反转检查结果,用于表示不包含,不匹配,不等于,没有和模式字符串相匹配的字符串,不支持正则字符串。
- 或者:一个断言可以添加多个“要测试的模式”,使用or选项后,只要其中有一个模式匹配,断言将会成功;不选择or将默认为and选项,必须所有模式都匹配,断言才会成功。
填写响应断言,选择测试字段<响应文本>,模式匹配选择<包括>,运行
通过
选择测试字段<响应代码>,模式匹配选择<相等>,运行
通过
在请求过程中,我们需要在请求中设置一些变量来测试不同场景。
JMeter中支持以下类型变量:
- 用户自定义变量
- 函数生成变量
- BeanShell变量
- 数据文件变量
eg:
以<登陆管理员-POST>为例,添加用户自定义变量
添加>前置处理器>用户参数
添加两个变量,一个用户名,一个密码
用户参数的使用,${变量名}
与postman中不同的是,postman中变量使用{{变量名}}
运行,通过
在<用户参数>中,我们再添加一个用户
在线程组中,改写线程数,让其请求2次
运行,这实际是一种数据驱动的实现方式
eg:
JMeter有许多内置函数,比如生成随机数的函数__Random()
工具>函数助手对话框
选择Random函数,填写最小和最大值,点击生成,就自动帮我们生成了函数字符串
在<登陆管理员-POST>请求的消息体数据中,添加了一句
"userId":"${__Random(1,100,)}"
运行
还有很多别的内置函数,这里有时间在补充…
BeanShell官网
BeanShell
- BeanShell是一种完全符合Java语法规范的脚本语言,并且拥有自己的一些语法和方法;
- BeanShell是一种松散类型的脚本语言(这点与js类似);
- BeanShell是用Java写成的一个小型的,免费的,嵌入式的Java源代码解释器,具有对象脚本语言的特性,非常精简;
- BeanShell执行标准Java语言和表达式,另外包括一些脚本命令和语法。
JMeter中的BeanShell
- 定时器:BeanShell Timer
- 前置处理器:BeanShell PreProcessor
- 采样器:BeanShell Sampler
- 后置处理器:BeanShell PostProcessor
- 断言:BeanShell 断言
- 监听器:BeanShell Listener
BeanShell常用内置变量
JMeter在它的BeanShell中内置了变量,用户可以通过这些变量与JMeter进行交互,其中主要的变量及其使用方法如下:
vars-(JMeterVariables)操作:JMeter变量实际引用了JMeter线程中局部变量容器,本质上是Map,它是测试用例与BeanShell交互的桥梁,常用的方法:
// 定义jmeter变量 vars.put(String key, String value);
// 从jmeter中获取变量 vars.get(String key);
// log:写入信息到jmeter.log文件
log.info("Hello JMeter");
eg:
我们以<查看指定id的床位信息-GET>请求为例
添加>前置处理器>BeanShell预处理程序
这个前置处理器就相当于postman中的
Pre-request script
编写BeanShell 预处理程序
请求<查看指定id的床位信息-GET>的参数id的值改为${id}
运行,通过
日志打印完成
CSV数据文件变量:是指从外部的CSV文件中读取数据出来作为变量。
eg:
创建一个csv文件
以请求<登陆管理员-POST>为例
添加>配置文件>CSV数据处理文件
我们要将<用户参数>禁用,因为如果<用户参数>存在的情况下,它的优先级要高于CSV数据文件变量,所以要禁用
运行该线程组,通过
引出:在接口测试过程中,经常需要接口之间关联调用,比如获取上一个接口的返回值,作为另一个接口的请求参数,那么就需要使用JMeter的正则表达式提取器,通过对响应的数据来提取指定的数据。
正则表达式-语法
JMeter的<后置处理器>的<正则表达式提取器>配置表
| 配置项 | 描述 |
|---|---|
| 引用名称 | 请求要引用的变量名称,如填写num,则可用${num}引用它 |
| 正则表达式 | 匹配需要的内容 |
| 模板 | 用$num$引用起来,如果在正则表达式中有多个匹配数据,num表示匹配到的第几个值给变量。如:$2$表示匹配到第2个值存储在变量中 |
| 匹配数字 | 0代表随机取值,1代表全部取值 |
| 缺省值 | 如果参数没有取到值,那默认给一个值让它取 |
eg:
以请求<查看指定id的床位信息-GET>为例
使用BeanShell预处理程序随机生成床位的id(范围:1000~2000)
运行,通过
如果我们要提取该床位对应寝室的id去做下一步的处理(利用寝室id检索同寝室的所有床位信息),就要用到正则表达式(请求之后,用正则表达式提取数据)
添加>后置处理器>正则表达式提取器
使用正则表达式提取<查看指定id的床位信息-GET>请求的响应体中的寝室id
假设我们要提取"dormitory":{"id":426,"dor_name"这段字符串中的426,那么这个提取的部分就应该用圆括号引起来(),方便将提取到的数字放到引用变量中,即"dormitory":{"id":(),"dor_name",里面的数字我们使用正则表达式代替.*?,即最后填入的正则表达式是"dormitory":{"id":(.*?),"dor_name"
注:
特殊字符.(点,句号)在正则表达式中用来表示除了"新行"之外的所有字符;
特殊字符*代表着 0 个或多个前面的内容;
特殊字符?代表着 0个或1个前面的内容 或 前面的内容是可选的。
再添加一个HTTP请求<查找对应id寝室的所有床位信息>,它的参数值的获取,就是从正则表达式提取器中的引用变量dor_id获取的。
运行,通过
适用于很多不同类型的测试用例在一个用例表中一起执行的情况。
eg:
新建一个CSV文件,用来存放测试用例信息。
新建一个线程组,添加HTTP请求默认值
添加循环控制器,CSV文件中的测试用例一共有6条,我们就设置执行6次
添加>逻辑控制器>循环控制器
加载CSV文件
添加<如果(If)控制器>,添加<如果(If)控制器>的目的是为了区分请求类型,是GET请求,还是POST请求。
添加>逻辑控制器>如果(If)控制器
判断是否是GET请求,下面这种是第一种方式
我们可以使用第二种方式,如下,使用这种方式性能更好
使用内置函数Groovy生成我们需要的语句
添加HTTP请求
添加响应断言
添加结果树,运行,通过
添加<如果(If)控制器>,判断是否是POST请求
添加HTTP请求
添加响应断言
添加HTTP信息头,添加结果树,运行,通过
如果HTTP请求的响应结果包含cookie,那么使用Jmetercookie管理器会自动将该cookie保存起来,而且以后会对该网站的请求都使用同一个cookie,每个JMeter线程都有自己独立的“cookie保存区域”。
eg:
使用这个网址来操作cookie
httpbin.org-A simple HTTP Request & Response Service.
添加线程组,添加HTTP请求默认值
添加
添加HTTP请求<设定cookie,重定向到cookie列表-GET>
添加结果树,启动线程,通过
再添加一个HTTP请求<返回cookie数据-GET>
添加结果树,启动线程,通过
如果把cookie管理器禁用掉,就没有不能管理cookie了,cookie数据不会被保存
比如,这里我们把cookie管理器禁用掉,启动线程组,通过
我们还可以在cookie管理器中,自己设定cookie值
cookie管理器,运行线程组,通过,我们发现在cookie管理器中设定的数据,一并被添加到了cookie数据中
很多时候,出于安全考虑,我们的接口并不希望对外公开,这个时候就需要使用授权(Authorization)机制授权过程验证你是否具有服务器所需数据的权限。当你在发送请求的时候,通常会包含参数,以确保请求具有访问和返回所需数据的权限。jmeter提供了授权类型,可以轻松地在jmeter本地应用程序中处理身份验证协议。
2.11 测试报告-聚合报告 2.12 如何将JMeter做成自动化测试平台 2.13 优化自动化模板 2.14 JMeter连接MySQL数据库


