Jmeter系统入门教程(安装、组件使用、Demo展示、连接数据库、压测报告)

Jmeter学习总结文档

Author xiuhong.chen

Date 2018/3/23

Desc Jmeter入门,及脚本编写、与数据库交互、生成压测报告分析性能

一、Jmeter简介

jmeter 是一款专门用于功能测试和压力测试的轻量级测试开发平台。多数情况下是用作压力测试,功能上来说,整个平台实现了许多和互联网相关的网络测试组件,同时还保留着很强的扩展性方便用于一些非标准的测试场景。

JMeter是100%纯JAVA桌面应用程序,被设计为用于测试客户端/服务端结构的软件(例如web应用程序)。它可以用来测试静态和动态资源的性能,例如:静态文件,Java Servlet,CGI Scripts,Java Object,数据库和FTP服务器等等。JMeter可用于模拟大量负载来测试一台服务器,网络或者对象的健壮性或者分析不同负载下的整体性能。

jmeter像LoadRunner一样,它也提供了一个利用本地Proxy Server(代理服务器)来录制生成测试脚本的功能。同时我们也可以使用Badboy录制生成 JMeter脚本。

下边我们就从Jmeter的下载安装、脚本录制、主要测试组件介绍、基本功能使用这几方面简单介绍:

二、Jmeter的下载安装(Windows)

1)下载地址: http://jmeter.apache.org/download_jmeter.cgi

2)将下载的Jmeter文件解压,打开/bin/jmeter.bat

修改 /bin/jmeter.properties 文件的属性: sampleresult.default.encoding=UTF-8 (防止乱码)

在这里插入图片描述

3)配置环境变量(前提是电脑上已经安装有JDK 具体步骤不做介绍)

4)其他平台安装Jmeter,与Windows平台一致,除入口文件不同,例如linux平台下为/bin/jmeter.sh

  1. 安装之后的目录结构如下:
  • /bin 目录(常用文件介绍)

    • examples:目录下包含Jmeter使用实例
    • ApacheJMeter.jar:JMeter源码包
    • jmeter.bat:windows下启动文件
    • jmeter.shLinux下启动文件
    • jmeter.log:Jmeter运行日志文件
    • jmeter.properties:Jmeter配置文件
    • jmeter-server.bat:windows下启动负载生成器服务文件
    • jmeter-server:Linux下启动负载生成器文件
  • /docs目录——Jmeter帮助文档

  • /extras目录——提供了对Ant的支持文件,可也用于持续集成

  • /lib目录——存放Jmeter依赖的jar包,同时安装插件也放于此目录(jmeter引入的jar包都是放在该目录下)

  • /licenses目录——软件许可文件,不用管

  • /printable_docs目录——Jmeter用户手册

三、BadBoy录制脚本

Badboy是一款不错的Web自动化测试工具,如果你将它用于非商业用途,或者用于商业用途但是安装Badboy的机器数量不超过5台,你是不需要为它支付任何费用的。也许是一种推广策略,Badboy提供了将Web测试脚本直接导出生成JMeter脚本的功能,并且这个功能非常好用,也非常简单。

Badboy 下载地址http://www.badboy.com.au/

image.png

录制过程如下:

  1. 启动badboy

  2. 在地址栏中输入你需要录制的Web应用的URL—这里我们以http://blog.csdn.net/a1786223749为例

  3. 开始录制后,你可以直接在Badboy内嵌的浏览器(主界面的右侧)中对被测应用进行操作,所有的操作都会被记录在主界面左侧的编辑窗口中。不过你将看到,录制下来的脚本并不是一行行的代码,而是一个个Web对象——这就有点像LoadRunner的VuGen中的Tree View视图

  4. 录制完成后,点击工具栏中的“停止录制”按钮,完成脚本的录制

  5. 选择“File-> Export to JMeter”菜单,填写文件名“login_mantis.jmx”,将录制好脚本导出为JMeter脚本格式。也可以选择“File -> Save”菜单保存为Badboy脚本;

  6. 启动JMeter并打开刚刚生成的测试脚本

四、使用代理录制Jmeter脚本

参考如下链接:

https://www.cnblogs.com/Lam7/p/5461604.html (IE浏览器)

https://www.cnblogs.com/tester808/p/6619129.html (Chrome浏览器)

五、JMeter 的主要测试组件
  • 测试计划: 是使用 JMeter 进行测试的起点,它是其它 JMeter 测试元件的容器。
  • 线程组: 代表一定数量的并发用户,它可以用来模拟并发用户发送请求。实际的请求内容在Sampler中定义,被线程组包含。
  • 监听器: 负责收集测试结果,同时也被告知了结果显示的方式。
  • 逻辑控制器: 可以自定义JMeter发送请求的行为逻辑,它与Sampler结合使用可以模拟复杂的请求序列。
  • 断言: 可以用来判断请求响应的结果是否如用户所期望的。它可以用来隔离问题域,即在确保功能正确的前提下执行压力测试。这个限制对于有效的测试是非常有用的。
  • 配置元件: 维护Sampler需要的配置信息,并根据实际的需要会修改请求的内容。
  • 前置处理器和后置处理器: 负责在生成请求之前和之后完成工作。前置处理器常常用来修改请求的设置,后置处理器则常常用来处理响应的数据。
  • 定时器: 负责定义请求之间的延迟间隔。

具体每个控件的作用参考:https://www.cnblogs.com/ceshisanren/p/5639895.html(博客非常详细,强烈推荐)

六、Jmeter的逻辑控制器

1)简单控制器(Simple Controller): 分组功能,不具备逻辑控制

2)循环控制器(Loop Controller):指定其子节点运行的次数,可以使用具体的数值(如下图,设置为5次),也可以使用变量

  • Forever选项:勾选上这一项表示一直循环下去
  • 如果同时设置了线程组的循环次数和循环控制器的循环次数,那循环控制器的子节点运行的次数为两个数值相乘的结果。

3)仅一次控制器(Once Only Controller):作用:在测试计划执行期间,该控制器下的子结点对每个线程只执行一次,登录场景经常会使用到这个控制器。

注意:将Once Only Controller作为Loop Controller的子节点,只执行一次;

若线程组循环次数为5,循环控制器循环次数为3,Once Only Controller作为Loop Controller的子节点,此时执行5次。

4)ForEach控制器(ForEach Controller):ForEach控制器一般和用户自定义变量一起使用,其在用户自定义变量中读取一系列相关的变量。该控制器下的采样器或控制器都会被执行一次或多次,每次读取不同的变量值

参数:

  • Input Variable Prefix:输入变量前缀
  • Output variable name:输出变量名称
  • Start index for loop(exclusive):循环开始的索引(这里如果不填写,默认从1开始,如果没有1开始的变量,执行时会报错)
  • End index for loop(inclusive):循环结束的索引
  • Add"__“before number:输入变量名称中是否使用”_"进行间隔。

5)事务控制器(Transaction Controller):会产生一个额外的采样器,用来统计该控制器子结点的所有时间

6)If 控制器(If Controller):根据给定表达式的值决定是否执行该节点下的子节点,默认使用javascript的语法进行判断 如:“aaa”==“aaa”

参数:

  • Interpret Condition as Variable Expression?:选中这一项时表示:判断变量值是否等于字符串true(不区分大小写)
  • Evaluate for all children:如果选中这一项,在每个子结点执行前都会计算表达式

7)Switch控制器(Switch Controller):Switch控制器通过给该控制器中的Value赋值,来指定运行哪个采样器。有两种赋值方式:

  • 第一种是数值,Switch控制器下的子节点从0开始计数,通过指定子节点所在的数值来确定执行哪个元素。
  • 第二种是直接指定子元素的名称,比如采样器的Name来进行匹配。当指定的名称不存在时,不执行任何元素。

当Value为空时,默认执行第1个子节点元素。

8)吞吐量控制器(Throughput Controller):制其下的子节点的执行次数与负载比例分配,也有两种方式:

  • Total Executions:设置运行次数
  • Percent Executions:设置运行比例(1~100之间)
七、JMeter 聚合报告Aggregate Report

AggregateReport 是 JMeter常用的一个 Listener,中文被翻译为“聚合报告”。如果大家都是做Web应用的性能测试,例如只有一个登录的请求,那么在Aggregate Report中,会显示一行数据,共有10个字段,含义分别如下。

  • Label:每个 JMeter 的 element(例如 HTTP Request)都有一个 Name 属性,这里显示的就是 Name属性的值

  • Samples:表示你这次测试中一共发出了多少个请求,如果模拟10个用户,每个用户迭代10次,那么这里显示100

  • Average:平均响应时间——默认情况下是单个Request 的平均响应时间,当使用了 Transaction Controller 时,也可以以Transaction 为单位显示平均响应时间

  • Median:中位数,也就是 50% 用户的响应时间

  • 90% Line:90% 用户的响应时间

  • Min:最小响应时间

  • Max:最大响应时间

  • Error%:本次测试中出现错误的请求的数量/请求的总数

  • Throughput:吞吐量——默认情况下表示每秒完成的请求数(Requestper Second),当使用了 Transaction Controller 时,也可以表示类似 LoadRunner 的 Transaction perSecond 数

  • KB/Sec:每秒从服务器端接收到的数据量,相当于LoadRunner中的Throughput/Sec

八、Demo – 以查询天气为例

下边以查询天气为例,写一个小demo:

1) 添加虚拟用户组

如下图所示,右击“测试计划”>添加>Threads(Users)>线程组。这里需要解释一下“线程组”的意思:JMeter是由Java实现的,并且使用一个Java线程来模拟一个用户,因此线程组(Thread Group)就是指一组用户的意思,换句话说一个线程组就是一组虚拟用户(virtual users),这些虚拟用户用来模拟访问被测系统。

在这里插入图片描述

在这里插入图片描述

接下来介绍下“线程组”中常用到的一些设置。

  • 线程数:这里就是指虚拟用户数,默认的输入是“1”,则表明模拟一个虚拟用户访问被测系统,如果想模拟100个用户,则此处输入100。
  • Ramp-Up Period (in seconds): 虚拟用户增长时长。例如:比如你测试的是一个考勤系统,那么实际用户登录使用考勤系统的时候并不是大家喊1、2、3 - 走起,然后一起登录。实际使用场景可能是9点钟上班,那么从8:30开始,考勤系统会陆陆续续有人开始登录,直到9:10左右,那么如果完全按照用户的使用场景,设计该测试的时候此处应输入40(分钟)* 60(秒)= 2400。但是实际测试一般不会设置如此长的Ramp-Up时间,原因嘛,难道你做一次测试要先等上40分钟做登录操作?一般情况下,可以估计出登录频率最高的时间长度,比如此处可能从8:55到9:00登录的人最多,那这里设置成300秒,如果“线程数”输入为100,则意味着在5分钟内100用户登录完毕。
  • 循环次数:该处设置一个虚拟用户做多少次的测试。默认为1,意味着一个虚拟用户做完一遍事情之后,该虚拟用户停止运行。如果选中“永远”,则意味着测试运行起来之后就根本停不下来了,除非你把它强制停止。
2)添加被测页面取样器

接下来的一步就是要加入实际被测页面,右击“线程组” > “添加” > “Sampler” > “HTTP请求”。

在这里插入图片描述

接下来需要设置一下“HTTP请求” Sampler的属性,如下所示:

  • 名称:输入“GetCityCode”,就是被测试网页的描述性文字
  • 服务器名称或IP:被测服务器的网站名字,也可以是IP地址。剩下的属性可以按照被测系统的属性按需配置

img

点击保存按钮,然后点击测试按钮

在这里插入图片描述

测试跑完了其实是看不到反应的, 可以去“选项” > “Log Viewer”看看运行的日志。如果你还是看不到日志,你可以点击下面所示的三角箭头展开或者收起日志视图。日志视图中可以看到“线程组 1-1”的启动和结束时间,表明测试已经跑完。

在这里插入图片描述

如果测试发现出现问题了, 我们可以通过监听器来观察结果

3)添加结果监听器

如下图所示,右击“线程组” > “监听器” > “察看结果树”来查看性能测试过程中请求和响应信息。添加完毕后,保存测试脚本,再次运行。
点击运行按钮,测试完毕之后,点击“察看结果树” > “GetCityCode”

在这里插入图片描述

到这里。 我们已经成功运行起来了。

4)响应断言

就是判断Reponse是否正确, 断言要放在请求内

右键HTTP请求–>添加–>断言–>响应断言, 在测试的模式框内输入希望返回的结果
响应断言有不同的模式匹配规则, 如包括 匹配 Substring 否 或者
在这里插入图片描述

5)添加断言结果

右键线程组–>添加–>监听器–>断言结果, 可以查看是否满足期望的结果
在这里插入图片描述

6)添加用户自定义变量

我们还可以在Jmeter中定义变量。“添加–配置元件–用户定义的变量” 比如我定义一个变量叫 city=武汉. 使用它的时候用 ${city}
然后在Http Request中使用这个变量
在这里插入图片描述

运行结果如下: 返回结果和断言中的期望结果上海不一致,所以failed
在这里插入图片描述

7)添加关联–正则表达式提取器

所谓关联, 就是第二个Requst, 使用第一个Request中的数据

我们需要在第一个Http Requst 中新建一个正则表达式,把Response的值提取到变量中,提供给别的Http Request 使用

选择第一个Http Request, 右键 Add -> 后置处理器 -> 正则表达式提取器

  • 正则表达式: (\d{9}?) 是匹配城市编码, 这个参数将在getWeather中使用到
    • 模板中: 1 1 1代表匹配第一个值
  • 匹配数字: 0代表随机 1代表唯一一个

在这里插入图片描述

选择第二个Http Request , 在路径中使用第一个request中提取出来的数据, 也可以作为发送参数使用

在这里插入图片描述

查看结果如下, 由于正则表达式是随机匹配的城市编码,此处查询出来的是洛阳的天气,结果如下:

在这里插入图片描述

8)添加 JSON提取器

Json提取器是用于在一组数据对象中提取任意一个作为下一个请求的参数传入。

右键–>添加–>后置处理器–>JSON Extractor

  • Variable names:变量名,可以在后续请求中使用
  • JSON Path expressions: json表达式。如:$.rows[*]是获取一个dto对象$.rows[*].headerId可以获取任意对象的Id
  • Match No: 0表示随机,1表述取第一个
  • Default Values:表示请求结果为空,json提取出的结果也为空时,设置的默认值

image.png

9)BeanShell Preprocessor 前置处理器

请求执行之前处理数据,然后再传递给所在的request。主要用于处理解析json数据,拼接字符串等。

  • 将fastjson.jar 拷贝到 jmeter lib 文件夹下后重启 jmeter
  • 在Sampler上面添加后置处理器–>BeanShell PostProcessor

纯java语言处理数据。后置处理器类似。

image.png

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

//获取变量  company是其他请求查询出的结果或者自定义变量
String json = vars.get("company");
JSONObject jso = JSON.parseObject(json);
vars.put("companyName",jso.getString("description"));
vars.put("companyCode",jso.getString("segmentValue"));

String json2 = vars.get("soa");
JSONObject jso2 = JSON.parseObject(json2);
vars.put("soaCode",jso2.getString("segmentValue"));
vars.put("soaName",jso2.getString("description"));

image.png

九、Jmeter发送请求的三种传参类型 content-type
1)application/x-www-form-urlencoded

默认的。如果不指定content-type,默认使用此格式。

参数格式:key1=value1&key2=value2

2) application/json

参数为json格式

{

“key1”:“value1”,

“key2”:“value2”

}

3)multipart/form-data

上传文件时使用的参数类型

image.png

4)设置参数

添加信息头管理器,设置即可。

image.png

十、Jmeter之上传excel文件

需要设置的参数如下:

  • 文件名称:设置为文件路径,注意“/”和“\”的区别
  • 参数名称:即后台接收文件的参数名称
  • MIMIE类型:即文件的打开方式类型,根据上传文件扩展名不同,MIME类型不同。可以参考:http://www.w3school.com.cn/media/media_mimeref.asp

image.png

image.png

十一、JMeter 分布式性能测试
1) JMeter分布式执行原理
  • 调度机(Controller):主要负责性能测试脚本的分发,及各个执行机(Agent )的测试结果收集汇总,报告产出。
  • 执行机(Agent ):主要负责执行性能测试脚本及断言等(命令行模式执行,无界面),并将执行结果反馈给调度机(Controller),若断言执行成功则不返回请求响应数据及详细断言信息。
2) Jmeter分布式测试配置

作为一个纯JAVA 的GUI应用,JMeter 对于CPU和内存的消耗还是很惊人的,所以当需要模拟数以千计的并发用户时,使用单台机器模拟所有的并发用户就有些力不从心,甚至还会引起JAVA内存溢出的错误。不过,JMeter 也可以像 LoadRunner 一样通过使用多台机器运行所谓的 Agent 来分担 Load Generator 自身的压力,并借此来获取更大的并发用户数。需要做一下配置:

  • 在所有期望运行 JMeter作为 Load Generator 的机器上安装 JMeter,并确定其中一台机器作为 Controller,其他的机器作为 Agent。然后运行所有 Agent 机器上的JMeter-server.bat文件——假定我们使用两台机器 192.168.0.1 和 192.168.0.2 作为Agent;

  • 配置Agent服务器远程启动端口

    修改Agent配置文件:JMETER_HOME/bin/jmeter.properties 中如下信息即可完成配置执行机远程启动端口(默认为 1099)

    server_port=1664

    server.rmi.localport=1664

  • 在Controller 机器的 JMeter安装目录下找到 bin 目录,再找到 JMeter.properties这个文件,使用记事本或者其他文字编辑工具打开它;

  • 在打开的文件中查找“remote_hosts=”这个字符串,你可以找到这样一行“remote_hosts=127.0.0.1”。其中的127.0…0.1 表示运行 JMeterAgent 的机器,这里需要修改为“remote_hosts=192.168.0.1:1664,192.168.0.2:1664”——其中的1664 为 JMeter 的Controller 和 Agent 之间进行通讯的默认 RMI 端口号;

  • 保存文件,并重新启动 Controller 机器上的 JMeter.bat,并进入Run -> Remote Start 菜单项。

具体操作也可以参考这个文章: https://www.cnblogs.com/puresoul/p/4844539.html

十二、Jmeter连接Oracle数据库

首先将classes12.jar或者ojdbc14.jar放在 jmeter/lib 目录下, 重启jmeter; 然后打开jmeter,点击测试计划, 引入jar包

image.png

  1. 新建一个 Thread Group线程组;

  2. 右键线程组–>添加配置原件–>新增 JDBC Connection Configuration;

  3. 点击新增的 JDBC Connection Configuration ,需要修改的参数包括:

  • Variable Name:可以先填一个 Oracle;

  • Validation Query:默认是Select 1,如果是Oracle,需改为Select 1 from dual,否则报错 Cannot create PoolableConnectionFactory (ORA-00923: 未找到要求的 FROM 关键字)

  • Database URL:jdbc:oracle:thin:@IP:1521:实例名 如:jdbc:oracle:thin:@127.0.0.1:1521:XE

  • JDBC Driver class:oracle.jdbc.driver.OracleDriver

  • Username:访问上面Oracle实例的用户名

  • Password:对应的密码

    image.png

  1. 右键线程组–> 新增Sampler—>新增一个 JDBC Request

  2. 点击新增的 JDBC Request,需要修改的参数包括:

  • Variable Name:和上面的 JDBC Connection Configuration填写同样的内容。这里表示 JDBC Connection Configuration建立一个名为Oracle 的连接池,之后其它的JDBC Request都共用这个连接池;

  • Query:select * from table_name 。 这里建议打开你的数据查询工具,输入一条SQL查询语句,保证可以执行看到结果的,然后copy 过来;注意:填写的sql语句未尾不要加“;”

  • Parameter valus:参数值

  • Parameter types:参数类型

  • Variable names:保存sql语句返回结果的变量名

  • Result variable name:创建一个对象变量,保存所有返回的结果

  • Query timeout:查询超时时间

  • Handle result set:定义如何处理由callable statements语句返回的结果

  1. 新增一个View Results Tree(查看结果树);

  2. 点击 Run,查看结果。可以在响应数据中看到到响应的返回结果。

image.png

注意事项:

  1. 执行时提示:No Suitable Driver。

    在电脑上搜索一下 classes12.jar 这个文件,然后copy到JMeter的Lib目录下。如果找不到classes12.jar这个文件,就找找classes12.zip文件,然后把扩展名改为jar;

  2. 执行时提示:ORA-00911: invalid character。

    确保你在JDBC Request里面的Query中输入的SQL语句是正确的。

十三、Jmeter连接mysql数据库

此处不作介绍, 可以参考官方链接,比较详细: http://jmeter.apache.org/usermanual/build-db-test-plan.html

十四、生成压测报告

在压力测试结束时报告

  • 基本命令格式:
jmeter -n -t <test JMX file> -l <test log file> -e -o <Path to output folder>
  • 样例:
jmeter -n -t F:\PerformanceTest\TestCase\script\getToken.jmx -l testLogFile -e -o ./output

jmeter -n -t G:\结算压测脚本\账单模板定义.jmx -l testLogFile -e -o G:\output

b. 使用已有的压力测试CSV日志文件生成报告

  • 基本命令格式:
jmeter -g <log file> -o <Path to output folder>
  • 样例:
jmeter -g D:\apache-jmeter-3.0\bin\testLogFile -o ./output

image.png

image.png

image.png

十五、问题: 运行结果乱码

image.png

修改 /bin/jmeter.properties 文件的属性: sampleresult.default.encoding=UTF-8
修改之后重启jmeter, 运行结果如下:
image.png

image.png

  • 8
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值