0


JMeter详细使用手册

目录


1. Jmeter的工作原理

Jmeter可以作为web服务器与浏览器直接的代理网关,以便捕获浏览器的请求和web服务器的响应,如此就可以很容易地生成性能测试脚本。有了性能测试脚本,jmeter就可以通过线程来模拟真实用户对web服务器的访问压力。

186fc478b35740890c4777083d13d5f2.png

2. 环境安装部署

2.1 安装jdk

注意事项

JMeter 1.8 以上的版本需要JDK1.4以上的版本支持运行。JMeter可以运行在如下操作系统上: Unix,Windows和Open VMS;

JAVA的环境变量设置

a. 使用鼠标右击“我的电脑”->属性->高级->环境变量 
b. 系统变量->新建->变量名:JAVA_HOME 变量值:d:\jdk  
c. 系统变量->编辑->变量名:Path 在变量值的最前面加上:%JAVA_HOME%\bin;  
d. 系统变量->新建->变量名:CLASSPATH 变量值:
e:运行->cmd->java version;

a090b0e654cdba2a35bf61c6ed247ff8.png

Jdk下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

2.2 安装及运行jmeter

解压zip文件到你想安装JMeter的目录;运行解压后的bin目录下的 jmeter.bat;

如图所示:

ae7b4b729d2640496d74bca7fdb3a0bd.png

2.2.1jmeter 目录介绍

(1).bin目录:可执行的目录

1).jmeter.bat:windows的启动文件

2).jmeter.log:日志文件

3).jmeter.sh:linux的启动文件

4).jmeter.properties:系统配置文件

5).jmeter-server.bat :windows分布式测试要用到的服务器配置

6).jmeter-serve:linux分布式要用到的服务器配置

7).docs目录:接口文档目录

(2).extras目录:扩展插件目录

(3).lib目录:所用到的插件目录,里面都是jar包,会自动在JMETER_HOME/lib和ext目录下寻找需要的类

(4).liceses:jmeter证书目录

(5).ptinrable_docs 用户使用手册

Jmeter下载地址:Apache JMeter - Download Apache JMeter

3.建立一个基本的测试计划

62a25f69d1a7cbee1582b279e8ebc41e.png

4.Jmeter各元素的使用说明

4.1线程介绍

---Test plan(测试计划)

---------setup threads group(环境初始化)

---------thread group

---------thread group

---------tear down group(环境恢复)

Test plan:用来描述一个自动化测试,本次需要执行的测试范围,类似testlink上的测试计划。

thread group线程组:在自动化测试中可以是定义一个模块或者定义一个业务;在性能测试中,类似一个虚拟用户组,线程组中的每个线程都可以理解为一个虚拟用户;类似(LR中的action)

setup threads group 是一个特殊类型的线程组,执行测试之前的动作,做初始化的工作,类似(LR中的init)跟python unittest里面 setup函数是一个作用;自动化测试中,可以用于初始化测试环境;

tear down group 是一个特殊类型的线程组,执行测试之后的动作,做测试结束的收尾的工作,类似(LR中的end)跟python unittest里面 teardown函数是一个作用;在自动化测试中,可以用于恢复测试环境;

4.2线程组的8类可执行元件

jmeter元素

用途

用途详细说明

配置元件(Config element)

定义常量值,参数配置

配置数据库连接参数(JDBC……)

配置http包头信息

配置http请求默认值

配置获取csv文件里的数据

用户自定义变量

定时器(Timer)

等待时间

两个操作之间的等待时间

前置处理器(Per processors)

处理sample中的参数

用于在实际的请求发出之前对请求进行处理,例如需要保存请求中的参数或者修改请求中的参数值;

后置处理器

处理服务器返回值

用于对sampler发出请求后得到的服务器响应进行处理,一般用来提取响应中特定数据;

断言(assertions)

检查响应数据是否符合预期

断言用于检查测试中得到的响应数据是否符合预期,断言一般用来设置检查点,用以保证性能测试过程中的数据交互是否与预期一致

监听器

展示请求处理情况

是用来对测试结果数据进行处理和可视化展示的一系列元件

取样器(sampler)

请求包

取样器是实际向服务器发出请求的请求包

逻辑控制器

执行顺序

控制test plan 中sampler节点发送请求的逻辑控顺序的控制器

用来组织可控制sampler节点的事物控制器,吞吐量控制器

5.配置元件

5.1 CSV Data Set Config

用途:从csv文件中逐行读取数据;适合需要读取大批量数据的应用场景;

d0de2c3757b25b76fe1104e436106893.png

5.2 HTTP信息头管理器

用途:通知jmeter发送请求包的参数格式;是键值对,还是json格式;

19b8cad53d9bb3a94363f62e806cc2cf.png

5.3 HTTP请求默认值

用途:如果后续的多个Sample请求的服务器地址和端口都是同一个,可以统一配置一个http请求默认值,这样不需要每个sample上都配置一遍服务器地址和端口;

39374c9d39bf14ffdbed4e0fa65bc799.png

5.4 数据库连接信息配置

用途:配置jmeter中需要使用的数据库连接信息

af676cfd420b956ed5beb831782c59f6.png

5.5 用户定义的变量

用途:配置整个线程组里的sample需要用到的变量,便于统一维护变量的值;

1db3cc01263b35f225515d7e19b1a94d.png

6.逻辑控制器

6.1 ForEach控制器

ForEach控制器在用户自定义变量中读取一系列相关的变量。该控制器下的采样器或控制器都会被执行一次或多次,每次读取不同的变量值。所以ForEach总是和User Defined Variables(用户定义的变量)一起使用。下面会以实例的形式介绍它的用法。

349b3dffc40fc33be658780e7b0ce151.png

d7520c4e689d0dda9d43820c37374a41.png

a8e118ecadb5818998d3b8189ae64560.png

b85adf6fba2904f26fbe124d1fd676e3.png

f7756392c5c2e01e60b1615eb4429e28.png

6.2 简单控制器(Simple Controller)

作用:这是Jmeter里最简单的一个控制器,它可以让我们组织我们的采样器和其它的逻辑控制器(分组功能),提供一个块的结构和控制,并不具有任何的逻辑控制或运行时的功能。

a84e0619790ae78907497f1755ccdea7.png

6.3 仅一次控制器

用途:当一个循环逻辑里的有个业务只需要运行一次时,这个业务可以定义到仅一次控制器里;例如环境初始化

6f4818a2371dc9b4ab39ec056e3a70fd.png

6.4 循环控制器

用途:当需要循环执行一组sample,例如需要针对一个接口测试一组数据,就可以使用循环控制器;

8d5b1ea21f816d780c66198223e538d9.png

6.5 如果(If)控制器

用途:当需要进行if/else处理时选择,例如注册结果为用户已存在,则直接登录;

函数(默认是Javascript语句)或变量,只要运行结果为true或false即可。使用上有些区别,举个例子,原先我们可以使用条件为:${__jexl(${VAR} == 23)},这将被评估为true或false,结果将被传递到JavaScript,然后返回true或false。如果选中“Interpret Condition as Variable Expression?”,直接会对变量表达式进行评估是否为true,而不需要使用Javascript进行解析。此外,变量表达式可以返回任何值,而JavaScript的条件必须返回true或false,否则将记录错误。

当选择“Evaluate for all children?”时,该条件会对每个子节点进行判断,不选则默认只执行第一个子节点。

Javascript作为条件的例子:

(1)${COUNT} < 10

(2)"${returnVar}"=="http://www.baidu.com"

(3)"${returnVar}"=="http://www.baidu.com"

d0fdc01e027b2535dc180996a4d375bf.png

7. 取样器sample

用途:向服务器发出的请求包参数及值;

ce9543be218e1198999e6f1159034cc1.png

8. 前置处理

Sample请求包发出前的处理;

8.1 BeanShell PreProcessor

用途:修改、保存,sample请求包中的数据;

baab64692fbf3aeb46da68e6f1478ce7.png

JMeter在它的BeanShell中内置了变量,用户可以通过这些变量与JMeter进行交互,其中主要的变量及其使用方法如下:

log:写入信息到jmeber.log文件,使用方法:log.info(“This is log info!”);

vars-(JMeterVariables):操作jmeter变量,这个变量实际引用了JMeter线程中的局部变量容器(本质上是Map),它是测试用例与BeanShell交互的桥梁,常用方法:

a) vars.get(String key):从jmeter中获得变量值

b) vars.put(String key,String value):数据存到jmeter变量中

更多方法可参考:org.apache.jmeter.threads.JMeterVariables

prev-(SampleResult):获取前面的sample返回的信息,常用方法:

a) getResponseDataAsString():获取响应信息

b) getResponseCode() :获取响应code

080d219c908909dfcdb2b5bf7d0628fa.png

9. 后置处理

Sample请求包请求后的结果处理;

9.1 BeanShell PostProcessor

用途:处理sample请求包发出去后的,服务器返回的结果值;

6341a919edbb076f7cb494570273288c.png

9.2 JDBC PostProcessor

用途:处理sample请求后,检查数据库中数据的变化;

3b2366b37a484f48f757c908a83a89f9.png

9.3 正则表达式提取

用于提取Sample请求发送后,服务器返回的响应结果的数据提取;

af2be0cfa8688ab518525d83d7b4345f.png

6b68cb49bdce89e7cb451ae6ddfa8799.png

允许用户从服务器的响应中通过使用perl的正则表达式提取值。作为一个后置处理器,该元素会作用在指定范围的取样器,应用正则表达式,提取所需要的值,生成模板字符串,并将结果存储到给定的变量名中。

**在此简单地向大家介绍一下常用的正则表达式的基础: **

  • .:匹配任何单个字符。例如Perl正则表达式r.t匹配这些字符串:rat、rut、rt,但是不匹配root
  • $:匹配行结束符。例如Perl正则表达式weasel$能够匹配字符串"He'saweasel"的末尾,但是不能匹配字符串"Theyareabunchofweasels."
  • ^:匹配一行的开始。例如Perl正则表达式^Whenin能够匹配字符串"Wheninthecourseofhumanevents"的开始,但是不能匹配"WhatandWheninthe"
  • *:匹配0或多个正好在它之前的那个字符。例如Perl正则表达式.*意味着能够匹配任意数量的任何字符
  • \:这是引用符,用来将这里列出的这些元字符当作普通的字符来进行匹配。例如Perl正则表达式$被用来匹配美元符号,而不是行尾,类似的,Perl正则表达式.用来匹配点字符,而不是任何字符的通配符
  • []、[c1-c2]、[^c1-c2]:匹配括号中的任何一个字符。例如Perl正则表达式r[aou]t匹配rat、rot和rut,但是不匹配ret。可以在括号中使用连字符-来指定字符的区间,例如Perl正则表达式[0-9]可以匹配任何数字字符;还可以制定多个区间,例如Perl正则表达式[A-Za-z]可以匹配任何大小写字母。另一个重要的用法是“排除”,要想匹配除了指定区间之外的字符——也就是所谓的补集——在左边的括号和第一个字符之间使用^字符,例如Perl正则表达式[^269A-Z]将匹配除了2、6、9和所有大写字母之外的任何字符
  • |:将两个匹配条件进行逻辑“或”(Or)运算。例如Perl正则表达式(him|her)匹配"itbelongstohim"和"itbelongstoher",但是不能匹配"itbelongstothem."。注意:这个元字符不是所有的软件都支持的 +:匹配1或多个正好在它之前的那个字符。例如Perl正则表达式9+匹配9、99、999、98、93dsf、9.....等。注意:这个元字符不是所有的软件都支持的
  • ?:匹配0或1个正好在它之前的那个字符。注意:这个元字符不是所有的软件都支持的 {i}、{i,}、{i,j}:匹配指定数目的字符,这些字符是在它之前的表达式定义的。例如Perl正则表达式A[0-9]{3}能够匹配字符"A"后面跟着正好3个数字字符的串,例如A123、A348等,但是不匹配A1234。Perl正则表达式[0-9]{4,}匹配连续的任意4个或4个以上数字字符。Perl正则表达式[0-9]{4,6}匹配连续的任意4个、5个或者6个数字字符。注意: 这个元字符不是所有的软件都支持的
  • \d:任意数字 [0-9]
  • \D:除数字外的任意字符 [^0-9]
  • \w:任意单词字符 [_0-9a-zA-Z]
  • \W:任意非单词字符 [^_0-9a-zA-Z]
  • \s:空白 [ \r\t\n\f] \S:非空白 [^ \r\t\n\f]

10. jmeter断言

用于判断返回的响应结果是否满足预期;

10.1 响应断言

一个sample的请求响应结果如下:

dc66114f486fba878de0ea503bd54ede.png

则可以设置断言如下:

29b761fad10a3dce009a415f74350469.png

备注:包括:返回结果包含指定的内容。

匹配:根据置顶内容进行匹配:

Equals:返回结果与指定的一致

substring:返回结果是指定的字符串

否:不匹配

11.内置函数

11.1 _CSVread读取参数文件

两个值:1.读取文件的全路径2.文件序列号(从第几列读取,0是第一列)

11.2 _StringfromFile读取文件

三个值分别是:1.读取文件的全路径2.从第几行开始读3.从第几行结束读取(0是第一行)

11.3 _counter计数器

两个值分别是:

1.当第一个值为true表示每个用户都有自己的计数器,当 为false时,作为全局计数器

2.存储结果的变量名

12.jmeter执行原理

12.1 元件作用域

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

1.取样器不和其他元件交互:不存在作用域的问题;

2.逻辑控制器(logic controller)元件只对子节点中的取样器和逻辑控制器作用

3.除取样器和逻辑控制器外,其他6类元件,如果是某个取样器的子节点,则该元件对其父子节点起作用,如果其父子节点不是取样器,则其作用域是该元件父节点下的其他所有后代节点(包括子节点,子节点的子节点)

12.2 元件的执行顺序

配置元件-前置处理器-定时器-取样器-后置处理器-断言-监听器

执行顺序tip:

前置处理器,后置处理器,断言等元件功能对取样器起作用,因此,如果他们的作用域内没有任何取样器,不会执行

如果同一作用域范围有多个同一类的元件,按照测试计划树依次进行。

关于Jmeter生成CVS数据流的 方法

  1. 导入jar包

  2. Jmeter中设置参数,设置路径。 BeanShell Sampler 代码如下:

import handle.handlepath;
//解决盘符问题
handlepath hp=new handlepath();
//log.info("-------------");
//log.info(vars.get("outputdatapath"));
String dir=vars.get("userDir");
//log.info(dir);
dir=hp.recodePath(dir);
//log.info(dir);
vars.put("outputdatapath",dir);

177b77648447c8b0b56b3bef1976481d.png

  1. 导入数据

bec09e245571b3069a835eb9ba6f395c.png

  1. CSV数据的的引用

e7605a97690dd5740902538834cdca95.png

13.Jmeter做性能测试

Apache JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试,它最初被设计用于Web应用测试但后来扩展到其他测试领域。 它可以用于测试静态和动态资源例如静态文件、Java小服务程序、CGI脚本、Java 对象、数据库, FTP服务器, 等等。JMeter 可以用于对服务器、网络或对象模拟巨大的负载,来在不同压力类别下测试它们的强度和分析整体性能。另外,JMeter能够对应用程序做功能/回归测试,通过创建带有断言的脚本来验证你的程序返回了你期望的结果。为了最大限度的灵活性,JMeter允许使用正则表达式创建断言。

  1. 启动JMeter

这里就在win下进行,图形界面较为方便
在目录apache-jmeter-2.9\bin 下可以见到一个jmeter.bat文件,双击此文件,即看到JMeter控制面板。

  1. 运行预准备

现在来对LinuxEye进行压力测试,压力测试对象为随机的几个网页链接,这几个链接是写在一个文本文件中的,在压力测试的时候会随机读取。

  1. 建立一个线程组

为什么要建立线程组?

原因很简单,因为我们要模拟多个线程(用户)来访问LinuxEye。线程属性部分中,线程数是启动多少个线程,我这里填写的是10,Ramp-Up Period (in seconds)表示线程之间间隔多少时间允许,单位是秒,比如如果填写10,那么10/10=1表示10个线程间每隔1秒钟请求网站。循环次数:60个线程运行完毕算是一次,循环次数就是这样的一个请求过程运行多少次,我这里测试就填写的是2。每次修改一个设置后,别忘记了保存一下。

  1. 设置请求服务器、压力链接等信息

接下来很自然的是,我们要测试的网站地址是什么?链接是什么?所以现在我们就来设置这些信息。右键点击我们刚创建的线程组,在弹出的菜单中,选择添加->Sampler->Http请求,弹出如下图界面:

路径:

假如你只是对一个链接进行压力测试,直接填写一个链接就ok,比如 http://www.linuxeye.com,但是大多数情况下都不是这样的,我们这里需要多个链接,就如同刚开始讲到的那样,我们要将多个链接保存到一个文本文件中,然后随机读取进行压力测试。我们可以这么做,如图:

在选择一个功能下拉列表中选择_StringFromFile,然后在本机新建一个测试文件C:\Users\root\Desktop\apache-jmeter-2.9\test.txt,在第一行(你也可以不在第一行)的值中填写测试文件的路径,如下图:

然后点击“生成”按钮,在生成按钮的左边文本框中将生成一个字符串如:

${__StringFromFile(C:\Users\root\Desktop\apache-jmeter-2.9\test.txt,,,)}

在test.txt测试文件中,我们每行写一个URL链接,如下格式:

1. /command
2. /linuxrumen
3. /program
4. /jianzhan
5. /command/cat.html
6. /command/chmod.html
7. /command/lsattr.html

注意,每行前面并没有http://www.linuxeye.com这样的信息,因为我们在前面已经填写了服务器地址为www.linuxeye.com,这里就没必要再为每个url填写这个相同前缀了;另外,上面的url格式也只是个例子,表示域名后的部分。

这样一来,当我们并非请求的时候,就会从test.txt中随机选择url来进行压力测试。

另外值得注意的一个地方是,如果参数中有中文的情况,运行的时候可能会出现乱码,这个时候就需要注意你在Jmeter中的编码设置与你要请求的网页编码是一致的。

路径文本框下面的选项,可以按默认的就成,Use multipart/form-data for HTTP POST是当请求中有附件的情况,一般情况下都不用选中的。

  1. 查看运行结果

鼠标右键点击线程组,在弹出的菜单中选择添加->监听器->用表格查询结果,如下图:

3. 运行

当然,在运行前,请把所有修改都保存好

运行后的结果表格如下:

各属性如下:

· Sample:每个请求的序号

· Start Time:每个请求开始时间

· Thread Name:每个线程的名称

· Label:Http请求名称

· Sample Time:每个请求所花时间,单位毫秒

· Status:请求状态,如果为勾则表示成功,如果为叉表示失败。

· Bytes:请求的字节数

如果Status为叉,那很显然请求是失败了,但如果是勾,也并不能认为请求就一定完全成功了,因为还得看Bytes的字节数是否是所请求网页的正常大小值,如果不是则说明发生了丢包现象,也不是完全成功。

在下面还有几个参数:

· 样本数目:也就是上面所说的请求个数,成功的情况下等于你设定的并发数目乘以循环次数

· 平均:每个线程请求的平均时间

· 最新样本:表示服务器响应最后一个请求的时间

· 偏离:服务器响应时间变化、离散程度测量值的大小,或者,换句话说,就是数据的分布(这个我不是很理解)。

术语:

  1. 线程组:测试里每个任务都要线程去处理,所有我们后来的任务必须在线程组下面创建。可以在“Test Plan(鼠标右击) -> 添加 ->Threads(Users) -> 线程组”来建立它,然后在线程组面板里有几个输入栏:线程数、Ramp-Up Period(in seconds)、循环次数,其中Ramp-Up Period(in seconds)表示在这时间内创建完所有的线程。如有8个线程,Ramp-Up = 200秒,那么线程的启动时间间隔为200/8=25秒,这样的好处是:一开始不会对服务器有太大的负载。

  2. 取样器(Sampler):可以认为所有的测试任务都由取样器承担,有很多种,如:HTTP请求。

  3. 断言:对取样器返回的请求结果给出判断是否正确。

  4. monitor:它的功能是对取样器的请求结果显示、统计一些数据(吞吐量、KB/S……)等

14.Jmeter脚本编写规范:

  1. 熟悉业务逻辑(若有web页面显示,则熟悉前端接口逻辑)

  2. 编写脚本过程中,做到闭环

  3. 掌握其他技术要求,比如sql语句、正则表达式提取、脚本编写


本文转载自: https://blog.csdn.net/csd11311/article/details/125236436
版权归原作者 软件质量保障 所有, 如有侵权,请联系我们删除。

“JMeter详细使用手册”的评论:

还没有评论