JMeter学习1

 
 

一、简介

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、参放到BodyData-------json格式的post请求

post只要把入参放到BodyData里面就可以了,在Body Data中输入{}和一个个键值对,另外要加http头管理器,在里面加上Content-type:Application/json

响应结果:

由于json字符串在Body Data中传递,故请求的数据都在Post Data中,而post只有路径

 

 

2、参放到URL---post请求的键值对

放到URL里用&连接符,类似get请求。此情况不需要Content-type,其默认为application/x-www-form-urlencoded

 

响应结果:

参数是在POST中而非POST DATA

 

头部信息类型

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 

上传文件用这种格式

 比如有一个上传接口:除了2个参数以外+文件

在http请求编辑页面,选中Use multipart/form-data for POST

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)

这个监听器可不是用来监听系统资源的元件。它是用来对测试结果数据进行处理和可视化展示的一系列元件。 图形结果、查看结果树、聚合报告、用表格察看结果都是我们经常用到的元件。

 

12、帮助

http://jmeter.apache.org/usermanual/component_reference.html

最好的帮助是:菜单-“帮助”-“帮助”。

 

 

 

二、元件的作用域与执行顺序

在jmeter中元件的作用域是靠测试计划的的树型结构中元件的父子关系来确定的,作用域的原则是:

  •  取样器(sampler)不和其它元件相互作用,不存在作用域的问题。逻辑控制器 只对其子节点中的取样器 和 逻辑控制器作用。
  •  除取样器 和 逻辑控制器外,其他6类元件,若其父节点是sampler,则该元件只对其sampler下的子节点起作用。若其父节点不是sampler ,则其对父节点下的其他所有后代节点(子节点,子子节点等)。

通过例子来理解一下他们的作用域。 (注:下图只是为了说明作用域,无法正常运行)

根据作用域原则,这些元件的作用域分别为:
* 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 得到的返回结果为空)。
(8) 前置处理器、后置处理器和断言等元件对 取样器作用,如果在它们的作用域内没有任何取样器,则不会被执行。
(9) 如果在同一作用域范围内有多个同一类型的元件,则这些元件按照它们在测试计划中的上下顺序一次执行。

 

 

 

 

三、检查点

JMeter也有像LR中的检查点,JMeter里面的检查点通过添加断言来完成。

检查点:我们对用户名和密码进行了参数化,那么怎样来判断jmeter有没有正确调用t.dat里面的文件呢。当然,我们可以从结果图表中查看。但我还是想在“登录”这个地方进行一下检查。

1添加响应断言,右键点击我们的“登录”页面---->添加---->断言---->响应断言

2. 设置响应断言

断言中可以添加多个断言一起判断,断言中也可以使用参数化方法,进行动态判断。

3、添加断言结果

右键点击我们的“登录”页面---->添加---->监听器---->断言结果
再右键点击我们的“登录”页面---->添加---->监听器---->查看结果树

4、查看断言结果

在线程组中设置3个用户,点击运行运行。成功如下图:

 

注意:Sampler设置有多个断言,都会经过Assertions的判断,只要有一个不符合条件的都会标示为False

 

 

 

 

四、集合点

JMeter也有像LR中的集合点,JMeter里面的集合点通过添加定时器来完成。注意:集合点的位置一定要在Sample之前.

集合点:简单来理解一下,虽然我们的“性能测试”理解为“多用户并发测试”,但真正的并发是不存在的,为了更真实的实现并发这感念,我们可以在需要压力的地方设置集合点,例如每到输入用户名和密码登录的地方,所有的虚拟用户都相互之间等一等,然后一起访问。

1.接着之前创建的脚本,右键点击 线程组---->定时器---->Synchronizing Timer(同步定时器)

这样子就添加了一个“集合点”,下面来设置一下集合点,设置延迟时间(以毫秒为单位)

2.我们添加完之后的列表是这个样子的,至此,集合点已添加完成。

 

 

 

五、用jmeter对mysql数据库查询

a.下载MySQL驱动
1、下载MySQL驱动。下载地址:https://dev.mysql.com/downloads/connector/j/
2、打开网页后选择操作系统,此处选择platform independent(独立于平台)然后选择第二个下载

p6

3.当点击下载上的时候MySQL官网会提醒你注册MySQL账号,不过不用注册一样下载,点击No thanks,just start my download
4.将下载的驱动解压(mysql-connector-java-8.0.20.jar),将其放到xxx\apache-jmeter-5.1.1\lib目录下。放完驱动以后,要记得重启jmeter

a.连接数据库。

数据库                   驱动                                                                       数据库url
mysql                 com.mysql.jdbc.Driver                                              jdbc:mysql://host:port/{dbname}?allowMultiQueries=true
oracle                org.postgresql.Dri                                                     jdbc:postgresql:{dbname}
PostgreSQL      oracle.jdbc.driver.OracleDriver                                 jdbc:oracle:thin:user/pass@//host:port/service
MSSQL             com.microsoft.sqlserver.jdbc.SQLServerDriver         jdbc:sqlserver://IP:1433;databaseName=DBname
MSSQL             net.sourceforge.jtds.jdbc.Driver                                 jdbc:jtds:sqlserver://localhost:1433/"+"library"

1)首先新建一个测试计划

选择测试计划,点击“Browse...”,将驱动路径添加到测试计划下边,如下图所示:

2)添加一个用户组,再在用户组下添加一个配置原件"JDBC Connection Configuration", 以mysql 数据库为例,根据上表中对mysql的要求设置下图的值。

1、出现时区报错(关键字”server time zone value?")是因为数据库本身没有设置时间区的原因造成功的。解决办法只需要在数据库连接设置指定一个时区。
jdbc:mysql://127.0.0.1:3306/sys?serverTimezone=UTC 2、JDBC Driver class可以手动输入也可以通过下拉框选择,手动输入切忌有空格,否则会报错。建议下拉选择。

3)添加一个取样器"JDBC Request"。

Variable Name:这里填写添加JDBC Connection Configuration时填写的变量名,以便建立关联。
Query Type:根据需要进行设置,若有insert 和select, 则选择"Callable Statement", 若是单个的select 或者insert,可以选取对应的Select Statement 和Update Statement。

通过察看结果数看到"JDBC Request" 请求成功,响应数据里返回insert 和select 的结果。

 

b.将数据库查询结果作为参数化数据

1、使用Variable names

如下图,如果给Variable names参数设置了值,它会保存sql语句返回的数据和返回数据的总行数。

如下图,Variable names设置A,B,C。Http请求参数username设置B2B2,代表取sql语句返回结果第二列的第二行结果。A_2代表取第一列的第二行结果

图片描述

图片描述

 

 

六、jmeter对mysql数据库写入数据

   测试一个服务器的性能,客户要求向数据库内 1000/s(每秒插入一千条数据)的处理能力,通过jmeter很简单就可以完成

 前提条件:一个数据库:test   数据库下面有一张表:user   表中有两个字段:username、passworld 。

 

1.创建一个测试计划,将我们所使用的数据库驱动包导入。

 

2.添加一个线程组,并设置我们的虚拟用户数、启动时间、和循环次数

 

 

3.创建一个线程,并在线程下面,创建一个JDBC Connection Configuration ,设置相关信息。

 

4.创建一个JDBC Request.我们需要对数据库做插入操作。(详细设置,看截图上的说明)

 

5.添加监听器,我们这里选择添加“图形结果”和“查看结果树”,点击菜单栏上的“启动”--->运行。

查看我们的运行结果。

在测试的过程中,通过数据库命令,可以查看当前数据库插入了多少数据

 

 

 

 

 

 

 

 

posted @ 2016-10-31 18:00  liangww  阅读(776)  评论(0编辑  收藏  举报