说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家!
一、相关术语
1.JMeter 是做什么的
jmeter可用于测试软件的性能,同时也可以用于测试软件接口。
2.线程组
线程数:虚拟用户数
3.Sampler 取样器
- 用来模拟用户操作,向服务器(被测系统)发出请求。
- http 请求
✔ 发送 http 请求 - 跟随重定向
✔ 会沿用之前的 sessionid。 - Debug Sampler
✔ 用于显示正则表达式、参数等的结果。 - Beanshell Sampler
✔ 于输出参数值。
4.断言
- 用来验证结果是否正确,相当于检查点。
✔ 常用响应断言。
5.前置处理器
✔ 请求发送前可能会做一些环境或者参数的准备工作,比如在对数据库进行操作前需要先建立一个数据库连接。
6.后置处理器
- 一般放在取样器之后,用来处理服务器的返回结果。
- 正则表达式处理器
✔ 用于解决关联问题;
✔ 要放在请求以下。
7.配置元件
- CSV Data Set Config(CSV 数据集配置)
✔ 用于参数化。 - http cookie 管理器
✔ 录制之前添加,用于解决 sessionid 存储于 cookie 中的情况。 - 用户自定义变量
8.逻辑控制器
- 事务控制器
✔ 用于添加事务。 - 循环控制器
✔ 用于设置迭代次数。
9.定时器
- Synchronizing Timer(同步计时器)
✔ 用于设置集合点。 - 固定定时器、Uniform Random Timer
✔ 可用于设置思考时间,需要每一次思考时都加此定时器,不常用。 - 高斯随机定时器
✔ 产生服从正态分布的随机时间间隔,一般用于模拟思考时间,需要每一次思考时都加此定时器,不常用。
10.监听器
- 用于对测试进行监控,查看运行结果,常用察看结果树。
二、搭建 Jmeter 环境
- 控制机上安装 JDK 并配置环境变量(不能仅使用 JRE,负载机可以)
- 复制 jmeter 文件夹到计算机
- 安装 badboy
✔ 与 jmeter 无关。
✔ 用于录制脚本。
✔ 常用于导出脚本到 jmeter。
1.安装JDK
- 首先博主准备windows 7纯净版操作系统中进行演示,加载Jmeter环境所需镜像
- 安装JDK
- 安装完成
2.配置Java环境
说明: 博主这里进行两种配置(可自我定位使用哪一种)
2.1 第一种配置(系统变量)
- 在系统变量上新建 JAVA_HOME 变量,路径值选择你的JDK安装目录
- 点击系统变量寻找 Path变量,编辑%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;(注意原来Path的变量值末尾有没有; 如果没有则先输入; 再输入上面的代码)
- 新建CLASSPATH系统变量,变量值填写为.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar(注意最前面有一点)
- 完成后,在cmd输入以下命令如果出现如下显示,则表示java环境配置成功
2.2 第二种配置(用户变量)
- 首先删除上一步在系统变量中配置的Path和CLASSPATH值,选择新建用户变量Path,将JDK安装路径下的bin目录路径设置为变量值C:\Program Files (x86)\Java\jdk1.8.0_121\bin;
- 新建ClassPath用户变量,变量值为JDK目录下的lib目录下的tools.jar值即C:\Program Files (x86)\Java\jdk1.8.0_121\lib\tools.jar;
- 检验配置也是没有问题的
- 还有一种测试,则是直接创建一个java文件,编写打印hello代码,然后进行编译再打印
3.拷贝Jmeter安装Badboy
- 将镜像文件中的Jmeter程序拷贝到C盘中
- 安装Badboy
- 最后将Badboy和Jmeter发送快捷方式到桌面,方便以后使用
4.安装被测软件webtours
- 首先安装ActivePerl,也就是perl脚本解释器
- 安装完成
- 将webtours网站拷贝到C盘目录下,并发送服务器快捷方式到桌面
- 测试webtours网站正常访问
- 博主注册一个用户,并查看用户数据
三、录制脚本
1.badboy 录制脚本
1.1 脚本录制
- 输入 url 地址后,单击绿色箭头
✔ 红色原点表示“开始录制”,默认已选中;
✔ 黑色四方块:停止录制,需要手工停止。
- 输入完网站地址后,点击绿色箭头或回车,则进入网站,那么就可以操作起来,因为默认就在录制,但是该录制只会录制与数据交互的,博主这里先录制一个注册
- 录制完成,点击停止录制
1.2 badboy回放脚本
-
回放脚本
✔ 右击 step1→Play All,或使用工具栏按钮。 -
首先先删除录制时,注册的cdtaogang1用户,然后进行回放
-
用户cdtaogang1注册成功
1.3 脚本导出
- 将脚本导出为.jmx 格式
✔ File→Export to Jmeter
- 说明一点,在badboy上点击保存,则是保存为badboy的脚本
1.4 Jmeter导入jmx脚本
- jmeter 导入 jmx 脚本
✔ 打开 jmeter
★ \apache-jmeter-3.0\bin\jmeter.bat
✔ 文件→打开
- 展开线程组,就能看到我们在badboy中录制的脚本数据了
1.5 Jmeter回放脚本
- jmeter 回放脚本
✔ 右击 ThreadGroup 下的 Step1→添加→监听器→察看结果树
✔ 单击“察看结果树”,单击工具栏中的绿色播放图标则是执行脚本(代码)
✔ 查看图形方式的回放结果
★ 单击“察看结果树”→选择下拉列表中的“HTML”→选中某个 url“→点击“响应数据”
- 如果想要查看HTML页面,则进行选择即可
- 删除cdtaogang1用户数据,然后清空察看结果树,不然再次跑脚本则会接着在当前脚本下写入脚本的
- 清除过后,再次运行
- 显示成功
2.jmeter 代理录制脚本
2.1 脚本录制
- 为计算机设置 IP
- 在浏览器中设置代理服务器
✔ 打开浏览器→工具→Internet 选项→连接→局域网设置→勾选"为 LAN 设置代理服务器",地址输入 Jmeter 的 IP,端口 8888(jmeter 默认)
- 添加线程组到测试计划
✔ 添加"配置元件"→http cookie 管理器,否则影响关联效果
- 在工作台下添加"非测试元件"→HTTP 代理服务器
✔ 目标控制器:测试计划→线程组
✔ 分组:不对样本分组
- 启动,操作软件后开始录制
✔ 需要使用真实 IP,不能使用 localhost
- 点击启动后,直接打开ie浏览器,输入http://192.168.88.207:1080/webtours进行注册
- 录制完成后,停止
2.2 脚本回放
- 首先添加察看结果数
- 删除录制脚本时注册成功的cdtaogang1用户数据,点击回放
- 脚本执行成功
3.自己编写脚本
- 添加HTTP请求
- 配置参数
- 添加监听器,运行后,察看结果能正常访问说明配置无误
- 接下来还需要继续添加HTTP请求,因为webtours页面由如下三个框架组成,分别为三个不同的地址
- 右击查看网页源码,可以查看到组成页面的url地址
- 在添加HTTP请求之前,先将之前的HTTP请求命名为主页index
- 然后添加header页面、nav页面以及home页面
- 清空再运行察看结果树,查看添加的页面,是否能够正常访问
四、增强 Jmeter 脚本
1.添加断言
-
【例 1】检查注册是否成功
✔ 先根据“结果树”中的“HTML”中的“响应数据”,找到需要检查的网页中的文本
✔ 复制上述内容,根据“结果树”中的“Text”中的“响应数据”,确定最终确定要检查的文本(可能含有标记)
✔ 在线程组下找到需要检查的 url,右击“添加”→断言→响应断言
★ 要测试的响应字段:响应文本
★ 模式匹配规则:包括
★ 要测试的模式:添加
■ 预期结果如“Thank you, <b>zhsan1”
★ 注意
■ 找不到会报错,找到无反应 -
首先打开之前保存到桌面的badboy转换的jmeter注册脚本
-
展开Step1,将以下的HTTP请求名称前面加上数字标识,方便查看(在Jmeter中记得随时随地的进行保存)
-
添加监听察看结果树,删除cdtaogang1用户数据,运行查看结果注册用户成功
-
因要对打开网站、点击注册链接、提交注册数据添加断言,所以这里博主对名称进行命名
-
删除cdtaogang1用户数据,清除结果,重新跑一遍
-
添加检查点这里跟在前面的loadrunner中不一样,需要切换到text筛选条件,根据返回的响应数据中使用Ctrl+C进行复制,如果是html筛选条件查看的响应数据显示为页面,如果是出现html语言如<b>则不会显示在页面中
-
右击打开网站,添加响应断言
-
断言配置如下
-
右击打开注册链接,添加响应断言
-
右击提交注册数据,添加响应断言
-
接下来删除cdtaogang1用户,清空结果,运行后全部通过,即表示断言成功
-
再运行一遍,则会在提交注册数据显示断言失败
2.事务
- 首先将Step1 下的数据全选鼠标拖动到线程组下,然后删除Step1
- 右击线程组→添加→逻辑控制器→事务控制器,添加以下三个事务
- 拖动事务位置,将 url 拖动到合适的事务中
- 拖动完成如下
- 运行后,事务全部通过
3.参数化
- 配置元件→CSV Data Set Config
✔ Filename:参数文件名
★ 可用相对或绝对路径,相对路径须在…\jmeter 安装位置\bin 中;
★ 当前目录下使用./;参数文件中不能使用列名。
✔ File encoding:文件编码格式
★ 常用且建议 UTF-8
✔ Variable Names(comma-delimited)
★ 以英文逗号间隔的列名,与数据的间隔符可以不一致
✔ Delimiter(use ‘\t’ for tab)
★ 指定数据间隔符,Tab 用’\t’(不加引号),默认逗号
✔ Allow quota data
★ 表示数据中是否有分隔符
✔ Recycle on eof
★ 参数不够用时,是否从头开始重新循环 - 【例 1】注册 200 个账号,客户名使用用户名。
✔ 手动编辑参数文件,写入参数,但不要写列名
✔ 找到需要参数化的输入数据的 url
★ 在前面的位置,右击“添加”→配置元件→CSV Data Set Config
★ 将参数的“值”改为“${参数名}”
■ 使用参数时不加引号
✔ 负载测试
★ 单击“Thread Group”,设置“线程数”为并发人数
■ 一个线程对应一个模拟用户
★ Ramp-Up Period(in second)
■ 线程启动开始运行的时间间隔,单位是秒,即所有线程在多长时间内开始运行。
■ 如设置线程数为 200,数据为 75 秒,相当于 15s 加载 40 个用户。
- 删除cdtaogang1用户数据,清空结果树
- 运行完成
- 200个用户注册成功
4.关联
- 后置处理器→正则表达式提取器
✔ 引用名称
★ 根据指定规则找到的字符串存放到此名表示的参数中。
✔ 正则表达式
★ 一个用( )表示一个模式;left(?)right:?表示遇到行中的第一个 right 就作为右边界,然后不断向后寻找。
✔ 模板
★ $1$指第一个模板(模式),$2$第二个…,此项必填;
★ 允许$1$ $2$ 的写法。
✔ 匹配数字
★ 找到的第某项,1 为第 1 项,-1 为所有项,0 是随机
■ 参数名_matchNr(区分大小写)中存着找到几项,必写-1
■ 参数名_gi 表示找到的第 i 项,i 从 1 开始,g0 表示包含左右边界在内的整个字符串
● g 是关键字
■ 有多个模板时,参数名_i_gj 表示找到的第 i 行第 j 列数据 - 正则表达式案例
✔ 网页内容
- 将test.html文件拷贝到xitami服务器目录下,使其在webtours网站地址下可以进行访问
- 将之前的项目保存后关闭,新建线程组配置HTTP请求
- 运行后,确保能正常访问test.html页面
- 然后添加正则表达式提取器
✔ 正则表达式:<tr><td>hello</td><td>(.*)</td><td>(.*)</td>
- 【例 1】模板:$1$,匹配数字:1
- 添加Debug Sampler获取匹配出的打印结果
- 运行结果数,查看Debug Sampler显示出匹配的cdtaogang
- 【例 2】模板:$1$,匹配数字:2
- 运行后匹配出zhnagsan没有问题
- 【例 3】模板:$2$,匹配数字:1
- 运行查看结果
- 【例 4】模板:$2$,匹配数字:2
- 【例 5】模板:$1$ $2$,匹配数字:-1
- 说明一点,因为在上一步中模板$1$和$2$之间博主用的,隔开,所以在下面匹配结果中显示的为cdtaogang,123以及zhangsan,6789
- 【例 6】?的用法
✔ 正则表达式:<td>(.*)</td>与<td>(.*?)</td>
✔ 查看正则表达式的结果 - 首先使用<td>(.*)</td>正则
- 运行结果发现,并没有到第一个</td>就结束,而是找到最后没有了才结束
- 修改正则为<td>(.*?)</td>,运行结果这才是想要匹配出的数据,加了?则表示遇到</td>则取,而不是只取到最后一个</td>
- 在线程组中添加 BeanShell Sampler,移到正则表达式提取器之后,写入下面的代码之一
✔ ${参数名};或"字符串${参数名}";
★ 结果出现在请求中,最后一个数据时不时出现在响应中
★ 如果省略分号,则数据都不出现在响应中,此外还会报错,但是数据还会正常显示
✔ ResponseMessage=“字符串${参数名}”;
★ 结果出现在响应中,最后一个数据出现在响应中
✔ log.error(数据);
★ 向日志中写数据
★ 点击“警告”图标可以清除日志
✔ log.info(数据);
★ 向日志中写数据