Jmeter使用指南

目录

前言

本次示例的Jmeter版本5.2.1

一、基本配置操作

1、jmeter界面字体放大

2、jmeter设置代理启动

安装插件包
jmeter-plugins-manager-1.3
cmd命令输入(解决无外网的操作)
jmeter -H 192.168.150.200 -P 3128

3、jmeter返回结果乱码处理

打开jmeter\bin\jmeter.properties,Ctrl+F查找 #sampleresult.default.encoding=ISO-8859-1,把#去掉,更改为 sampleresult.default.encoding=utf-8 保存后,关闭jmeter。重新打开执行即可。

二、Jmeter整体操作流程

1、添加测试计划

1、测试计划名称和注释:整个测试脚本保存的名称,和对该测试计划的注释,可以自定义,最好能表达脚本的意义。

2、用户定义的变量:在测试计划上可以添加用户定义的变量,相当于是全局变量。一般添加一些系统常用的配置。如果测试过程中想切换环境,切换配置,一般不建议在测试计划上添加变量,因为不方便启用和禁用,一般是直接添加用户自定义变量组件。

3、独立运行每个线程组: 用于控制测试计划中的多个线程组的执行顺序。不勾选时,默认各线程组并行、随机执行。如上图,线程组1和线程组2的线程是并行执行的,执行过程线程的执行顺序是不可预料的。
如果勾选了独立运行每个线程组,可以保证线程组1的执行一定在线程组2之前,线程组1执行完毕,才会执行线程组2,即顺序执行各线程组。

补充说明:

线程组中的取样器的执行顺序:默认是从上到下执行。交替控制器、随机控制器、随机顺序控制器和循环控制器等可以改变取样器的执行顺序。

4、Run tearDown Thread Groups after shutdown of main threads:当线程组停止运行时仍继续运行tearDown线程组,该选项结合线程组的执行配置使用,如下图所示,一般很少用到,了解即可。

5、函数测试模式(Functional Testing):

如果选中了此选项,同时监听组件如“查看结果树”配置了保存到一个文件中,那么jmeter会将每次的请求结果保存到文件中。一般不建议勾选。

6、Add directory or jar to classpath:

添加文件或jar包,此功能最常用于调用外部jar包。当脚本需要调用外部的java文件或jar包时,可以把jar包路径添加到这里,然后在beanshell中直接import进来,并调用jar包中的方法。

2、添加线程组

1)Jmeter执行是通过线程组进行驱动的,测试计划必须最少有一个线程组,选中Test Plan,点击右键,Add》Threads(User)》Thread Group

1、 setup thread group

一种特殊类型的ThreadGroup,用于在执行常规线程组之前执行一些必要的操作。在“setup thread group ”下提到的线程行为与普通线程组完全相同。不同的是执行顺序---它会在普通线程组执行之前被触发。

应用场景举例:

A、测试数据库操作功能时,用于执行打开数据库连接的操作。

B、测试用户购物功能时,用于执行用户的注册、登录等操作。

2、teardown thread group

一种特殊类型的ThreadGroup,用于在执行常规线程组完成后执行一些必要的操作。在“teardown thread group ”下提到的线程行为与普通线程组完全相同。不同的是执行顺序---它会在普通线程组执行之后被触发。

应用场景举例:

A、测试数据库操作功能时,用于执行关闭数据库连接的操作。

B、测试用户购物功能时,用于执行用户的退出等操作。

默认情况下,如果测试按预期完成,则TearDown线程组将不会运行。如果你想要运行它,则需要从Test Plan界面中选中复选框“Run tearDown Thread Groups after shutdown of main threads”。

可能你还是不太理解他们与普通的线程组有什么不同。但是如果你用过junit,想必你应该对setup ,teardown这两个字眼不陌生。

如果你熟悉loadrunner,那你应该知道loadrunner的脚本中除了action里是真正的脚本核心内容,还有进行初始化操作的init脚本和测试完毕后对应的end脚本块。那么这里setup thread group 和 teardown thread group 就是分别指这两部分。

3、 thread group(线程组)

 这个就是我们通常使用的线程。通俗的讲,一个线程组可以看做一个虚拟用户组,线程组中的每个线程都可以理解为一个虚拟用户。多个用户同时去执行相同的一批次任务。每个线程之间都是隔离的,互不影响的。一个线程的执行过程中,操作的变量,不会影响其他线程的变量值。

线程参数配置

1、取样器错误后要执行的动作:

继续:忽略错误,继续执行

Start Next Thread Loop: 忽略错误,线程当前循环终止,执行下一个循环。

停止线程:当前线程停止执行,不影响其他线程正常执行。

停止测试:整个测试会在所有当前正在执行的线程执行完毕后停止CS

Stop test now:整个测试会立即停止执行,当前正在执行的取样器可能会被中断。

这几个配置项控制了“当遇到错误的时候测试的执行策略”是否会继续执行。

2、设置线程数:

线程数也就是并发数,每个线程将会完全独立的运行测试计划,互不干扰。多个线程用于模仿对服务器的并发访问。

3、设置ramp-up period:

ramp-up period用于设置启动所有线程所需要的时间。如果选择了10个线程,并且ramp-up period是100秒,那么JMeter将使用100秒使10个线程启动并运行。每个线程将在前一个线程启动后10(100/10)秒后启动。

当这个值设置的很小、线程数又设置的很大时,在刚开始执行时会对服务器产生很大的负荷。

下图的线程配置中,5个线程,5秒启动时间,每个线程执行两次循环。那么每秒会启动一个线程,每次循环执行一个请求。

4、设置循环次数:

该项设置线程组在结束前每个线程循环的次数,如果次数设置为1,那么JMeter在停止前只执行测试计划一次。

5、Delay Thread creation until needed:

默认情况下,测试开始的时候,所有线程就被创建完了。如果勾选了此选项,那么线程只会在合适的需要用到的时候创建。

调度器配置可以更灵活的控制线程组执行的时间
1、持续时间(秒):

控制测试执行的持续时间,以秒为单位。

2、启动延迟(秒):

控制测试在多久后启动执行,以秒为单位。

3、启动时间:

控制测试在某个时间点启动。但这个配置会被“启动延迟”配置覆盖。

4、结束时间:

控制测试执行的结束时间。但这个配置会被“持续时间”配置覆盖。

如果不想立即执行执行,可以通过调度器控制测试执行的开始时间和结束时间。

当测试开始时,如果设置了调度器,JMeter将等待直到到了开始时间。在每个周期结束,JMeter将会检查是否到达结束时间,如果达到,停止运行;否则测试继续运行直到达到了重复限制。

线程组插件jpgc - Standard Set
jp@gc - Stepping Thread Group

This Group will start 100 threads:这次的测试总共会起100个线程。
First , wait for 0 seconds:等待0s后开始起线程,也就是不等待直接起线程。
Then start 0 threads;从0个线程开始持续增加。
Next,add 10 threads every 30 seconds:每增加10个线程后会运行30s,再起余下的10个线程,再运行30s,以此类推。
Using ramp-up 6 seconds:前面每起10个线程的时候花6s,与上面结合起来即6s内起10个线程,运行30s,然后再再6s内再起10个线程,再运行30s,以此类推。
Then hold load for 60 seconds. :全部的线程起来后,运行60s 后开始停止。
Finally , stop 5 threads every 1 seconds:最后停止线程,5个线程停一次,等1s再停5个线程。

3、添加取样器(例:HTTP请求)

1)选中线程组Thread Group,点击右键,Add》Sampler》HTTP Request

2)在HTTP请求中输入服务器ip、端口、路径、参数

3)在HTTP请求添加信息头管理器,右键点击HTTP Request》Add》Config Element》HTTP Header Manager


4)在HTTP请求添加断言,右键点击HTTP Request》Add》Assertions》Response Assertion,输入要断言的字段

5)添加察看结果树,右键点击Thread Group》Add》监听器》察看结果树,用来查看测试结果

4、执行请求

在页面点击启动按钮
Jmeter脚本执行顺序:配置元件 → 前置处理器 → 定时器 → 取样器 → 后置处理器 → 断言 → 监听器;同一层级的,顺序执行;

5、查看结果树

三、关联

应用场景:

在一个线程组中,B请求需要使用A请求返回的数据,也就是常说的关联,将上一个请求的响应结果作为下一个请求的参数,则需要对A请求的响应报文使用后置处理器。

1、边界提取器Boundary Extractor

它可以通过左右边界来提取需要的内容,非常类似LR中的关联

它可以匹配任何格式的内容,如文本、json、xpath、html等等

使用也很简单,不需要你会正则表达式,分别填写要提取内容的左右边界即可,很灵活

Match No :0代表随机值,n取第几个匹配,-1代表所有,如填写2表示报文中的第2个对象

2、正则表达式提取器

允许用户从作用域内的sampler请求的服务器响应结果中通过正则表达式提取值所需值,生成模板字符串,并将结果存储到给定的变量名中。

各配置项介绍:
APPly to:作用范围(返回内容的断言范围)

1、Main sample and sub-samples:作用于主节点的取样器及对应子节点的取样器

2、Main sample only:仅作用于主节点的取样器

3、Sub-samples only:仅作用于子节点的取样器

4、JMeter Variable:作用于jmeter变量(输入框内可输入jmeter的变量名称),从指定变量值中提取需要的值。

Field to check:要检查的响应报文的范围

1、主体:响应报文的主体,最常用

2、Body(unescaped):主体,是替换了所有的html转义符的响应主体内容,注意html转义符处理时不考虑上下文,因此可能有不正确的转换,不太建议使用

3、Body as a Document:从不同类型的文件中提取文本,注意这个选项比较影响性能

4、Response Headers:响应信息头(如果你使用的是中文版的Jmeter,会看到这一项是信息头,这是中文翻译问题,应以英文为准)

5、Request Headers:请求信息头

6、URL:请求url

7、Response Code:响应状态码,比如200、404等

8、Response Message:响应信息

引用名称(Reference Name):

Jmeter变量的名称,存储提取的结果;即下个请求需要引用的值、字段、变量名,后文中引用方法是${引用名称}

正则表达式(Regular Expression):

使用正则表达式解析响应结果,()括号表示提取字符串中的部分值,前后是提取的边界内容。

模板(Template):

正则表达式的提取模式。如果正则表达式有多个提取结果,则结果是数组形式,模板$1$,$2$等等,表示把解析到的第几个值赋给变量;从1开始匹配,以此类推。若只有一个结果,则只能是$1$;

匹配数字(Match No):

正则表达式匹配数据的结果可以看做一个数组,表示如何取值:0代表随机取值,正数n则表示取第n个值(比如1代表取第一个值),负数(-1)则表示提取所有符合条件的值。

缺省值:

匹配失败时候的默认值;通常用于后续的逻辑判断,一般通常为特定含义的英文大写组合,比如:ERROR等。

重点分析:
下面重点分析一下正则表达式的匹配规则及注意事项:

一、下面是常用的正则表达式操作符

( ) :将 () 之间括起来的表达式定义为“组”(group),并且将匹配这个表达式的字符保存到一个临时区域,我们主要就是利用这个元字符配合所指定的字符串匹配规则来进行匹配信息的提取;
"^" :^会匹配行或者字符串的起始位置,有时还会匹配整个文档的起始位置。
"$" :$会匹配行或字符串的结尾。例如正则表达式“浮云$”,能够匹配字符串“一切都是浮云”的末尾,但是不能匹配字符串“浮云呀”
"\w":匹配字母,数字,下划线。例如我要匹配"a2345BCD__TTz" 正则:"\w+" 这里的"+"字符为一个量词指重复的次数。
"\s":匹配空格。例如字符 "a b c" 正则:"\w\s\w\s\w" 一个字符后跟一个空格,如有字符间有多个空格直接把"\s" 写成 "\s+" 让空格重复。
".":匹配除了换行符以外的任何字符。匹配任何单个字符。例如正则表达式“b.g”能匹配如下字符串:“big”、“bug”、“b g”,但是不匹配“buug”,“b..g”可以匹配“buug”。
"[abc]": 字符组,匹配包含括号内元素的字符。
[ ] :匹配括号中的任何一个字符。例如正则表达式“b[aui]g”匹配bug、big和bag,但是不匹配beg、baug。可以在括号中使用连字符“-”来指定字符的区间来简化表示,例如正则表达式[0-9]可以匹配任何数字字符,这样正则表达式“a[0-9]c”等价于“a[0123456789]c”就可以匹配“a0c”、“a1c”、“a2c”等字符串;还可以制定多个区间,例如“[A-Za-z]”可以匹配任何大小写字母,“[A-Za-z0-9]”可以匹配任何的大小写字母或者数字。

"": 重复零次或更多(贪婪模式)。例如"aaaaaaaa" 匹配字符串中所有的a 正则:"a" 会出到所有的字符"a"。匹配0至多个在它之前的子表达式,和通配符没关系。例如正则表达式“zo”能匹配 “z” 、“zo”以及 “zoo”;因此“.”意味着能够匹配任意字符串。"z(b|c)"→zb、zbc、zcb、zccc、zbbbccc。"z(ab)"能匹配z、zab、zabab(用括号改变优先级)。
"+": 重复一次或更多次(懒惰模式)。例如"aaaaaaaa" 匹配字符串中所有的a; 正则:"a+"会取到字符中所有的a字符,"a+"与"a
"不同在于"+"至少是一次而"" 可以是0次。
匹配前面的子表达式一次或多次,和
对比(0到多次)。例如正则表达式9+匹配9、99、999等。 “zo+”能匹配 “zo”以及 “zoo” ,不能匹配"z"。
"?": 重复零次或一次。例如"aaaaaaaa" 匹配字符串中的a 正则 : "a?" 只会匹配一次,也就是结果只是单个字符a。"do(es)?" 可以匹配 "do" 或 "does" 。一般用来匹配“可选部分”。
"{n}": 重复n次。例如从"aaaaaaaa" 匹配字符串的a 并重复3次 正则:"a{3}" 结果就是取到3个a字符 "aaa"。匹配确定的 n 次。"zo{2}"→zoo。例如,“e{2}” 不能匹配“bed”中的“e”,但是能匹配“seed”中的两个“e”。
"{n,m}": 最少匹配 n 次且最多匹配 m 次。“e{1,3}”将匹配“seeeeeeeed”中的前三个“e”。
"{n,}": 至少匹配n次。例如,“e{2,}”不能匹配“bed”中的“e”,但能匹配 “seeeeeeeed”中的所有“e”。与{n,m}不同之处就在于匹配的次数将没有上限,但至少要重复n次 如 正则"a{3,}" a至少要重复3次。
"?": 重复任意次,但尽可能少重复。如 "acbacb" 正则"a.?b" 只会取到第一个"acb" 原本可以全部取到但加了限定符后,只会匹配尽可能少的字符 ,而"acbacb"最少字符的结果就是"acb"。
"+?": 重复1次或更多次,但尽可能少重复。与上面一样,只是至少要重复1次。
".+?":通过?元字符表示一个非贪婪模式匹配,即(最小匹配);
".+": 一个以上的任意字符,通过贪婪型匹配策略进行表达式模板的匹配(最大匹配);
"??": 重复0次或1次,但尽可能少重复。如 "aaacb" 正则 "a.??b"只会取到最后的三个字符"acb"。
"{n,m}?": 重复n到m次,但尽可能少重复。如 "aaaaaaaa" 正则 "a{0,m}" 因为最少是0次所以取到结果为空
| :将两个匹配条件进行逻辑“或”运算。'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。

\d:代表一个数字,等同于[0-9]

\D:代表非数字,等同于[^0-9]

\s:代表换行符、Tab制表符等空白字符

\S:代表非空白字符

\w:匹配字母或数字或下划线或汉字,即能组成单词的字符

\W:非\w ,等同于[^\w]

d:digital;s:space、w:word。大写就是“非”

"^\d{3,4}-?\d+$"表示被匹配的字符序列应该是由三至四位数字组成,由于长途区号的连字符“-”可有可无,所以这里使用“?”元字符进行说明。由于连字符“-”在正则表达式中有特殊含义(表示范围,比如[0-9]),所以要对其进行转义。

[]括号中的任意字符,\w字母、数字、下划线,+一到多个。由于.在正则表达式中有特殊的含义,因此对于真正想表达“.”则需要转移“.”。先想正则表达式是语言无关的。

+、*的匹配默认是贪婪(greedy)的:尽可能多的匹配,直到“再贪婪一点儿”其后的匹配模式就没法匹配为止。

在+、*后添加?就变成非贪婪模式(? 的另外一个用途):让其后的匹配模式尽早的匹配。修改成"我是(.+?)。"

图片 src[>]*[/].(?:jpg|bmp|gif)(?:"|')

中文 ^([\u4e00-\u9fa5]+|[a-zA-Z0-9]+)$

网址 "<a.+?href='""(?!mailto:)(?>foundAnchor>['"">]+?)[>]*?>"

匹配中文字符的正则表达式: [\u4e00-\u9fa5]

匹配双字节字符(包括汉字在内):[^\x00-\xff]

匹配空行的正则表达式:\n[\s| ]*\r

匹配HTML标记的正则表达式:/<(.)>.</\1>|<(.*) />/

匹配首尾空格的正则表达式:(^\s)|(\s$)(像vbscript那样的trim函数)

匹配Email地址的正则表达式:\w+([-+.]\w+)@\w+([-.]\w+).\w+([-.]\w+)*

匹配网址URL的正则表达式:http://([\w-]+.)+[\w-]+(/[\w- ./?%&=]*)?

二、贪婪和非贪婪

提到正则表达式,必须要说一下匹配的两种模式:贪婪和非贪婪。

1、贪婪与非贪婪模式是两种不同的表达式匹配行为,贪婪模式在整个表达式匹配成功的前提下,尽可能多的匹配,而非贪婪模式在整个表达式匹配成功的前提下,尽可能少的匹配。

2、下面举个例子,假设有如下响应结果(只截取了其中一部分):


"code":"0","msg":"请求成功","bizSeqNo":"1804242UD01154300109392900987311" ,"result":{"bizSeqNo":"1804242UD01154300109423800987316","transactionTime":"20180424094239"

3、现在从中提取bizSeqNo的值:


"bizSeqNo":"(.*)":贪婪模式,提取结果是:1804242UD01154300109392900987311" ,"result":{"bizSeqNo":"1804242UD01154300109423800987316","transactionTime":"20180424094239

"bizSeqNo":"(.*?)":非贪婪模式,提取结果是:1804242UD01154300109392900987311

三、进阶匹配问题

1、如何获取数组结果?

如果有多个匹配的结果,则获取到的是个数组,此时若要提取其中的内容,调用方式为${ bizSeqNo _1},${bizSeqNo _2}...,如果想要得到匹配出的结果的个数,用${bizSeqNo _matchNr},如果想随机选取一个,只需要将匹配数字设为0,使用${bizSeqNo}调用即可。

2、如何获取唯一的匹配结果?

如果想要避免上面获取多种结果的情况,则需要注意把正则表达式写成非贪婪模式,或者增加正则表达式的前后边界,使结果唯一匹配既可。

3、beanshell后置处理器

beanshell脚本调用fastjson包解析json字符串。

这里要用到fastjson,jar包下载地址:https://mvnrepository.com/artifact/com.alibaba/fastjson。下载后,把jar包放到D:\apache-jmeter-5.1.1\lib\ext下,然后重启jmeter即可。



4、Json Extractor提取器

各项参数解释:

  1. Names of created variables:表示json提取器从响应中获取到的内容所存储的变量,随便定义只要不冲突即可,建议起一个有意义的名称,不要写成abc毫无意义的名称
  2. JSON Path Expressions:json提取的表达式,表示需要按照这个规则从响应中匹配内容,图中表达式表示匹配响应中的所有name字段对应的值
  3. Match No. (0 for Random):匹配结果存储到变量的策略,默认什么都不写就是0
    1  0表示随机一个存储的变量中,比如我们匹配了多个name字段的值,那么会随机将其中一个 值赋值给Names of created variables指定的变量
    2  -1表示使用数字后缀标识每一个匹配的结果,比如我们匹配了多个name字段的值,那么最终每一个结果都会对应一个变量,变量名称则是name_1、name_2、name_3、name_4 ....
    3  X表示把第几个匹配到的值赋值给Names of created variables指定的变量,比如写个2,那么就会把匹配到的第2的name字段的值赋值给name
  4. Compute concatenation var:表示如果匹配到多个值,可以将多个值存储在一个变量中,变量名为Names of created variables指定的变量名称加_ALL,比如当前图中就是name_ALL,存储的多个值以,分割
  5. Default Values:表示如果json表达式没有匹配到任何值,那么变量的默认值是啥

5、jp@gc - JSON Path Extractor提取器

$表示接口的返回值,如果取字典key的value,用点号,如果是取列表的某个值,用索引

6、xpath提取器

有时请求会返回json,有时请求会返回html,虽然正则提取器都可以获得内容,但是编写难度会随着业务复杂度提升而提升,这种 时候根据返回结果针对性的提取是更为简便的。

json patn 后置处理:针对json格式的返回处理
xpath 提取器:针对html或者xml返回的处理
jmeter——xpath 提取
xpath 格式和规则
通 配符
多 个不同路径
特 有语法

1.在htyp请求之后创建XPath Extractor
Alt text

2.勾选
Alt text

3.编写xpath
xpath 格式和规则

斜杠(/)作为路径内部的分割符。

同一个节点有绝对路径和相对路径两种写法。

绝对路径(absolute path)必须用”/”起首,后面紧跟根节点,比如/step/step/…。

相对路径(relative path)则是除了绝对路径以外的其他写法,比如 step/step,也就是不使用”/”起首,使用”//”起首也是可以的,比如//step/step。

“.”表示当前节点。

“..”表示当前节点的父节点

“/”:表示选择根节点

“//”:表示选择任意位置的某个节点

“@”: 表示选择某个属性

四、参数化

Jmeter中通过${}形式来取参数值。取值为变量,${变量名};当取值为函数,${_函数名(参数1,参数2,参数3)}

1、CSV Data Set Config

各配置项介绍:

该元件的作用:

从文件中读取变量值,用于变量的参数化,可设置多种读取方式。

各填写项说明:

1、名称、注释:元件的名称及注释

2、Config the CSV Data Source:配置数据源

1)Filename:csv文件的完整路径(文件路径,本机服务器操作,填写csv完整路径;远程服务器操作,将csv文件放在jmeter的bin目录下,直接填写文件名)

2)File encoding:csv文件编码,可以不填

3)Variable Names(comma-delimited):csv文件中各列的名字(有多列时,用英文逗号隔开列名),名字顺序要与内容对应,这个变量名称是在其他处被引用的,所以为必填项,该处变量名称无需跟列字段名称一致可自定义,但多个变量时,需按顺序匹配列。

4) Ignore first line (only used if Variable Names is not empty):当 CSV 文件中首行设置了变量名时,该项设为 true,此时每次请求读取文件时会自动忽略首行,直接读取第二行的数据。

5)Delimiter(use “\t” for tab):csv文件中的分隔符(用”\t”代替tab键)(一般情况下,分隔符为英文逗号)

6)Allow quoted data?:是否允许引用数据

7)Recycle on EOF?:到了文件尾是否循环,True—继续从文件第一行开始读取,False—不再循环

8)Stop thread on EOF?:到了文件尾是否停止线程,True—停止,False—不停止,注意:当Recycle on EOF设置为True时,此项设置无效。

9)Sharing mode:共享模式,All threads –所有线程,Current thread group—当前线程组,Current thread—当前线程。

CSV Data Set Config配置元件
CSV Data Set Config 是CSVRead函数的升级版组件,它可以配置更多选项来控制读取的过程:
• Filename:CSV文件路径
• File Encoding:编码格式,中文系统下生成的CSV文件编码使用GBK (英文系统使用UTF-8)
• Variables Name:生成的变量名,通过顺序和Excel列数据对应,指定变量名以后DebugSampler中可查看变量值
• Delimiter:分割符,CSV默认的分割符是逗号,tab分割符用
• Allow quoted data: 是否允许双引号内的拆分,设置为Ture时,“a,b”,c 会被解析为3列数据,设置为False时,会被解析为2列数据,默认False
• Recycle on EOF:参数文件是否循环遍历,设置为False时,文件遍历完则终止提取,请求的参数值为EOF,默认True。无论是设置多线程,还是多次迭代,都会循环遍历CSV文件。
• Stop thread on EOF:参数值为EOF时,是否停止执行线程。当 Recycle on EOF 设置为 true 时,此项不起任何作用。当且仅当 Recycle on EOF? 为 false 时,此项配置才生效。默认为False
• Sharing mode:共享模式,All threads:参数文件对所有线程共享,包括同一测试计划中的不同线程组;Current thread group:只对当前线程组中的线程共享;Current thread:仅对当前线程获取。
重点分析:

下面重点分析一下Allow quoted data和Sharing mode:

1、Allow quoted data?:是否允许引用数据,这个比较好理解

其实就是说是否允许数据中带有双引号,如果数据带有双引号且此项设置TRUE,则会自动去掉数据中的双引号使能够正常读取数据;如果数据带有双引号且此项设置为FALSE,则读取数据报错。所以此项实际是控制csv文件中的双引号是否为有效字符。

2、Sharing mode:共享模式,这个稍微有点复杂!

All threads:针对所有线程组的所有线程,每个线程取值不一样,依次取csv文件中的下一行。

假如说有线程1到线程n (n>1),线程1取了一次值后,线程2取值时,取到的是csv文件中的下一行,即与线程1取的不是同一行。不管是单个线程组还是多个线程组,每个线程都是依次取下一行。需要注意的是,当一个线程组中有多个请求时,对于每个线程来说,在一次循环中每个请求的取值是一样的。下面举例说明:

设置线程组1、2、3分别为1并发、1次循环,且各线程组按顺序执行:

设置线程组1、2、3分别为1并发、2次循环,且各线程组按顺序执行:

设置线程组1、2、3分别为2并发、1次循环,且各线程组按顺序执行:

大家可以仔细比较一下上图和上上图的区别,乍一看貌似是一样的,但是实际却是不同的线程,怎么区分不同线程呢?

${__BeanShell(ctx.getThread().getThreadName().toString())}----这个函数可以输出类似这样的内容:“线程组1 1-2“,前面是当前线程组的名称-线程组1,后面是线程组id,然后是线程id,现在再比较上面两图中,发现是线程id不一样。

总体来说就是,在All Threads模式下,并发数和循环数都会读取不同的csv数据,但是同一线程组内的多个sampler总是取相同的值。

Current thread group:当前线程组,取值情况是:每个线程组都会从第1行开始取值并依次往下进行取值。举例如下:

设置线程组1、2均为2并发、1循环:

Current thread:当前线程。取值情况是:每个线程组的每个线程都会从第1行开始取值并依次往下进行取值。举例如下:

设置线程组1、2均为2并发、1循环:

最后,给大家一个小作业:

如何通过设置Sharing moder的方法来实现多个sampler中的参数可以依次不重复的取同一个csv文件中的值?

2、用户定义的变量

可以添加在测试计划,也可以添加在线程组中,也可以添加在请求中,使用的域不同。

使用HTTP cookies 管理器也相当与定义了一个cookies,jsessionid,sessionid的值。

3、从函数获取变量

jmeter选项中的函数助手对话框,可以添加和查看函数

RandomString函数
Jmeter通过RandomString函数助手可动态生成字符串,它包括三个变量:
• Random string length:生成的String长度
• Chars to use for random string generation:用于生成String的字符集
• Name of variable in which to store the result (optional):可选,指定存储生成的String变量名,供后续接口调用。

通过RandomString可以生成任意长度的指定字符集的字符串,除了生成随机字符串,还可以基于RandomString拼接扩展特定格式的字符串。
比如有些系统会校验手机号前三位,即可通过RandomString生成后8位数字,然后拼接满足需求的前三位数字组合。

RandomString函数非常强大,几乎可以实现接口单个请求参数的所有参数化工作,但在实际应用中,有时候不同请求参数有一定的关联性,此时无法通过RandomString来解决多请求参数之间的关联性问题,需要引入CSV组件来解决。
CSVRead函数
CSVRead函数适用于一组关联请求参数的场合,比如要选择用户的收获地址,往往需要选择省->市->区,而省市区这三个请求参数之间有关联性,此时可以通过自定义一组满足关联性要求的数据,将其写入CSV文件,然后在Jmeter中通过CSV函数来读取CSV文件。

Jmeter中通过函数助手可引入CSVRead函数的支持,它有两个参数:
• CSV File to get Values from: 需要读取的CSV文件
• CSV文件列号:从0开始

CSVRead函数有一些局限性,CSVRead不可指定编码,跨系统调用时可能出现乱码;另外多次循环同一个请求时会重复读取第一行数据,只有当线程数设置为多个时,才会读取多行数据。

4、从数据库获取

下面是从不同数据库连接JDBC 的方法

mysql数据库:在jmeter的lib/ext目录下添加mysql-connection-java-5.1.26-bin.jar包

sql server 数据库:下载sqljdbc4.jar 放到 jmeter根目录的lib目录下

oracle数据库:将oracle数据的安装目录下面的\product\10.2.0\db_1\jdbc\lib\ojdbc14.jar 放到jmeter根目录下的lib目录下

在线程组添加配置元件JDBC Connection Configuration,设置内容如下:

默认配置都不需要更改,Variable Name为连接名称,在后面的JDBC request中对应

在Database Connection Configuration中设置Database URL

Username和Password为数据库登录用户名和密码

不同数据库具体的填写方式,可以参考下面的表格(没有DB name可以不填):

在线程组添加配置元件JDBC Request

Variable Name和上面的对应

query中填写查询语句

Variable Names填写要获取的参数名,用逗号隔开

在线程组添加配置元件Debug Sampler可以查看数据库的取值结果

5、用户参数

设置方式:添加→前置处理器→用户参数,设置如下:

说明:search_keywords是参数名称,用户_1/用户_2/用户_3是参数的3个值。仅对于多线程时,每个线程会取其中一个值,若线程超过3个,则会重复取这3个值中的一个。若设置为1个线程,则此参数化方法无效。

五、断言

1、响应断言

在jmeter中最常用的断言方法是“响应断言”,它是通过检查sampler的请求内容和响应结果中是否匹配指定的字符串来判断结果是否正确。

Main sample only(仅作用于父节点取样器)
“要测试的响应字段”

指我们要进行断言的内容所在的位置,分为request和response两大块,根据实际情况选择即可(最常用的是响应文本)

测试字段常用的有响应文本(对响应结果进行断言)、响应头(对响应头文件进行断言)

“模式匹配规则”

控制上图中的“1”如何匹配“3”

"包括"--1包括3,支持正则; “匹配”--1完全匹配3,支持正则;

“Equals”--1完全匹配3中的文本内容,不支持正则,且大小写敏感;“Substring”--1包括3中的文本内容,不支持正则,且大小写敏感;

“否”、“或者”--跟前面四个选项结合使用,分别用于逻辑取反、取或。

模式匹配规则常用有包括(响应结果包括断言的内容),相等(响应结果和断言结果相同)

“要测试的模式”

这里填写我们要进行断言的内容,可以添加多个模式,可以使用变量、文本、正则表达式(在“包括”和“匹配”模式下)。

2、BeanShell断言

1、什么是BeanShell断言?

BeanShell断言可以使用beanshell脚本来执行断言检查,可以用于更复杂的个性化需求,使用更灵活,功能更强大,但是要能够熟练使用beanshell脚本。

2、如何使用BeanShell断言?

在这里除了可以使用beanshell的内置变量外,主要通过Failure和FailureMessage来设置断言结果。

Failure = false;-----表示断言成功,

FailureMessage = "……"; ----自定义的成功信息

Failure = true;-----表示断言失败,

FailureMessage = "……";-----自定义的失败信息。

下面看一个简单的示例:


String response = ""; String Str = "{\"errNo\":\"401\""; //预期结果,需要校验的字段 response = prev.getResponseDataAsString(); //获取当前请求响应结果 if(response == ""){ Failure = true; FailureMessage = "系统无响应,获取不到响应数据!"; log.info(FailureMessage); //对比数据库内容和响应内容,私用euqals方法判断是否一致 } else if(response.equals(Str) == false){ //把断言失败置为真 Failure = true; String Msg = "\n系统返回响应结果与期望结果不一致!请排查是性能问题,还是程序代码问题"; FailureMessage = Msg + "\n" + "期望结果:\n" + Str + "\n" + "响应内容: \n" + response +"\n"; log.info(FailureMessage); }

3、JSON断言

JSON断言也是测试工作中经常用到的一种断言方法,它只能针对响应结果是applicaton/json格式的请求进行断言

json断言,一般是断言某个字段值是否返回的是我们需要的,所以需要写JSON PATH(不会写的看本人另外一篇文章有介绍如何写),下图使用正则模式匹配返回的结果包含40就认为响应结果满足要求,断言配置和响应结果如下所示:

六、集合点(强事务才需要添加,例:秒杀场景)

1、添加集合点操作

集合点添加在请求前,Add>Timer>Synchronizing Timer
Number of Simulated Users to Groupby:每次释放的线程数量。如果设置为0,等同于设置为线程租中的线程数量。

Timeout in milliseconds:超时时间

如果设置为0,Timer将会等待线程数达到了“Number of Simultaneous Users toGroup”中设置的值才释放。如果大于0,那么如果超过Timeout inmilliseconds中设置的最大等待时间(毫秒为单位)后还没达到“Number of Simultaneous Users toGroup”中设置的值,Timer将不再等待,释放已到达的线程。默认为0

七、常用函数

通配符

”表示匹配任何元素节点。
“@
”表示匹配任何属性值。
多个不同路径

//input | //tr 表示寻找 所有的input标签和tr标签

特有语法

contains
//tr[contains(@id,’_’)] 表示寻找tr中id包含下划线的元素

and
//input[contains(@id,’roomCodesFilter’) and contains(@name,’roomCodes’)] 表示input中id包含roomCodesFilter且name包含roomCodes的元素

//input[@name=’roomCodesFilter’]/@value 表示input中name值为roomCodesFilter的value值

1、随机函数

举例:生成1-1000的随机数,可以通过${__Random(1,1000,key)}生成随机数,通过${key}可以获取这个随机数;

2、时间函数

${__time(,)} 1486091280955 //无格式化参数,返回当前毫秒时间,默认13位。一般用来做
时间戳
${__time(/1000,)} //为取10位的时间戳的函数表达式(时间精确到秒)
${__time(yyyyMMdd,)} 20151214 //返回年月日
${__time(HHmmss,)} 092816 //返回时分秒
${__time(yyyyMMddHHmmss,)} 20151214092816 //全
缺陷:只能得到固定时间

{__javaScript(new Date())} //返回当前标准时间。{__javaScript(new Date().valueOf(),)} //返回
当前毫秒时间,默认13位。
${__javaScript(new Date(“an 29 2016”.valueOf(),)} //获取 Jan 29 2016的毫秒
缺陷:不能同时运行多个表达式

${__Random(,,)}
${__Random(,,)}是一个随机数函数,用来生成随机数,使用中可以用来拼接 设置随机日期。此函
数一共有3个入参
第一:最小值
第二:最大值
第三:此变量的名称,可省略,如果要在别处引用,才需要设置。
缺陷:时间不可控,可用性较差

beanshell处理

JDBC Request


MySQL 获取当前日期及日期格式
获取系统日期: NOW()
格式化日期: DATE_FORMAT(date, format)
注: date:时间字段
format:日期格式
返回系统日期,输出 20091225
14:38:59
select now();
输出 091225
select date_format(now(),’y%
m%
d’;
根据format字符串格式化date值:
2017/2/6 jmeter ——时间处理 马
克飞象 专
为印象笔记打造的Markdown编辑器
https://maxiang.io/# 6/7
%S, %s 两位数字形式的秒( 00,01, … 59)
%I, %i 两位数字形式的分( 00,01, … 59)
%H 两位数字形式的小时,24 小时(00,01, … 23)
%h 两位数字形式的小时,12 小时(01,02, … 12)
%k 数字形式的小时,24 小时(0,1, … 23)
%l 数字形式的小时,12 小时(1, 2, … 12)
%T 24 小时的时间形式(hh:mm:ss)
%r 12 小时的时间形式(hh:mm:ss AM 或hh:mm:ss PM)
%p AM或PM
%W 一周中每一天的名称(Sunday, Monday, … Saturday)
%a 一周中每一天名称的缩写(Sun, Mon, … Sat)
%d 两位数字表示月中的天数(00, 01,… 31)
%e 数字形式表示月中的天数(1, 2, … 31)
%D 英文后缀表示月中的天数(1st, 2nd, 3rd,…)
%w 以数字形式表示周中的天数( 0 = Sunday, 1=Monday, … 6=Saturday)
%j 以三位数字表示年中的天数( 001, 002, … 366)
%U 周(0, 1, 52),其中Sunday 为周中的第一天
%u 周(0, 1, 52),其中Monday 为周中的第一天
%M 月名(January, February, … December)
%b 缩写的月名( January, February,…, December)
%m 两位数字表示的月份(01, 02, … 12)
%c 数字表示的月份(1, 2, …, 12)
%Y 四位数字表示的年份
%y 两位数字表示的年份
%% 直接值“”

3、线程间共享参数


加一个debug调试,打开jmeter property调试,运行一下,在查看结果树中看到,提取出来的结果以及被成功赋给了jmeter 属性:

在线程组B中添加一个用户定义变量,然后调用在线程组A中添加的内容 使用__P 函数来调用,然后用debug sample,显示到查看结果树上

Jmeter(自增长函数和嵌套函数)

自增长使用计数器来实现,路径:配置元件-计数器

说明:

①设置变量的初始值,即开始值

②递增值,即第2次在第1次的基础上递增多少,根据需求设置合理的值即可

③最大值,即递增的最大值,到达最大值后。又从初始值开始递增,如果需要的数据量较大的时候,建议这个值不要设置

④递增的数据格式,如:0001,002,0101等

⑤设置变量的引用名称,即其它用户引用时的名称

⑥全局参数,如果不勾选,每个线程的值都是独立的,不相同的。如果勾选,每个线程使用的值是相同的

⑦与6配合使用,每次线程组迭代一次,都会重置计数器的值

⑧定义的变量,在同一个线程组里都可以被引用

执行结果展示

嵌套使用--V函数实现,路径:函数助手--V函数

函数__V可以用于执行变量名表达式,并返回执行结果。它可以被用于执行嵌套函数引用

例如,如果存在变量A1、A2和N=1,则:

${A1}:能正常工作。

${A${N}}:无法正常工作(嵌套变量引用)。

${__V(A${N})}:可以正常工作。A${N}变为A1,函数 __V返回变量值A1

举例说明:

需求:

  1. 有一个变量num,值分别0001,0021,0031

  2. 另外一个变量test_

  3. 期望使用以上2个变量实现test_0001,test_0021等

说明:

  1. 根据执行结果来看,是否这样引用无法实现我们的需求

  2. 即变量里引用变量,暂时是不支持的

那么我们使用—V函数来看看

说明:

  1. ${_V(test${num})}:嵌套引用

执行结果

Jmeter实现引用数据库的值(自增实现)

基础配置

说明:

  1. 关于这部分的配置内容,请查看之前的文章,不在进行详细的说明

实现数据库的查询-单值引用

说明:

  1. 填写基础配置里的变量,保持一致即可,名称随意

  2. 查询类型选择:Select Statement

  3. 查询语句,根据实际需求填写

  4. 查询结果值引用变量,随意填写,能表达字段意思即可

执行查询动作

查询结果值引用

我们查询数据库的目的是为了引用查询的结果,即:testui

admin,Eva_208,Eva_208,Eva_208,Eva_208,Eva_208,Eva_208

说明:

1.引用变量的方法,变量名_数字。即:${author_1}

引用第2个变量

说明:

  1. 发现这样每次引用变量都要修改一下数字,不是很方便,有没有自动增长的引用方法呢?

引用值自增实现

1.定义自增长变量

说明:

①关于这个功能的使用,后面在介绍。先知道用这个可以实现变量自增长即可

  1. 引用变量嵌套实现

说明:

①${_V(author${num})},这里使用是V函数${__V()}

②其中author是数据库查询返回结果引用变量名

③${num}:自增长变量名引用

④最后实现的效果是:${author_N},N代表数字

⑤通过以上几部就可以实现返回结果的多值引用

  1. 引用变量,执行脚本,查看结果

说明:

①可以看到已经成功引用到数据库里的多个值

②同时增长的变量与值是想对应的

常用函数

函数调用的格式如下所示:
${__functionName(var1,var2,var3)}
其中,__functionName为函数名,括号内是函数的参数,无参数时可以不用括号,如${__UUID}

Tips:
如果参数包含逗号,那么一定要使用“\”来转义,否则JMeter会把它当作一个参数分隔符

实际使用时,可通过函数助手对话框选择函数,设置参数后,点击生成按钮生成函数字符串。

本文讲述常用的JMeter函数。

1
Jmeter常用函数1-10

一、__BeanShell:beanshell函数

1、它有两个参数,第一个参数是要执行的语句,可以是beanshell语句或者是文件地址,是必选参数;第二个参数是保存结果的变量名称,非必选参数。

2、Example:

${__BeanShell(123*456)}:返回56088

${__BeanShell(source("function.bsh"))}:会执行外部脚本function.bsh,并返回结果

${__BeanShell(import java.util.*;Properties props = System.getProperties();String osName = props.getProperty("os.name");if(osName.contains("Windows"))return 443;return 8443;)}:判断端口

3、与beanshell元件比较:

该函数与beanshell元件(beanshell sampler、beanshell preprocess等)作用是一样的,只是beanshell函数更常用于一些简单的判断或计算等,可以把少量的脚本放在函数中直接赋值给一个变量,而不用总是添加beanshell元件。

二、__regexFunction:正则表达式函数

1、该函数使用用户提供的正则表达式来解析前面的服务器响应(或者是某个变量值)。函数会返回一个有模板的字符串,其中携带有可变的值。

2、__regexFunction还可以被用来保存值,以便供后续使用。在函数的第6个参数中,测试人员可以指定一个引用名。在函数执行以后,测试人员可以使用用户定义值的语法来获取同样的值。例如,如果测试人员输入"refName"作为第6个参数,那么测试人员可以使用:

${refName}来引用第2个参数(Template for the replacement string)的计算结果,这依赖于函数的解析结果。

${refName_g0}来引用函数解析后发现的所有匹配结果。

${refName_g1}来引用函数解析后发现的第一个匹配组合。

${refName_g#}来引用函数解析后发现的第n个匹配组合。

${refName_matchNr}来引用函数总共发现的匹配组合数目。

具体参数描述如下:

其实这个函数的作用跟正则表达式提取器的作用是类似的。

三、__counter:计数器函数

1、每次调用计数器函数都会产生一个新值,从1开始每次加1。计数器既可以被配置成针对每个虚拟用户是独立的,也可以被配置成所有虚拟用户公用的。

2、如果每个虚拟用户的计数器是独立增长的,那么通常被用于记录测试计划运行了多少遍。全局计数器通常被用于记录发送了多少次请求。

3、计数器使用一个整数值来记录,允许的最大值为2,147,483,647。

4、目前计数器函数实例是独立实现的(JMeter 2.1.1及其以前版本,使用一个固定的线程变量来跟踪每个用户的计数器,因此多个计数器函数会操作同一个值)。全局计数器(FALSE)每个计数器实例都是独立维护的。

5、该函数也有对应的配置元件:计数器,功能类似。

四、__threadNum

函数__threadNum只是简单地返回当前线程的编号。线程编号不依赖于线程组,这就意味着从函数的角度看来,某个线程组的线程#1和另一个线程组的线程#1是没有区别的。另外,该函数没有参数。

这一函数不能用在任何配置元件中(如用户定义的变量),原因在于配置元件是由一个独立线程运行的。另外在测试计划(Test Plan)中使用也是没有意义的。所以,很少用。

五、__intSum:整数求和函数

1、函数__intSum可以被用来计算两个或者更多整数值的合。至少需要两个整数,如果指定变量名则名称中必须包含一个非数字字母,否则它会被当成另一个整数值,而被函数用于计算。

2、当有多个整数时点击添加按钮来增加参数,但是需要注意的是,添加完参数后,点击”生成”的函数默认是把手动添加的函数放在后面,这时需要手动调整变量名的位置,把它放到最后,否则会报错。

示例如下:

六、__longSum:长整型求和函数

该函数用来计算两个或更多长整型值的和,使用方法跟上面的__intSum函数一样。

七、__StringFromFile:读取文件中的字符串函数

1、该函数用来从文本文件中读取字符串。支持读取多个文件。

2、使用配置元件CSV Data Set Config ,也能达到相同的目的,而且方法更简单,但是它目前不支持多个输入文件。

3、每次调用函数,都会从文件中读取下一行。当到达文件末尾时,函数又会从文件开始处重新读取,直到最大循环次数。如果在一个测试脚本中对该函数有多次引用,那么每一次引用都会独立打开文件,即使文件名是相同的(如果函数读取的值,在脚本其他地方也有使用,那么就需要为每一次函数调用指定不同的变量名)。

4、如果在打开或者读取文件时发生错误,那么函数就会返回字符串"ERR"。

示例:
${_StringFromFile(demo.txt,,,)} 读取demo.txt
${_StringFromFile(PIN#'.'DAT,,1,2)} 读取demo1.txt, demo2.txt
${_StringFromFile(PIN.DAT,,,2)} 读取demo.txt两次

5、函数的第三个参数:初始的序列号,如果省略,那么结束序列号就代表文件的循环读取次数。

6、函数的第四个参数:结束序列号,如果省略,那么序列号会无限增长。

7、读取多个文件示例:

需要在文件名中使用序列号:当使用序列号时,文件名需要使用格式字符串java.text.DecimalFormat。当前的序列号会作为唯一的参数。如果不指明可选的初始序列号,就使用文件名作为起始值。一些有用的格式序列如下:

:插入数字,不从零开始,不包含空格。

000:插入数字,包含3个数字组合,不从零开始。

例如:

pin#'.'dat -> pin1.dat, ... pin9.dat, pin10.dat, ... pin9999.dat

pin000'.'dat -> pin001.dat ... pin099.dat ... pin999.dat ... pin9999.dat

pin'.'dat# -> pin.dat1, ... pin.dat9 ... pin.dat999

如果不希望某个格式字符被翻译,需要为它加上单引号。注意上面的"."是格式字符,必须被单引号所包含。

比如现在要同时读取两个文件,分别是PIN1.DAT, PIN2.DAT:

${_StringFromFile(PIN#'.'DAT,,1,2)}:同时读取 PIN1.DAT, PIN2.DAT。

${_StringFromFile(PIN.DAT,,,2)}:读取 PIN.DAT 两次。

${_StringFromFile(test#'.'txt,,1,2)}:同时读取test1.txt,test2.txt

八、__machineName

函数__machineName返回本机的主机名。

九、__javaScript

1、函数__javaScript可以用来执行JavaScript代码片段(非Java),并返回结果值。

2、JMeter的_javaScript函数会调用标准的JavaScript解释器,还可以直接调用jmeter的内置函数。

3、请记得为文本字符串添加必要的引号。另外,如果表达式中有逗号,请确保对其转义。例如,${__javaScript('${sp}'.slice(7,99999))},对7之后的逗号进行了转义。

十、__Random:随机数函数

函数__Random会返回指定最大值和最小值之间的随机数。

2
Jmeter常用函数11-24

十一、_RandomString():随机字符串函数

1、Random string length:随机字符的长度

2、Chars to use for random string generation:用来生成随机字符串的字符,可以是纯数字,纯字符,字符字母数字组合

3、Name of variable in which to store the result (optional):随机生成的字符被变量保存

4、${__RandomString(6,abcdefgh1234566,ranstr)},解释:随机生成一个6位长度的字符串被ranstr保存;

十二、__property

1、函数__property会返回一个JMeter属性的值。如果函数找不到属性值,而又没有提供默认值,则它会返回属性的名称。

2、例如,

${__property(user.dir)}:返回属性user.dir的值。

${__property(user.dir,UDIR)}:返回属性user.dir的值,并保存在变量UDIR中。

${__property(abcd,ABCD,atod)}:返回属性abcd的值 (如果属性没有定义,返回"atod"),并保存在变量ABCD 中。

${__property(abcd,,atod)}:返回属性abcd 的值(如果属性没有定义,返回"atod"),但是并不保存函数的返回值。

十三、_P

1、函数_P是一个简化版的属性函数,目的是使用在命令行中定义的属性。

2、不同于函数_property,本函数没有提供选项用于设置保存属性值的变量。另外,如果没有设置默认值,默认值自动设为1。

3、例如:定义属性值:

jmeter -Jgroup1.threads=7 -Jhostname1=www.realhost.edu

获取值如下:

${__P(group1.threads)}:返回属性group1.threads的值。

${__P(group1.loops)}:返回属性group1.loops 的值。

${__P(hostname,www.baidu.com)}:返回属性hostname的值,如果没有定义该属性则返回值www.baidu.com。

在上面的例子中,第一个函数调用返回7,第二个函数调用返回1,而最后一个函数调用返回www.baidu.com(除非这些属性在其他地方有定义)。

十四、__log

1、函数__log会记录一条日志,并返回函数的输入字符串。

2、OUT 和ERR的日志级别,将会分别导致输出记录到System.out和System.err中。在这种情况下,输出总是会被打印(它不依赖于当前的日志设置)。

例如:

${__log(Message)}:写入日志文件,形如"...thread Name : Message"。

${__log(Message,OUT)}:写到控制台窗口。

${__log(${VAR},,,VAR=)}:写入日志文件,形如"...thread Name VAR=value"。

十五、__split:字符串分割函数

1、函数__split会通过分隔符来拆分传递给它的字符串,并返回原始的字符串。如果分隔符紧挨在一起,那么函数就会以变量值的形式返回"?"。拆分出来的字符串,以变量${VAR_1}、{VAR_2}…以此类推的形式加以返回。

2、分隔符默认是逗号,如果你想要多此一举,明确指定使用逗号,需要对逗号转义,如“,”

3、例如,在测试计划中定义变量VAR="a||c|":

${__split(${VAR},VAR),|} :该函数调用会返回VAR变量的值,例如"a||c|",并设定VAR_n=4、VAR_1=a、VAR_2=?、VAR_3=c、VAR_4=?、VAR_5=null变量的值。

十六、__XPath

1、函数__XPath读取XML文件,并在文件中寻找与指定XPath相匹配的地方。每调用函数一次,就会返回下一个匹配项。到达文件末尾后,会从头开始。如果没有匹配的节点,那么函数会返回空字符串,另外,还会向JMeter日志文件写一条警告信息。

整个节点列表都会被保存在内存之中。

例如:

${__XPath(/path/to/build.xml, //target/@name)}

这会找到build.xml文件中的所有目标节点,并返回下一个name属性的内容。

十七、__setProperty

1、函数__setProperty用于设置JMeter属性的值。函数的默认返回值是空字符串,因此该函数可以被用在任何地方,只要对函数本身调用是正确的。

2、通过将函数可选的第3个参数设置为"true",函数就会返回属性的原始值。

3、属性对于JMeter是全局的,因此可以被用来在线程和线程组之间通信。

十八、__time

1、函数__time可以通过多种格式返回当前时间。

2、如果省略了格式字符串,那么函数会以毫秒的形式返回当前时间。其他情况下,当前时间会被转成简单日期格式。包含如下形式:

YMD = yyyyMMdd。

HMS = HHmmss。

YMDHMS = yyyyMMdd-HHmmss。

USER1 = JMeter属性time.USER1。

USER2 = JMeter属性time.USER2。

用户可以通过修改JMeter属性文件来改变默认格式,或者自定义格式,例如修改YMD格式: time.YMD=yyMMdd。

十九、__V

1、函数__V可以用于执行变量名表达式,并返回执行结果。它可以被用于执行嵌套函数引用(目前JMeter不支持)。

2、例如,如果存在变量A1、A2和N=1,则:

${A1}:能正常工作。

${A${N}}:无法正常工作(嵌套变量引用)。

${__V(A${N})}:可以正常工作。A${N}变为A1,函数 __V返回变量值A1。

二十、__evalVar

1、函数__evalVar可以用来执行保存在变量中的表达式,并返回执行结果。

如此一来,用户可以从文件中读取一行字符串,并处理字符串中引用的变量。

2、例如,假设变量"query"中包含有"select ${column} from ${table}",而 "column"和"table"中分别包含有"name"和"customers",那么${__evalVar(query)}将会执行"select name from customers"。

二十一、__eval

1、函数__eval可以用来执行一个字符串表达式,并返回执行结果。

如此一来,用户就可以对字符串(存储在变量中)中的变量和函数引用做出修改。

2、例如,给定变量name=Smith、column=age、table=birthdays、SQL=select ${column} from ${table} where name='${name}',那么通过${__eval(${SQL})},就能执行"select age from birthdays where name='Smith'"。这样一来,就可以与CSV数据集相互配合,例如,将SQL语句和值都定义在数据文件中。

二十二、__escapeHtml

1、函数__escapeHtml用于转义字符串中的字符(使用HTML实体)。支持HTML 4.0实体。

2、例如:

二十三、__unescapeHtml

1、函数__unescapeHtml用于反转义一个包含HTML实体的字符串,将其变为包含实际Unicode字符的字符串。支持HTML 4.0实体。

2、例如:

3、如果函数不认识某个实体,就会将实体保留下来,并一字不差地插入结果字符串中。例如,">&zzzz;x"会变为">&zzzz;x"。

二十四、__FileToString

1、函数__FileToString可以被用来读取整个文件。每次对该函数的调用,都会读取整个文件。

2、如果在打开或者读取文件时发生错误,那么函数就会返回字符串"ERR"。

"_csvRead"函数

  csvRead函数是从外部读取参数,csvRead函数可以从一个文件中读取多个参数。

  下面具体讲一下如何使用csvread函数:

  1.新建一个csv或者text文件,里面保存要读取的参数,每个参数间用逗号相隔。每行表示每一组参数,每列表示每种参数:

  比如:

  admin,123

  manager,456

  2.打开Jmeter的函数助手,选择csvread函数:

  其中:

  CSV file to get values from | *alias:要读取的文件路径,应该是绝对路径

  CSV文件列号| next| *alias:从第几列开始读取,注意第一列是0

  点击生成按钮,则生成了函数,为:${__CSVRead(D:\login.txt,1)}csvread就是从login.txt文件中读取第一列的参数。以此类推。

  3.将生成的参数拷贝到需要参数化的参数的值一项中,如果要修改要读取的参数的列,则可以直接在参数值中修改数字而不用重新在csvread函数生成中修改。

  4.jmeter执行的时候,如果有多个线程,顺序读取第一行的数字,如果线程组多余文件中的行数,则循环读取。

  5.利用该功能,可以实现不同参数需要不同参数值的问题,只需要在需要参数化的地方将生成的CSVRead函数字符串粘贴过去,然后修改表示第几列的数字就可以了。

  "_ StringFromFile"函数

  功能:这个函数是从一个文件中取到一个字符串,这个函数和LoadRunner中的File变量差不多,不过LoadRunner可以直接从数 据库中查询记录,自动生成文件,而Jmeter需要我们借助第三方工具生成文本作用:可以用来实现参数化http请求发送的参数,使得在Jmeter运行 时参数化了的参数在每个线程读取不同的内容。如果某个参数每次发送请求的时候不能重复才可以存储到数据库中,则用这个功能十分方便。

  使用:

  1.首先需要一个文本文件,可以手工生成,也可以通过数据库查询工具查出结果,然后拷贝到一个文本文件中。

  2.点击Jmeter的“选项”,选择“函数助手对话框”(或者使用快捷键“Ctrl+F”),在“选择一个功能”的下拉框中选择“_StringFromFile”

  3.设置“_StringFromFile”函数的值,具体如下:

    ● 输入文件的全路径:输入前面生成的文件的完整路径,即文件路径+文件名.扩展名(文件路径可以写成相对路径或绝对路径,默认读取位置为/bin下)

    ● 函数名称:输入某个名称,用于存储在测试计划中其他的方式使用的值。

    ● 文件开始结束序号:第三,第四个参数是文件开始的序号,也就是文件读取的其起始行数。第四个参数是文件的结束序号,也就是要读取文件的最后行。假如咱们生 成的文本文件有200行,如果开始序号设置成50,结束行设置成150,那么这个函数会按顺序从第50行,一直读取到150行,如果测试的循环次数超过了 文件行数,比如循环了102次,那么最后一次循环读取的文件内容和第一次的一样,函数会自动循环读取。文件的起始序号和结束序号也可以不用设置,这样函数 会从第一行读取到最后一行,然后再循环读取。

  4.注意:该函数每次读取文件中的一行,如果线程组中有多个线程,则每个线程顺序读取一行,如果有多次循环,则每次循环顺序读取一行。

  "_Random"函数

  功能:这个函数是从某个数字段随机读取数据替换参数,可以利用在测试需要添加多条数据记录而且某些字段需要唯一性的测试脚本中,随机生成的参数是数字

  作用:可以用来实现参数化http请求发送的参数,使得在Jmeter运行时参数化了的参数在每个线程去不同的随机数。如果某个参数每次发送请求的时候不能重复才可以存储到数据库中,则用这个功能十分方便。

  使用:

  1.点击Jmeter的“选项”,选择“函数助手对话框”(或者使用快捷键“Ctrl+F”),在“选择一个功能”的下拉框中选择“_Random”。

  2.配置“_Random”函数,第一个参数是“一个范围内的最小值”,即所要取的随机数的最小值,我们设置成1;第二个参数是“一个范围内的 最大值”,即所要取的随机数的最大值,我们设置成100;第三个参数是“函数名称”,即用于存储在测试计划中其他的方式使用的值,我们设置成 Random。设置好上面的三个参数后,点击“生成”按钮,这样就会在对话框的最下面生成一个字符串 “${__Random(1,100,Random)}”,在我们编写的脚本中,找到要替换的参数,把它的值换成前面生成的字符串就可以了,然后每次运行 的时候,这个参数会变成一个1到100之间的随机数。

  "_counter"函数

  功能:这个函数是一个计数器,用于统计函数的使用次数,它从1开始,每调用这个函数一次它就会自动加1,它有两个参数,第一个参数是布尔型的, 只能设置成“TRUE”或者“FALSE”,如果是TRUE,那么每个用户有自己的计数器,可以用于统计每个线程歌执行了多少次。如果是FALSE,那就 使用全局计数器,可以统计出这次测试共运行了多少次。第二个参数是“函数名称”

  格式:${__counter(FALSE,test)}

  使用:我们将“_counter”函数生成的参数复制到某个参数下面,如果为TRUE格式,则每个线程各自统计,最大数为循环数,如果为FALSE,则所有线程一起统计,最大数为线程数乘以循环数

  "_time”函数

  功能:Jmeter运行时取当前时间到变量,利用该功能,可以将某个参数增加time函数,然后用该参数作为查询条件查询,然后以该参数作为断 言,这样可以使得断言更精确,因为时间实时变化的,使用该方法,需要注意的是,要先添加一个全局的用户参数,具体在断言操作中有描述。

  格式:${__time(MMddmmss,TEST)}

  使用:添加jmeter的time函数,选择选项——函数助手,然后选择__time函数

  在“ormat string for SimpleDateFormat (optional)”中输入值“MMddhhmmss”,表示取月日时分秒。

  然后,点击生成,则生成了time参数。

  "_intSum”函数

  功能:用于计算多个整数的和,可以是计算正整数和负整数的和,它有N个参数,最少有3个参数,最多不限。最后一个参数是函数名称,前面的其它参 数是要求和的整数。这个函数在函数对话框中只显示3个参数,如果要计算多个整数,可以通过添加参数实现,不过最后一个参数一定要是函数名称。再添加的参数 会在函数名称后面,这个时候,需要我们手动将函数名称参数放到最后一个。

  格式:${__intSum(1,100,test)}

Jmeter消息类的功能
${__threadNum} :得到testplan的线程数
${__machineName} :得到主机名字
${__time(EEE, d MMM yyyy)} :返回一定格式的时间信息 。${__log(Message)}:写入log文件”…thread Name : Message” 。${__log(Message,OUT)}:输出到命令行。${__log(${VAR},,,VAR=)} :以 “…thread Name VAR=value”形式输出到log文件。

Jmeter输入类的功能
这里Jason只介绍下${__XPath(File,//XX/XX/@XX)} :XPath方式读了File文件的相应属性.

Jmeter计算类的功能
${__counter(X)} :自增函数,X(true/false)来控制是否分配线程来增加.
${__Random(X,Y,Z)} :随机函数,X为最小值,Y为最大值,Z为存储的变量名.

Jmeter的Properties文件使用的功能类
之前Jason在Jmeter的P函数及properties文件介绍了相关的内容.

Jmeter的变量操作类的功能
${__split(X,Y,Z)} :用来分割变量用的,X为需要分割的变量或者String,Y为存储的变量名,Z为分割符.
${__V} :的使用主要来源于变量中含变量的情况 eg. ${A${N}} 可以用${__V(A${N})} 来显示成功.
${__eval} :主要用在对SQL的处理上,具体使用看下面的例子:

  • name=Smith * column=age * table=birthdays * SQL=select ${column} from ${table} where name=’${name}’
    用${__eval(${SQL})}可以得到”select age from birthdays where name=’Smith’”.

Jmeter的String操作类的功能
${__regexFunction} :对前一个响应进行正则规约提取.具体参考这里.
${__char},${__unescape},${__unescapeHtml},${__escapeHtml} :主要用来对字符的编码格式的转换的.

Jmeter的脚本操作类的功能
${__javaScript(X,Y)} :主要是使用Javascript来做一些简单的操作.例如计算和字符处理等等.
eg. ${__javaScript(‘${sp}’.slice(7,99999))}
${__BeanShell(X)} :主要是利用BeanShell来实现一些具体的功能,BeanShell具体我们可以参考BeanShell.
复制代码

八、取样器

1、HTTP 请求

2、BeanShell Sampler

获取32位的UUID
String id = UUID.randomUUID().toString();
String id2 = id.replaceAll("-","");
vars.put("uuid",id2);
String getId=vars.get("uuid");
log.info("取到的uuid===="+getId);

3、Debug Sampler调试取样器

只看到jmeter变量,查看各个变量的值是否正确

4、jmeter操作jdbc

核心字段含义
Variable Name for created pool:表示该连接配置的名称,这个名称将会在后续的jdbc请求中使用
Dabase URL:表示数据库实例的连接地址
JDBC Driver class:表示连接驱动类
Username:表示连接数据库实例的用户名
Password:表示连接数据库实例的密码

当进行增、删、改语句时,都是选择QueryType为Update Statement(Prepared Update Statement)

1.sql返回的值

写查询语句,最后不需要带;

核心字段含义
Variable Name of Pool declared in JDBC Connect Configuration:表示要连接的数据库配置名称,与我们上面配置的一致
Query:填写sql语句,这里我们是查询商品表,通过name字段模糊查询,并且只返回了name字段
Result variable name:表示从数据库中查到的内容存到哪个变量里,这里写变量名称
variable的设置要与sql字段一致,以逗号分开
其执行结果是一个两行三列的数据。那么三列(id,hotelname,NoOfRooms)分别对应为:a,b,c。如果想得到hotelname列的第二条数据,则变量值为:b_2。如果想得到NoOfRooms列的第一条数据,则变量值为:c_1。想得到x列第y条数据,其变量值为:x_y。

调用的时候格式为${x_y}。

说明:

① 选择查询类型:Prepared Select Statement

② 写查询语句

③ 填写预编译的值

④ 填写预变量值的类型

5、dubbo取样器

压测dubbo接口
https://www.cnblogs.com/qmfsun/p/10281679.html

6、FTP取样器

1、上传FTP文件

新建Jmeter脚本,在线程组下添加FTP请求,在其中填写:
• FTP服务器IP
• 上传的远程文件路径
• 上传的本地文件路径
• FTP请求模式:此处必须选择PUT,PUT代表上传,GET代表下载
• FTP服务器的登录信息

2、下载FTP文件

下载文件也通过Jmeter内置的FTP Sampler来实现,此时的信息和上传信息几乎一致,除了FTP请求模式需要用POST变更为GET


运行脚本,查看结果树中会显示上传下载信息,并且可以在本地和FTP服务器上看到更新后的文件信息。Jmeter可以上传新的文件,也可以覆盖旧有文件;除了可以上传下载文本文件以外,还可以上传下载视频,音频等文件。

7、SMTP取样器

Jmeter SMTP Sampler可以实现基本的邮件发送功能,它可以发送带附件的文本内容,但是不支持HTML格式的邮件发送。新建脚本->线程组->SMTP Sampler,在其中填写如下信息即可实现邮件发送:
• SMTP服务器和连接信息
• 收件人信息
• 邮件信息(邮件头,邮件体,携带附件)

运行脚本后查收邮箱,能够看到Jmeter发送的邮件信息:

8、Mail Reader Sampler

Mail Reader Sampler接收邮件
Jmeter Mail Reader Sampler用于接收邮件,它支持多种邮件接收协议,按如下所示信息填写即可模拟客户端接受邮件信息:

运行脚本,通过查看结果树即可看到邮件详情

9、websocket协议测试

10.送并行请求( Parallel HTTP Requests)

在并行请求中,可以同时发送很多个sampler(get请求)。结果树中会自动加载所有静态资源。
一、添加线程组
添加线程组等其他元件

  1. 添加线程组,Jmeter执行是通过线程组进行驱动的,测试计划必须最少有一个线程组,选中Test Plan,点击右键,添加》Threads》线程组

  2. 添加CSV 数据文件设置元件,该元件可用来参数化,点击右键》添加》配置元件》CSV 数据文件设置

  3. 添加用户定义的变量,该变量可在整个线程中进行调用

二、依次添加如下请求

  1. 添加创建连接请求-选中线程组,点击右键,添加》Sampler》WebSocket Open Connection

  2. 该请求的作用是和websocket接口创建连接,供其他接口连接,然后发送请求给服务器,配置如下:

  3. 添加发送请求-选中线程组,点击右键,添加》Sampler》WebSocket request-response Sampler

  4. 该请求的作用是发送请求给服务器,服务器对发送的请求进行处理,配置如下

  5. 添加读取请求-选中线程组,点击右键,添加》Sampler》WebSocket Single Read Sampler

  6. 该请求的作用是读取系统返回的请求,要根据开发的代码进行设置循环,比如开发代码是发送一个request-response Sampler请求,系统返回1000次请求,就需要设置循环次数为1000进行性能测试,如果只是针对接口进行自动化测试,设置1次即可,配置如下:

  7. 添加断言,判断响应信息中是否包含{'dataType':'testResponse','msg':'返回信息,选中该WebSocket请求,点击右键,添加》断言》响应断言,输入预期结果

  8. 循环控制器添加步骤,点击右键,添加》逻辑控制器》循环控制器

  9. 添加关闭请求-选中线程组,点击右键,添加》Sampler》WebSocket Close

  10. 该请求用来关闭已经连接的websocket接口,配置如下

五、前置处理器

1、BeanShell PreProcessor

六、后置处理器

1、BeanShell PostProcessor

1)将参数值写入文件

import java.io.FileWriter;
import java.io.IOException;
String sessionid = vars.get("sessionID");
log.info(sessionid);
String fileName = "F:\sessionidlist-clue.txt";
FileWriter fw = new FileWriter(fileName, true);
fw.write(sessionid);
fw.write("\r\n");
fw.close();

2、 Debug PostProcessor

除了可以看到jmeter变量,还可以看到配置信息,最好放在正则表达式提取器后面,否则看不到提取的结果

逻辑控制器

1、事务控制器

2、ForEach控制器

选项说明:

① 需要循环遍历名称(name)

② 循环变量的下标起点(name_0)

③ 循环变量的下标终点(name_4)

④ 引用变量名称定义

⑤ 在变量后加_(name_)

实现逻辑说明:

① 就是分别循环取name_0到name_4变量对应的值

② 然后通过引用变量test实现值的传递

示例:

  1. 用户变量定义

说明:

① 下标的起始值是从0开始的

② 下标的终止值是(n-1)

3.Java调试

执行结果分析

说明:

① 通过结果可以知道,同一个请求,执行了4次。分别使用不同的值

Runtime Controller(控制器)

组件使用说明

说明:

① 用于控制runtime controller控制器下的组件的执行时长

② Runtime(seconds)单位为秒

③ Runtime(seconds)值为0时,下面的组件不执行

示例

1.线程及用户变量配置

2.Runtime Controller配置

说明:

① 配置为6秒

3.Java调试

  1. 执行结果分析

说明:

① 执行耗时为6秒

② 在6秒的时间内,其下的组件执行多次

3、仅一次控制器

4、if控制器

正常表达式填写,需要去掉选项“Interpret Condition as Variable Expression”

Switch Controller(控制器)

Switch Controller 条件控制器,和高级语言Java中的Switch逻辑控制语句使用原理相同,当我们业务流程有多个分支时,我们只执行满足场景的请求及组合,用接口自动化应该怎么来实现呢?

要实现以上的需求,可以使用Switch Controller控制器,下面介绍具体的使用方法

说明:

① Swith value:其控制下元件的匹配值

示例:

  1. 用户变量

  1. Swith Controller配置

说明:

① 执行指标为3的请求

② Switch Controller 下的请求编号是从0开始的计算的,不是从1开始的,这点需特别注意

说明:

① 预期是执行test-4,结果是40。查看执行结果是否匹配

3.执行结果分析

说明:

① 实际结果与预期结果一致

While Controller(控制器)

组件使用说明

① While Controller会一直运行,直到条件(Condition)为false

② Condition的可能值如下:

③ 为空(不输入任何值) -- 直到某次sample执行失败才会退出循环

④ LAST -- 直到最后一个sample请求失败,才会退出循环

⑤ 其它 -- 条件值等同于字符串"false"(等同于输入框中输入false)时,退出循环

示例:

  1. 用户变量定义

  2. While Controller配置

说明:

① Condition为空,直到其组件下的请求有失败的,则退出

3.java调试

4.执行结果分析

说明:

没有失败的请求时,其下的组件会一直执行

Interleave Controller(控制器)

组件使用说明

说明:

① 忽略子控制模块:如果勾选,则嵌套子模块失效。如果不勾选,则子模块控制逻辑生效

② 用途:该组件的请求交换执行

示例:

  1. 线程组配置

说明:

① 一个线程执行3次

  1. 用户自定义变量

  2. Interleave Controller配置

  1. 执行结果分析

说明:

从结果可以看到,交换控制器的请求执行了3次,每次执行的请求都不同

Once Only Controller(控制器)

原理:此控制器下的组件只会运行一次,如把登陆放到该组件下

示例:

  1. 线程组配置

说明:

① 一个线程,循环3次

2.用户变量定义

3.once only controller

4.执行结果分析

说明:

① 可以看到仅一次控制器下的组件,执行了一次。和预期相符

If Controller(控制器)

原理:通过条件来判断该组件的请求是否执行,满足条件就执行,即返回True。不满足条件就不执行

说明:

① 输入判断条件,可以填写变量

② interpret conditon as Variable Expression?:勾选此项时,使用表达式判断。如:

示例:

  1. 线程配置

  2. 用户变量定义

  3. if controller配置

说明:

① 表达式做为判断条件

说明:

① 变量做为判断条件

  1. 执行结果分析

说明:

判断条件为True,该组件下的请求被执行

七、运行脚本

压测时注意点:
1、使用非GUI模式即命令行模式执行;
2、使用CSV输出;
3、只保存需要的数据,避免过多日志写入影响测试结果;
4、如果测试需要大量数据,尤其是需要将其随机化,可以提前准备好测试数据放到数据文件中,从CSV数据集中读取, 这样可以避免在运行时浪费资源
单机资源不够时,使用linux分布式压测。

八、报告生成

1、察看结果树

一、先看左侧的结果列表

1、通常我们会说执行成功的请求在左侧会显示绿色,执行失败会显示红色。

2、其实,当我们没有加断言时,显示绿色并不一定就是成功了,只代表响应码是200或300系列,显示红色说明响应码是400或500系列。所以要想确定请求返回的是正确的,必须要加上断言,只有断言成功才会显示绿色。

3、在左侧最下面有一个复选框Scroll automotically?勾选后,当请求很多时,滚动条会自动向下滚动。

二、再看右侧的“取样器结果”

1、这里显示了很多信息,分别是如下意思:

Thread Name: 线程组名称

Sample Start: 启动开始时间

Load time: 加载时长,这个时间是我们测试常用的时间,也是整个请求的消耗时间,从发送到接收完成全程消耗的时间

Latency: 等待时长,不常用,表示从请求发送到刚开始接收响应时的时间

Size in bytes: 发送的数据总大小

Headers size in bytes: 发送头大小

Body size in bytes: 发送数据的其余部分大小

Sample Count: 发送请求数统计

Error Count: 交互错误统计

Response code: 返回码

Response message: 返回信息

Response headers: 返回的头部信息

HTTPSampleResult:其它附加的请求信息

2、Raw和Parsed

默认情况下我们看到的是raw状态的数据,也可以点击下面的标签切换到Parsed状态,可以看的更直观一点。

3、取样器结果数据项的配置

点击右侧的Configure,会弹出配置框,在这里可以根据自己的需要选择想要在“取样器结果”、“请求”和“响应数据”中展示的数据,默认是全选的,我们可以自由配置。

三、下面看“请求”选项卡

1、请求中会显示请求的url、参数、请求头、cookies等详细信息。

2、选择请求的显示格式

通过左侧的下拉框可以选择请求显示的格式,默认是text,常用的有json、xml等

3、Raw和HTTP

同样的,这里也可以从默认的raw格式切换成HTTP格式方便查看。

在这里可以通过下面的Search一行进行内容的搜索,直接在文本框中输入内容,点击Find在当前请求中搜索,还可以设置Case sensitive大小写敏感、Regular正则表达式。

四、“响应数据”选项卡

1、这里是服务器的响应结果数据,这里的内容很重要,我们调脚本时一定要时刻关注。

2、同“请求”一样,也可以通过左侧的下拉框来设置响应的数据显示方式。

3、通过下面的Search行可以进行对当前请求的内容搜索。

五、上半部分

刚才介绍的都是下半部分,下面我们来看看上半部分。

1、Search行

你有没有注意到,这里也有一行Search选项,这里跟刚才说的下面的Search选项有什么区别呢?

一个作用于全部请求,一个作用于当前的单个请求。

这里的Search是在所有请求结果中进行查找,下面的Search只能在当前的请求中进行查找。

2、文件名

在这里可以设置文件名,把结果写入文件中保存起来。也可以把之前生成的jtl结果文件导入进来查看。

3、筛选请求显示结果

选中右侧的“仅日志错误”,可以只查看错误的请求结果。选中“Successes”可以只查看成功的请求结果。

2、聚合报告

Label:每个请求的名称

Samples:各请求发出的数量

Average:平均响应时间(单位:毫秒)。默认是单个Request的平均响应时间,当使用了Transaction Controller时,也可以以Transaction为单位显示平均响应时间

Median:中位数,50%用户的响应时间在小于该值,注意它与average平均响应时间的区别;

90%Line:90%用户的响应时间小于该值

95%Line:95%用户的响应时间小于该值

99%Line:99%用户的响应时间小于该值

Min:最小响应时间

Max:最大响应时间

Error%:请求的错误率 = 错误请求的数量/请求的总数

Throughput:吞吐量。默认情况下表示每秒完成的请求数,一般认为它为TPS。(注意单位的变化,如上图中,当TPS很低时,jmeter中默认会统计成每分钟的值,这时我们需要换算成以秒为单位)

KB/sec:每秒从服务器端接收到的数据量。

3、HTML报告

Latency time = 接收到响应的第一个字节的时间点 - 请求开始发送的时间点
响应时间(JMeter术语中的Elapsed time) = 接收完所有响应内容的时间点 - 请求开始发送的时间点

多维度报告解读

Jmeter版本

生成多维度报告

脚本准备

请提前准备好要执行的脚本。类似:xxxxxx.jmx以jmx结尾的脚本

脚本执行及命令解析

jmeter -n -t -l -e -o

命令参数解析:

-n :以非GUI形式运行Jmeter

-t :source.jmx 脚本路径

-l :result.jtl 运行结果保存路径(.jtl),此文件必须不存在

-e :在脚本运行结束后生成html报告

-o :用于存放html报告的目录,此文件夹必须为空或者不存在

执行命令:

jmeter -n -t E:\StressTesting\Ideasauto.jmx -l

report1.jtl -e -o E:\StressTesting\report3

说明:

① E:\StressTesting\Ideasauto.jmx:脚本的绝对路径

② E:\StressTesting\report3:报告保存路径

知识扩展:

jmeter -n -t C:\Users\zhoulinjie\Desktop\cnblgo.jmx -Jconcurrent_number=50 -Jduration=120 -Jcycles=-1

说明:

① 以50并发数执行120s的命令行如下,可知执行次数=-1时即表示Forever

执行结果截图

说明:

① D:\apache-jmeter-3.2\bin>:jmeter的安装路径,并进入到bin目录下执行命令

② 下面是显示详细的执行过程

报告生成目录

Dashboard解读

Test and Report informations

说明:

① 测试结果保存文件

② 测试开始时间

③ 测试结束时间

④ 展示过滤器

APDEX (Application Performance Index)

Apdex 标准从用户的角度出发,将对应用响应时间的表现,转为用户对于应用性能的可量化为范围为 0-1 的满意度评价。
Apdex(Application Performance Index)是一个国际通用标准,Apdex 是用户对应用性能满意度的量化值。它提供了一个统一的测量和报告用户体验的方法,把最终用户的体验和应用性能作为一个完整的指标进行统一度量。下图表示为通用用户满意度区域,0代表没有满意用户,1则代表所有用户都满意。实际业务系统开发过程中,1是团队的追求目标。
若所有请求的Apdex值都接近1,说明用户满意度优秀,也从侧面说明了服务器响应速度快。通常而言,最低要求超过0.5,当然项目组可设定具体需求。

说明:

① APDEX (应用性能指标),应用程序性能满意度的标准,范围在 0-1之间,1表示达到所有用户均满意

② Apdex:应用程序性能指标(0~1),1表示所有用户请求均满意,反之0则表示均不满意

③ T(Toleration threshold):可接受(容忍或满意)阈值,即用户可接受的响应时间

④ F(Frustration threshold):不可接受(失败)阈值,即用户不可接受响应时间

⑤ Lable:采样器名称

Requests Summary

说明:

① 请求的通过率(OK)

② 请求失败率(KO)

③ 百分比显示

④ 成功与失败的请求占比

Statistics

说明:

① 单位为ms

② 失败率统计

③ 错误数统计

④ 平均响应时间统计,不同数量的统计(99%,95%,90%)

⑤ 吞吐量统计

Errors

说明:

① 错误情况:根据不同的错误类型,展示错误结果

Top 5 Errors by sampler

说明:

① Top5错误信息采样及展示

Charts解读.Over Time

说明:

① 包括以下3个维度

② Over Time

③ Throughput

④ Response Times

Test and Report informations

说明:

① 测试结果保存文件

② 测试开始时间

③ 测试结束时间

④ 展示过滤器

Response Times Over Time

说明:

① 脚本执行时间内,各请求的响应时间分布图

② 响应时间随时间变化趋势。由于应用需要初始化建立连接以及CPU、内存等分配都会消耗资源,随着系统趋于稳定,响应时间也会趋于稳定

Response Time Percentiles Over Time (successful responses)

说明:

① 脚本执行时间内响应成功的请求分布

② 响应时间的百分比分布

说明:

① 脚本执行时间内,活跃的线程数量分布

Bytes Throughput Over Time

说明:

① 脚本执行时间内的吞吐量分布图

② 单位是byte

Latencies Over Time

说明:

① 脚本执行时间内毫秒级的响应请求分布

② 记录的是客户端发送请求完成后,服务器端返回请求之前的这段时间

Connect Time Over Time

说明:

① 脚本执行时间内平均连接时间分布图

② 随着时间变化,每个时间节点花费在连接上的平均时间

Throughput

Hits Per Second (excluding embedded resources)

说明:

① 每秒点击数分布图

Codes Per Second (excluding embedded resources)
uploading-image-313827.png

说明:

① 每秒状态码分布图

Transactions Per Second

说明:

① 每秒事务数分布图,即TPS

Response Time Vs Request

说明:

① 响应时间与每秒请求数关系分布图

Latency Vs Request

说明:

① 延迟时间与每秒请求数关系分布图

Response Times

Response Time Percentiles

说明:

① 毫秒级响应时间分布图

Response Time Overview

说明:

① 响应时间柱状分布图

Time Vs Threads

说明:

① 活动线程与平均响应时间变化曲线

Response Time Distribution

说明:

① 响应时间分布图

posted on 2021-12-07 09:59  seamy  阅读(388)  评论(0编辑  收藏  举报