Jmeter性能测试

第六章 JMeter 性能测试 一、 相关术语 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 badboy 录制脚本  输入 url 地址后,单击绿色箭头  红色原点表示“开始录制”,默认已选中;  黑色四方块:停止录制,需要手工停止。  回放脚本  右击 step1 → Play All ,或使用工具栏按钮。  将脚本导出为 .jmx 格式  File → Export to Jmeter  jmeter 导入 jmx 脚本  打开 jmeter  \apache-jmeter-3.0\bin\jmeter.bat  文件→打开  jmeter 回放脚本  右击 ThreadGroup 下的 Step1 →添加→监听器→察看结果树  单击“察看结果树”,单击工具栏中的 图标  查看图形方式的回放结果  单击“察看结果树”→选择下拉列表中的“ HTML” →选中某个 url“ →点击“响 应数据” 2 jmeter 代理录制脚本  为计算机设置 IP  在浏览器中设置代理服务器  打开浏览器→工具→ Internet 选项→连接→局域网设置→勾选 " 为 LAN 设置代理服 务器 " ,地址输入 Jmeter 的 IP ,端口 8888 ( jmeter 默认)  添加线程组到测试计划  添加 " 配置元件 " → http cookie 管理器,否则影响关联效果  在工作台下添加 " 非测试元件 " → HTTP 代理服务器  目标控制器:测试计划→线程组  分组:不对样本分组  启动,操作软件后开始录制  需要使用真实 IP ,不能使用 localhost  录制完成后,停止 3 自己编写脚本  需要对请求非常了解。 四、 增强 Jmeter 脚本 1 添加断言  【例 1 】检查注册是否成功  先根据“结果树”中的“ HTML” 中的“响应数据”,找到需要检查的网页中的文 本  复制上述内容,根据“结果树”中的“ Text” 中的“响应数据”,确定最终确定要 检查的文本(可能含有标记)  在线程组下找到需要检查的 url ,右击“添加”→断言→响应断言  要测试的响应字段:响应文本  模式匹配规则:包括  要测试的模式:添加  预期结果如“ Thank you, <b>zhsan1”  注意  找不到会报错,找到无反应 2 事务  右击 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 个用户。 4 关联  后置处理器→正则表达式提取器  引用名称  根据指定规则找到的字符串存放到此名表示的参数中。  正则表达式  一个用 ( ) 表示一个模式; left(?)right : ? 表示遇到行中的第一个 right 就作为右 边界,然后不断向后寻找。  模板  $1$ 指第一个模板 ( 模式 ) , $2$ 第二个 ... ,此项必填;  允许 $1$ $2$ 的写法。  匹配数字  找到的第某项, 1 为第 1 项, -1 为所有项, 0 是随机  参数名 _matchNr (区分大小写)中存着找到几项,必写 -1  参数名 _gi 表示找到的第 i 项, i 从 1 开始, g0 表示包含左右边界在内 的整个字符串  g 是关键字  有多个模板时,参数名 _i_gj 表示找到的第 i 行第 j 列数据  正则表达式案例  网页内容 <table> <tr><td>hello</td><td>zhsan</td><td>123</td> <tr><td>hello</td><td>lisi</td><td>5326</td> </table>  正则表达式: <tr><td>hello</td><td>(.*)</td><td>(.*)</td>  【例 1 】模板: $1$ ,匹配数字: 1 test=zhsan , test_g=2 , test_g0=<tr><td>hello</td><td>zhsan</td><td>123</td> test_g1=zhsan test_g2=123  【例 2 】模板: $1$ ,匹配数字: 2 test=lisi , test_g=2 , test_g0=<tr><td>hello</td><td>lisi</td><td>5326</td> test_g1=lisi test_g2=5326  【例 3 】模板: $2$ ,匹配数字: 1 test=123 , test_g=2 , test_g0=<tr><td>hello</td><td>zhsan</td><td>123</td> test_g1=zhsan test_g2=123  【例 4 】模板: $2$ ,匹配数字: 2 test=5326 , test_g=2 , test_g0=<tr><td>hello</td><td>lisi</td><td>5326</td> test_g1=lisi test_g2=5326  【例 5 】模板: $1$ $2$ ,匹配数字: -1 test_1=zhsan 123 test_1_g=2 , test_1_g0=<tr><td>hello</td><td>zhsan</td><td>123</td> test_1_g1=zhsan (第 1 行第 1 列) test_1_g2=123 test_2=lisi 5326 test_2_g=2 , test_2_g0=<tr><td>hello</td><td>lisi</td><td>5326</td> test_2_g1=lisi test_2_g2=5326 test_matchNr=2  【例 6 】 ? 的用法  正则表达式: <td>(.*)</td> 与 <td>(.*?)</td>  查看正则表达式的结果  在线程组中添加 Debug Sampler ,移到正则表达式提取器之后  在线程组中添加 BeanShell Sampler ,移到正则表达式提取器之后,写入下面的 代码之一  ${ 参数名 }; 或 " 字符串 ${ 参数名 }";  结果出现在请求中,最后一个数据出现在响应中  如果省略分号,则数据都不出现在响应中,此外还会报错,但是数据 还会正常显示  ResponseMessage=" 字符串 ${ 参数名 }";  结果出现在响应中,最后一个数据出现在响应中  log.error( 数据 );  向日志中写数据  点击“警告”图标可以清除日志  log.info( 数据 );  向日志中写数据  【例 7 】录制订票的脚本,保证脚本正确实现业务。  找到查看结果树中出错的请求,在这个 url 的请求中查找会话值  在 step 下找到哪个 url 的发送数据中有会话值  在查看结果树的 Text/ 源代码界面中,倒着找那个 url 中的响应数据中有会话值  找到 sessionid 的左右边界  在响应的 url 处添加后置处理器→正则表达式提取器  在请求的 url 处,将 userSession 参数的值改为“ ${ 引用名称 }”  不输入引号 5 自定义函数  编写 Java 类  编写自己需要的 static 函数,并加入 main 方法,先编译与运行正确  删除 main 方法后保存,右击项目→导出→ Java →可运行的 JAR 文件  启动配置  选择测试的类名  导出目标  必须放在 \apache-jmeter-3.0\lib\ext 目录中,名字可与类名不同  忽略错误  找不到 mian 方法  【例 1 】编写一个输出字符串左边多个字符的函数。  Jmeter 导入包  测试计划→ Add directory or jar to classpath 处:浏览,找到包  BeanShell 引用函数  import 包名 . 类名  vars.put(" 新参数名 "," 常量值或参数名 ");  常量值或参数结果存入新参数中  无法在 BeanShell 的请求和响应中看到新参数值  BeanShell 后面的 url 以及请求中可以使用该参数  可以在日志中看到参数值  log.error( 包名 . 类名 . 函数名 ( 参数 ));  【例 2 】输出航班号。  import str.StrMethod; // 包名 . 类名  log.error(str.StrMethod.split("${banci}"," checked ")[0]);  vars.put("hb"," 常量值或参数名 ");  结果存入 hb 参数 6 循环控制器  右击 Step →添加→逻辑控制器→循环控制器  循环最好放在事务之外。  CSV Data 要放在循环之中。  添加计数器,查看循环次数  添加配置元件→计数器  计数器要放在循环内部  使用参数的方式  点击 Step1 中的参数化→ Sharing mode : Current Thread  不选择 Current Thread ,会导致有重复买票的情况  【例】参数化化始发地和目的地,实现每人买 3 张票。  为方便看那个用户订的票,参数化 lastname ,使用用户名即可  需要关联班次,注意班次使用了多次 7 用户自定义变量  根据业务流程制作成测试脚本,想要移植到其他测试环境时,由于数据发生了相应的变 化,例如 IP 地址、请求路径等,这时候可以将 IP 地址、请求路径等做成用户自定义变 量。  Thread Group →配置元件→用户自定义变量  【例】将脚本中的 localhost 改为服务器 IP 。  HTTP 请求中的名称不需要改 五、 场景设计 1 集合点  通过定时器完成。  Synchronizing Timer (同步定时器)  用来保证我们的取样器在同一时刻向服务器发起负载。  Number of Simulated Users to Group by  设置同步的线程数量。  Timeout in milliseconds  超时时间,单位为毫秒。  【例】参数化登录,为登录设置集合点,运行负载测试(取消每人订 3 张票)。 2 IP 欺骗  在 jmeter 所在计算机中添加多个 IP  netsh interface ip add address " 本地连接 " 172.16.0.2 255.255.0.0  创建参数化文件,存储多个 ip 地址  IP 地址必须跟上面添加的计算机 IP 完全一致。  配置元件  指定参数化信息  放在所有请求的最前面  HTTP 请求  Basic  Implementation →选择 Java 以外的内容,否则可能看不到 IP  Advanced  SourceAddress → IP/HOSTNAME  ${ip 参数名 }  查看 " 请求 "  X-LocalAddress 后面的即为 IP  cmd → netsta -au | find " 你自己的 ip 网段号 " 3 多机联合负载  【例 1 】使用多机联合负载运行 200 用户的负载测试。  两台计算机:控制机(这里充当负载机)、负载机,配置同网段 IP 且连通,双向 关闭防火墙  每台计算机机各设置 100 个 IP  每台计算机准备一份 ip 参数文件  各含 100 个 ip ,不重复,不冲突  文件名必须相同  每台计算机准备一份 users.txt 账号密码文件  名字必须相同  修改脚本和参数文件的目录为 jmeter\bin  负载机搭建 jmeter 环境(至少安装 Jre )  在 JMeter 控制机运行远程负载机  控制机  打开 jmeter.properties 文件,搜索“ remote_hosts” ,加上远程 JMeter 负载 机的“ IP : 1099” ,重启 jmeter 生效,本机直接写 ip 或 127 均可  控制机要执行测试的话,需要打开 jmeter-server.bat  负载机  打开 jmeter-server.bat ;  每个负载机均衡负担设置的线程数  重新启动 jmeter  控制机上线程数设置为:总并发数 / 负载数。  运行测试  点击黄色三角形图标,可以显示日志,旁边数字表示出错数。  绿色圆圈处的 100/100 中,后一个 100 表示总的线程数(虚拟用户数),前一个 100 表示当前的在线用户数。 六、 场景监控与结果分析 1 添加监听器  图形结果、用表格察看结果、聚合报告 2 监控硬件资源  解压 ServerAgent-2.2.1.zip 到被监控计算机中  Windows 服务器运行 startAgent.bat 文件  Linux 服务器运行 startAgent.sh 文件  将 JMeterPlugins-Standard.jar 包复制到 jmeter 安装目录下的 \lib\ext 下  重启 jmeter  选择监听器 jp@gc-PerfMon Metrics Collector  单击 Add Row ,添加服务器的 ip ,选择要监控的 CPU 、内存、硬盘、网络等资源 3 结果分析  察看结果树 - 取样器结果  Thread Name  线程组名称  Sample Start  启动开始时间  Load time  加载时长  Connect time  连接时长  Latency  等待时长  Size in bytes  发送的数据总大小  Headers size in bytes  发送数据的头部部分大小  Body size in bytes  发送数据的正文部分大小  Sample Count  发送统计  Error Count  错误统计  Response code  状态码  Response message  响应信息  Response headers  响应的头部信息  聚合报告  Label  线程组中的步骤名  #Samples  表示一共发出的请求数  Average  平均响应时间,默认情况下是单个 Request 的平均响应时间( ms )  Median  中间值,有一半的服务器响应时间低于该值而另一半高于该值。  90%line  90% 请求的响应时间。  Min  服务器响应的最短时间。  Max  服务器响应的最长时间。  Error%  测试出现的错误请求数量百分比。  确认是否允许错误的发生或者错误率允许在多大的范围内。  若出现错误就要看服务端的日志,配合开发查找定位原因。  Throughput  简称 tps ,吞吐量  默认情况下表示每秒处理的请求数,也就是指服务器处理能力, tps 越高说明 服务器处理能力越好。  吞吐量默认以 requests/second 来衡量,即每秒多少个请求。  Kb/sec  以 KB/seond 来衡量的吞吐量。  用表格查看结果  Sample#  每个请求的序号  Start Time  每个请求开始时间  Thread Name  每个线程的名称(代表一个虚拟用户)  Label  Http 请求名称  Sample Time  每个请求所花时间,单位毫秒  Status  请求状态,如果为勾则表示成功,如果为叉表示失败。  Bytes  请求的字节数  Latency  等待时长  Connect time  连接时长  样本数目  也就是请求个数,成功的情况下等于你设定的并发数目乘以循环次数  最新样本  表示服务器响应最后一个请求的时间  平均  每个线程请求的平均时间  偏离  服务器响应时间变化、离散程度测量值的大小 七、 非 GUI 运行测试 1 修正脚本和设置 1.1 修改请求名称  为方便将来的结果分析,建议修改请求名称 1.2 解决察看结果树中的汉字乱码问题  修改 jmeter-properties 文件  sampleresult.default.encoding=utf-8 1.3 日志中显示参数和断言信息  修改 jmeter-properties 文件  log_level.jmeter=DEBUG  日志中的部分文本含义  .ResponseAssertion  断言  FileServer: Read  读文件  注意  运行负载测试时不显示  在调试的时候可以调整日志级别来看输出,但是正常情况下要将日志的级别调 高( INFO ),减少日志输出,以提高 jmeter 本身性能 1.4 设置资源监控图的保存位置  察看结果树  无需设置保存文件  可以删除“察看结果树”  jp@gc - PerfMon Metrics Collector  设置保存文件  直接输入路径,不点“浏览” 2 GUI 运行脚本  进入 jmeter/bin 命目录后,输入如下命令  jmeter -n -t jmx 脚本文件名 -r -l 结果文件名 .jtl  -n :非 GUI 方式运行。 nongui  -t :指定运行的测试脚本地址与名称,可以使用相对路径。  -r :开启远程负载机  远程机器列表在 jmeter.properties 中指定 remote_hosts  若使用 -r ,则必须事先开启 jmeter-server.bat  若省略 -r ,表示不使用远程负载机  -l :记录测试结果到文件,指定文件地址与名称,可以是相对路径,也可以是 绝对路径。 3 导出测试结果 3.1 导出图形结果  jmeter -g 结果文件名 .jtl -o 图形结果存储目录  无需选监听器(硬件资源监控器需要保留)  不要导出硬件资源图 3.2 性能结果图  打开结果目录中的 index.html 即可查看, IE 浏览器如果看不了,可以换更高版本或 换浏览器。 3.3 解决导出结果中的汉字乱码问题  替换文件  apache-jmeter-3.0\lib\ext\ApacheJMeter_core.jar 3.4 硬件资源图  非 GUI 运行结束正常导出结果,不用导出 PerfMon Metrics Collector  运行结束后打开 PerfMon Metrics Collector 视图,“浏览”数据文件,再将图 存为图片 4 测试结果图  dashboard 仪表盘  Apdex(Application Performance Index)  应用程序性能满意度的标准  APDEX 是由 APDEX 公司推出的衡量企业应用程序性能满意度标准的计算方 式,将用户的满意度用数字衡量,范围在 0-1 之间。  0 表示所有用户均不满意  1 表示所有用户都满意  设定请求样本目标响应时间为 t ,则可容忍的响应时间上限设定为目标响 应时间 t 的 4 倍即 4t , Apdex 计算公式定义为: ( 满意的样本数量 + 可容忍 样本数量的一半 )/ 总样本数量  如:总样本数量为 1000 ,目标时间 t=3s ,假设有 750 个样本响应时 间小于等于 t , 150 个样本响应时间在 3s-12s 之间, 100 个样本响应 时间超过 12s ,则用户满意度为: (750+150/2)/1000=0.825  Satisfied (满意)  Toleration threshold (可容忍门槛 / 上限)  Frustrated threshold (烦躁上限)  Request Summary  样本请求的成功、失败百分占比图表。  Statistics  此部分结果展示的是每个样本事务的一些常见的性能测试指标,跟我们通常看 到的聚合报告的表格展示非常相近,多了成功与失败的占比。  Errors  执行结果的错误情况,根据不同的错误类型进行展示。  四列分别对应:发生错误的类型、错误数量、类型错误占比(相对于错误总数)、 类型错误样本占比(相对于所有的请求样本数量)。  Charts  Over Time  Response Times Over Time  随时间推移,样本请求响应时间的变化。  Bytes Throughput Over Time  随时间推移,网络数据传输(发送、接收,单位:字节)速率的变化。  Latencies Over Time  随时间推移,请求样本延迟响应的变化。  Throughput  Hits Per Second  每秒点击数。  Codes Per Second  随时间推移,每秒响应的状态码数量。  Transactions Per Second  每秒响应的事务数。  Response Time Vs Request  每秒请求总样本数量的响应时间分位数分布。  Latency Vs Request  随每秒样本请求数量变化,延迟请求的成功、失败响应时间。  Response Times  Response Time Percentiles  响应时间百分位数分布。  Active Threads Over Time  随时间变化,激活线程数变化。  Time Vs Thread  随活动线程数变化,平均响应时间变化曲线。  Response Time Distribution  响应时间分布。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐