一、工具简单介绍
二、元件的作用域与执行顺序
三、检查点
四、集合点
五、用jmeter对mysql数据库查询
六、jmeter对mysql数据库写入数据
七、jmeter使用IP欺骗进行压力测试
-----------------------
Jmeter的组织方式相对比较扁平,直接是TestPlan(相当于Project),TestPlan下创建的ThreadsGroup(相当于TestCase),
Jmeter一个TestPlan也是一个jmx(xml)文件,无法分割,
jmeter测试计划是一系列配置器、线程组、控制器、取样器、断言、监听器、定时器、组成的集合。
jmeter运行时会首先运行配置器,然后启动线程组,全部线程组中取样器的执行结果会在配置的监听器中出现。
虽然从界面上可以在测试计划节点上添加监听器、断言,但是绝大多数情况下,不需要在根节点配置这两类器件。
线程组
线程组是一组器件是一系列配置器、控制器、定时器、simpler、断言、监听器的集合。线程组的线程数量、执行次数、启动时间都是可以配置的,线程启动会顺序执行下属的配置器、控制器、定时器、simpler、断言、监听器,实现一系列保护测试逻辑的操作。
采样器(simpler)
可以理解为对被测试目标的一次请求或调用。jmeter原生提供了和多常用的采样器,http、bsf、jsr223、jdbc等,一般情况下,进行web后端测试使用http、bsf、jsr223这三个类型的采样器加上对应的控制器已可以满足需要了。jmeter中配置器主要用于管理采样器的参数或变量。
控制器(logic contoller)
控制器,这一类器件用于控制线程组内部的采样器的执行逻辑,以http采样器为例,可以通过loop控制器定义某个或某几个采样器的执行次数,可以通过if控制器定义某个采样器执行后接下来执行那个采样器。逻辑控制器的作用和各种语言中的逻辑控制语句非常相似,所以使用过任何计算机语言的应该都和容易理解。控制器用于在线程组内通过采样器实现各种测试逻辑,可以定义采样器执行的条件可以让采样器循环执行等。
定时器(timer)
定时器,定时器一般只在线程组中使用,作用实际上是让线程等待一段时间,jmeter提供了多种定时器。
断言
断言是一种条件判断器件,断言为真时,jmeter认为采样器的执行结果为成功,反之亦然,断言一般情况添加在采样器上,采样器执行完毕jmeter会调用采样器上的断言,根据断言中的配置或代码判断执行结果是成功还是失败,
监听器
监听器用于收集jmeter的运行结果并展示给用户,jmeter提供的大部分监听器为统计报告。能够提供采样器执行结果展示的只有view result tree。最常用的监听器是aggregate和view result tree
JMeter主要由三个部分组成,它们分别是:
– 取样器
进行脚本逻辑控制。用来控制业务流程,模拟用户进行操作
– 线程组
场景设置。比如模拟多少用户来访问、访问多少次
– 监听器
监控脚本运行,取得性能指标
JMeter 运行
1. 进入bin目录运行jmeter.bat启动jmeter
注意:打开的时候会有两个窗口,JMeter的命令窗口和JMeter的图形操作界面,不可以关闭命令窗口。
2. JMeter的classpath:
如果你想添加其他JAR文件到JMeter的classpath中,你必须复制他们到lib目录中;
如果你开发了一个JMeter特定组件或有效的jar文件,复制到lib目录下的ext目录中。
3. 打开之后显示的是中文,如果你想使用其他语言,比如英文,那么通过菜单选项->选择语言->英文即可,当然转为中文也是同样操作。
JMeter 测试计划元件
打开Jmeter页面:包括测试计划+工作台。
1、Test Plan (测试计划):用来描述一个性能测试,包含与本次性能测试所有相关的功能。也就说本的性能测试的所有内容是于基于一个计划的。
右键单击“测试计划”弹出菜单:
“函数测试模式”复选框,如果被选择,它会使Jmeter记录来自服务器返回的每个取样的数据。如果你在测试监听器中选择一个文件,这个数据将被写入文件。如果你尝试一个较小的测试来保证Jmeter配置正确并且你的服务器正在返回期望的结果,这是很有用的。这样做的后果就是这个文件会快速的增大,并且Jmeter的效率会影响。
如果不记录数据到文件,这个选项就没有不同了。
A接口的返回结果做B接口的参数,比喻token,userId 等,如果是B接口先执行,再执行的A接口就会出现问题,这时我们需要让他们按照顺序执行,先A后B。
那么,勾选第一个(独立运行每个线程组):
2、Threads (Users)
虽然有三个添加线程组的选项,名字不一样, 创建之后,其界面是完全一样的。
1) setup thread group
一种特殊类型的ThreadGroup的,可用于执行预测试操作。这些线程的行为完全像一个正常的线程组元件。不同的是,这些类型的线程执行测试前进行定期线程组的执行。setUp Thread Group类似于lr的init.可用于执行预测试操作。
2) teardown thread group.
一种特殊类型的ThreadGroup的,可用于执行测试后动作。这些线程的行为完全像一个正常的线程组元件。不同的是,这些类型的线程执行测试结束后执行定期的线程组。tearDown Thread Group类似于lr的end.可用于执行测试后动作。
3) thread group(线程组).
这个就是我们通常添加运行的线程。通俗的讲一个线程组,,可以看做一个虚拟用户组,线程组中的每个线程都可以理解为一个虚拟用户。线程组中包含的线程数量在测试执行过程中是不会发生改变的。
线程组:
名称:起个有意义的名字就行
线程数:这里选择5
Ramp-Up Period:单位是秒,默认是1秒。指定了启动所有线程所花费的时间,如果你需要Jmeter立即启动所有线程,将此设定为0即可
循环次数:表示每个线程执行多少次请求。
调度器(勾选后会起作用)
持续时间:表示脚本持续运行的时间,以秒为单位,比如如果你要让用户持续不断登录1个小时,你可以在文本框中填写3600。
启动延迟:表示脚本延迟启动的时间
如果我们需要用到调度器来设定持续时间,如果线程数不够多到持续时间结束,我们可以将循环次数勾选为永远
3、测试片段(Test Fragment)
测试片段元素是控制器上的一个种特殊的线程组,它在测试树上与线程组处于一个层级。它与线程组有所不同,因为它不被执行,除非它是一个模块控制器或者是被控制器所引用时才会被执行。
4、取样器(Sampler)
取样器(Sampler)是性能测试中向服务器发送请求,记录响应信息,记录响应时间的最小单元,JMeter 原生支持多种不同的sampler , 如 HTTP Request Sampler 、 FTP Request Sampler 、TCP Request Sampler 、 JDBC Request Sampler 等,每一种不同类型的 sampler 可以根据设置的参数向服务器发出不同类型的请求。
在Jmeter的所有Sampler中,Java Request Sampler与BeanShell Requst Sampler是两种特殊的可定制的Sampler.
get请求参数设置
1、get请求一般通过parameters来传递键值对参数(推荐)
2、参数放入路径中(有可能参数要转码)
post请求参数设置
1、json格式的post请求
json格式;
名称/值对包括字段名称(在双引号中),后面写一个冒号,然后是值:
JSON 实例
{
"sites": [
{ "name":"菜鸟教程" , "url":"www.runoob.com" },
{ "name":"google" , "url":"www.google.com" },
{ "name":"微博" , "url":"www.weibo.com" }
]
}
这个 sites 对象是包含 3 个站点记录(对象)的数组。
post只要把入参放到BodyData里面就可以了,入参为json时,在Body Data中输入{}和一个个键值对,另外要加http头管理器,在里面加上Content-type:Application/json
响应结果:由于json字符串在Body Data中传递,故请求的数据都在Post Data中,而post只有路径
针对jason的参数进行参数化
A. 选择函数助手,配置参数
B. 将登陆名称与登陆密码进行参数化,复制函数字符串并粘贴到对应位置即可
C. 设置完毕后重新进行发送jason请求,可以在查看结果树中看到请求的内容,其中登陆名称和登陆密码进行了参数化
2、post请求的键值对
放到URL里用&连接符,类似情况1的get请求。也可以在参数中添加,二者等同。此情况不需要Content-type,其默认为application/x-www-form-urlencoded
响应结果:参数是在POST中而非POST DATA
5、头部信息类型
1)content-type:application/x-www-form-urlencoded
默认的。如果不指定content-type,默认使用此格式。 参数格式:key1=value1&key2=value2
参数可以在Parameters(适用于get请求) 或 Body Data(适用于post请求)里输入,格式不同,如下图所示。
Parameters:
2)content-type:application/json
3)content-type:multipart/form-data
上传文件用这种格式
在http请求编辑页面,选中Use multipart/form-data for POST
比如上传pan卡接口:除了2个参数以外+文件
Parameters中输入除了上传的文件以外的参数:参数名和参数值
Files Upload中上传文件:文件名(文件放置位置),参数名:files,MIME类型
5、逻辑控制器(Logic Controller)
逻辑控制器,包括两类无件,一类是用于控制test plan 中 sampler 节点发送请求的逻辑顺序的控制器,常用的有 如果(If)控制器 、 switch Controller 、Runtime Controller、循环控制器等。另一类是用来组织可控制 sampler 来节点的, 如 事务控制器、吞吐量控制器。
6、配置元件(Config Element)
配置元件(config element)用于提供对静态数据配置的支持。CSV Data Set config 可以将本地数据文件形成数据池 (Data Pool),而对应于HTTP Request Sampler和 TCP Request Sampler等类型的配制无件则可以修改 Sampler的默认数据。
例如,HTTP Cookie Manager 可以用于对 HTTP Request Sampler 的 cookie 进行管理。
HTTP 请求默认值不会触发Jmeter发送http请求,而只是定义HTTP请求的默认属性。
7、定时器(Timer)
定时器(Timer)用于操作之间设置等待时间,等待时间是性能测试中常用的控制客户端QPS的手段。类似于LoadRunner里面的“思考时间”。 jmeter提供了9种类型的定时器,可以根据实际场景设置思考时间,用于等待或是集合点同时并发操作等等。
定时器的作用域
1)定时器是在每个sampler(采样器)之前执行的,而不是之后(无论定时器位置在sampler之前还是下面);
2)当执行一个sampler之前时,所有当前作用域内的定时器都会被执行;
3)如果希望定时器仅应用于其中一个sampler,则把定时器作为子节点加入;
4)如果希望在sampler执行完之后再等待,则可以使用Test Action
8、前置处理器(Per Processors)
前置处理器用于在实际的请求发出之前对即将发出的请求进行特殊处理。例如,HTTP URL重写修复符则可以实现URL重写,当RUL中有sessionID 一类的session信息时,可以通过该处理器填充发出请求的实际的sessionID 。
9、后置处理器(Post Processors)
后置处理器是用于对Sampler 发出请求后得到的服务器响应进行处理。一般用来提取响应中的特定数据(类似LoadRunner测试工具中的关联概念)。例如,XPath Extractor 则可以用于提取响应数据中通过给定XPath 值获得的数据;正则表达式提取器,则可以提取响应数据中通过正则表达式获得的数据。
10、断言(Assertions)
断言用于检查测试中得到的相应数据等是否符合预期,断言一般用来设置检查点,用以保证性能测试过程中的数据交互是否与预期一致。
11、监听器(Listener)
这个监听器可不是用来监听系统资源的元件。它是用来对测试结果数据进行处理和可视化展示的一系列元件。 图形结果、查看结果树、聚合报告、用表格察看结果都是我们经常用到的元件。
五、帮助
http://jmeter.apache.org/usermanual/component_reference.html
最好的帮助是:菜单-“帮助”-“帮助”。
在jmeter中,元件的作用域是靠测试计划的的树型结构中元件的父子关系来确定的,作用域的原则是:
- 取样器(sampler)元件不和其它元件相互作用,因此不存在作用域的问题。
- 逻辑控制器(Logic Controller)元件只对其子节点中的取样器 和 逻辑控制器作用。
- 除取样器 和逻辑控制器 元件外,其他6类元件,如果是某个sampler的子节点,则该元件只对其父节点下的子节点起作用。
- 除取样器和逻辑控制器元件外的其他6类元件,如果其父节点不是sampler ,则其作用域是该元件父节点下的其他所有后代节点(包括子节点,子节点的子节点等)。
Jmeter 中的逻辑控制器(Config Elements)在其作用范围内的行为与其他元件相比稍有不同。逻辑控制器元件分两大类:默认配置(HTTP默认请求、FTP默认请求等)和 管理(HTTP 头管理、HTTP cookie 管理等)。
其中默认配置(Configuration Defaults)元件中设置的值可以在作用域内叠加,例如,在一个测试计划中添加两个HTTP 默认请求,其中第一个默认设置 Server name or IP 为www.google.com ,第二个默认设置Path 为/page-not-exist , 则在这两个元件作用域内的所有HTTP 请求默认的Server name or IP 和Path 均为Server name or IP 和 /page-not-exist 。
管理(Manager)类逻辑控制器元件的效果则不能进行叠加。如果两个或两个以上相同的管理类元件作用域有重叠。则在重叠作用域内的取样器元件只会随即受到其中一个的作用,这样会导致取样器行为的不确定性。因此,在使用管理类逻辑控制器时,一定要注意保证相同的管理类元件的作用域不发生重叠。
通过两个例子来理解一下他们的作用域。
A(注:下图只是为了说明作用域,无法正常运行)
取样器(HTTP请求1 、FTP请求2 、TCP取样器3) 逻辑控制器(循环控制器) 监听器(图形结果1、聚合报告2)
* HTTP请求1 、FTP请求2 、TCP取样器3 元件没有作用域的概念。
* 循环控制器 元件作用域名是其子节点FTP请求2 、TCP取样器3 。
* 图形结果1 元件的作用域是是FTP请求2 、TCP取样器3。
* 聚合报告2 元作的作用域是HTTP请求1 、FTP请求2 、TCP取样器3
B (注:下图只是为了说明作用域,无法正常运行)
这个例子稍微复杂一些,包含的元件较多。先来分分类。
取样器(HTTP请求 、FTP请求 、TCP取样器、 JDBC Request )逻辑控制器(循环控制器、随即控制器)定时器(固定定时器、Uniform Random Timer )断言(响应断言、XML断言)监听器(图形结果、聚合报告)
根据作用域原则,这些元件的作用域分别为:
* HTTP请求 、FTP请求 、TCP取样器、 JDBC Request 元件没有作用域名概念
* 循环控制器 的作用域为 FTP请求 、TCP取样器和 随即控制器
* 固定定时器作用于 HTTP请求 , Uniform Random Timer 作用于所有取样器
* 响应断言作用于JDBC Request , XML断言作用于FTP请求 、TCP取样和JDBC Request 。
* 图形结果作用于FTP请求 、TCP取样和JDBC Request ,聚合报告作用于作用于所有取样器。
元件的执行顺序
了解了元件有作用域之后,来看看测试计划的元件的执行顺序,元件执行顺序的规则很简单,在同一作用域名范围内,测试计划中的元件按照如下顺序执行。
(1)配置元件(config elements )
(2)前置处理程序(Per-processors)
(3)定时器(timers )
(4)取样器(Sampler)
(5)后置处理程序(Post-processors) (除非Sampler 得到的返回结果为空)。
(6)断言(Assertions)(除非Sampler 得到的返回结果为空)。
(7)监听器(Listeners)(除非Sampler 得到的返回结果为空)。
关于执行顺序,有两点需要注意:
* 前置处理器、后置处理器和断言等元件公能对 取样器作用,因此,如果在它们的作用域内没有任何取样器,则不会被执行。
* 如果在同一作用域范围内有多个同一类型的元件,则这些元件按照它们在测试计划中的上下顺序一次执行。
JMeter也有像LR中的检查点,JMeter里面的检查点通过添加断言来完成。
检查点:我们对用户名和密码进行了参数化,那么怎样来判断jmeter有没有正确调用t.dat里面的文件呢。当然,我们可以从结果图表中查看。但我还是想在“登录”这个地方进行一下检查。
1、添加响应断言,右键点击我们的“登录”页面---->添加---->断言---->响应断言
2. 设置响应断言
断言中可以添加多个断言一起判断,断言中也可以使用参数化方法,进行动态判断。
3、添加断言结果,右键点击我们的“登录”页面---->添加---->监听器---->断言结果
再添加一个“查看结果树” 右键点击我们的“登录”页面---->添加---->监听器---->查看结果树
在线程组中设置3个用户,点击运行运行。
4、查看断言结果
1)、成功如下图:
2)、若断言失败,如下图:
注意:一般成功只会显示一行数据,否则会多显示一行。
5、再查看结果树
至此,检查点设置完成。
另外,断言还有其它类型:
Duration to Assert:允许的响应时间的最大值,即断言的持续时间。
Size to Assert :对于返回结果文件大小的标准定义
注意:Sampler设置有多个断言,都会经过Assertions的判断,只要有一个不符合条件的都会标示为False
JMeter也有像LR中的集合点,JMeter里面的集合点通过添加定时器来完成。注意:集合点的位置一定要在Sample之前.
集合点:简单来理解一下,虽然我们的“性能测试”理解为“多用户并发测试”,但真正的并发是不存在的,为了更真实的实现并发这感念,我们可以在需要压力的地方设置集合点,拿那个用户和密码的地方,每到输入用户名和密码登录的地方,所有的虚拟用户都相互之间等一等,然后,一起访问。
1.接着之前创建的脚本,右键点击 线程组---->定时器---->Synchronizing Timer
这样子就添加了一个“集合点”,下面来设置一下集合点,设置延迟时间(以毫秒为单位)
2.我们添加完之后的列表是这个样子的,
发现了没,我们集合点的位置不对,应该在登录的前面才对。怎么弄呢?
简单方法:按住Alt,直接移动Synchronizing Timer至登录的前面即可。
至此,集合点已添加完成。
我的环境:
MySQL:mysql-essential-5.1.51-win32
jdbc驱动:自行下载
JMeter:jmeter-2.4 以上版本都行。
1.首先我们要有一个可以做测试的数据库,当然,里面要有数据。
2.打开JMeter,点击测试计划,
点击“浏览...”按钮,将你的JDBC驱动添加进来。
3.添加一个线程组,
右键点击“线程组”,在下面添加一个“JDBC Connection Configuration”
来配置一下JDBC Connection Configuration页面。
4.右键点击“线程组”,在下面添加一个“JDBC request”
5.添加断言。
右键点击线程组---->添加--->断言---->响应断言。
6.我们来添加一些监听器来行查看
添加一个断言结果:
右键点击线程组---->添加--->监听器---->结果断言。
添加一个图形结果:
右键点击线程组---->添加--->监听器---->图形结果。
添加一个查看结果树:
右键点击线程组---->添加--->监听器---->查看结果树。
下面是添加所有东东的列表:
7.在线程组页面设置用户数、启动时间、循环次数
点击菜单栏“运行”----“启动”
下面是结果:
测试一个服务器的性能,客户要求向数据库内 1000/s(每秒插入一千条数据)的处理能力,通过jmeter很简单就可以完成
前提条件:一个数据库:test 数据库下面有一张表:user 表中有两个字段:username、passworld 。
1.创建一个测试计划,将我们所使用的数据库驱动包导入。
2.添加一个线程组,并设置我们的虚拟用户数、启动时间、和循环次数
3.创建一个线程,并在线程下面,创建一个JDBC Connection Configuration ,设置相关信息。
4.创建一个JDBC Request.我们需要对数据库做插入操作。(详细设置,看截图上的说明)
5.添加监听器,我们这里选择添加“图形结果”和“查看结果树”,点击菜单栏上的“启动”--->运行。
查看我们的运行结果。
在测试的过程中,通过数据库命令,可以查看当前数据库插入了多少数据