1、后置处理器
1.1 Result Status Action Handler:
这个后置处理器允许用户在相关的请求(取样器)失败时,停止线程或停止测试等多种方式。
在取样器错误后要执行的动作有:
(1)Continue:继续,忽略错误继续执行测试
(2)Start Next Thread Loop:不执行发生错误的后续请求,重新启动下个迭代的请求
(3)Stop Thread:停止线程,退出当前正在执行的线程
(4)Stop Test:在当前请求执行完成后停止测试执行
(5)Stop Test Now:直接停止整个测试执行,可能打断正在执行的请求
1.2 正则表达式提取器
允许用户从服务器的响应中通过使用perl的正则表达式提取值。作为一个后置处理器,该元素会作用在指定范围的取样器,应用正则表达式,提取所需要的值,生成模板字符串,并将结果存储到给定的变量名中。
在此简单地向大家介绍一下常用的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] 更多的内容可参考:
一般情况下,jmeter的正则表达式语法与perl5的语法相同,但它们之间有一个重要的区别,在perl中你必须使用“//”作为分组符来指定正则表达式,如:~/正则表达式/,此种表达方式Jmeter不支持,它会直接作为字符进行解析,在Jmeter中使用“()”作为分组符。
Apply to选项的含义:
(1)Main sample only:仅作用于父节点取样器 、
(2)Sub-sample only:仅作用于子节点的取样器
(3)Main sample and Sub-sample:作用于父节点的取样器及对应子节点的取样器
(4)jmeter variable:作用于指定命名的取样器(todo)
Response Field to check选项的含义:
(1)Body:主体,响应的主体内容,一个网页页面的内容,除了信息头以外的内容
(2)Body(unescaped):主体,响应的主体内容且替换了所有的html转义符,注意html转义符处理时不考虑上下文,因此可能有不正确的转换,不太建议使用
(3)Body as a Document:从不同类型的文件中提取文本,注意这个选项比较影响性能
(4)Headers:信息头,非HTTP的请求可能不存在信息头,仅对HTTP请求有作用
(5)URL
(6)Response code:如200、403等
(7)Response Message:如OK等
下图所示这部分的值填写,也都有其不同的含义:
(1)Reference Name:引用名称,Jmeter变量的名称,存储提取的结果,每个存储组需要使用共结果时,应使用:[refname]_g#,其中[refname]是你输入的名字,#是组号,0是整个匹配结果,而1是指第一组匹配值
(2)Regular Expression:正则表达式,使用正则表达式解析响应结果,须包含 “()”去提取字符串中的部分值,请不要使用“||”,除非你本身需要匹配这个字符
(3)Template:模板,用来从匹配的结果中创建一个字符串,这是通过正则表达式匹配出来的一组值,语法为:$1$指代第一组,$2$指代第二组,$0$指代整个匹配结果
(4)Match No.:匹配数字,指明哪一个匹配结果值将被使用,正则表达式一般会有多个匹配结果。使用:0,表示Jmeter任选一个匹配值,使用:正整数N,表示Jmeter选择第N个值进行匹配,使用负数表示选取所有的值,一般与ForEach控制器配合使用
(5)Default Value:缺省值,如果正则表达式没有匹配到数据,引用变量将会返回一个默认值,在调试中此功能很有用,如果没有设置默认值,那么很难分辨出正则表达式是否有匹配到数据或使用是否正确,当然你也可以根据你的测试需求,在调试完成后去掉默认值的设置。
以下介绍几个从网上找来的例子:
(1)找到所有小数的数字,比如10.2
引用名称:aa
正则表达式:([0-9]+\.[0-9]+)
模板:$0$ 区配数字: -1 调用:
${aa_1}:取出第一个满足要求的数字
${aa_2}:取出第二个满足要求的数字
(2)找到所有小数点后的数字
引用名称:aa
正则表达式:([0-9]+)\.([0-9]+),必须用括号分组
模板:$2$(第二组)
区配数字: -1 取出所有符合要求的 调用:
${aa_1}:取出第一个满足要求的数字
${aa_2}:取出第二个满足要求的数字
(3)找到第一个有小数的数字
引用名称:aa
正则表达式:([0-9]+)\.([0-9]+),必须用括号分组
模板:不写可以,也可以$2$$1$
区配数字: 1(第一个) 调用:
${aa_g1}:取出满足要求的第一组数字
${aa_g2}:取出满足要求的第二组数字
(4)找到所有小数的数字
引用名称:aa
正则表达式:([0-9]+)\.([0-9]+),必须用括号分组
模板:不写可以,也可以$2$$1$
区配数字: -1 取出所有符合要求的 调用:
${aa_1_g1}:取出第一个满足要求的第一组数字
${aa_1_g2}:取出第一个满足要求的第二组数字
${aa_2_g1}:取出第一个满足要求的第一组数字
${aa_2_g2}:取出第一个满足要求的第二组数字
2、Sampler
2.1 HTTP请求
http请求取样器可以发送一个http/https的请求给web服务器,可以通过配置控制是否
需要jmeter解析html文件中的图片和其它内嵌资源,并发送http请求下载这些资源,如下类型的内嵌资源可以被检索:
(1)image
(2)applets
(3)stylesheets
(4)external scripts
(5)frames、iframes
(6)background images (body、 table、TD、TR)
(7)background sound
如果需要更换htmlparser的类,修改jmeter.properties的值即可。当你需要发送多个请求到同一个web服务器时,可以考虑使用HTTP Request Defaults Configuration(HTTP请求默认值)配置元件,这样你就可以不必为每个http请求都写入相同的信息,或者,你也可以使用http proxy服务器来录制发送的http请求,这样当你在创建很多http请求时能够很大程度上节省你的时间。
HTTP请求有一个下拉框可以选择http协议的实现,目前可设置4个选项:
(1)Java:由jvm提供,与HTTPClient相比有一定的局限性,如无法控制连接如何重用,当一个连接被jmeter释放后不一定能够重新被同一个线程使用,且目前存在bug,具体可自行搜索
(2)HTTPClient3.1:使用Apache Commons HttpClient 3.1,这个版本目前已不再开发,未来的jmeter版本会丢弃这个版本
(3)HTTPClient4:使用Apache HttpComponents HttpClient 4.x
(4)空白:即不设置任何选项,会默认读取jmeter.properties文件中设置的jmeter.httpsampler的值,目前默认使用HttpClient4
对于普通登录,例如你需要在一个表单可输入登录名和密码时,你需要先了解表单的按钮提交时会如何处理,然后再创建一个http请求选择method为post(通常情况),并构造表单可要求的正确参数一并提交。如果页面使用http协议,你还可以使用jmeter的proxy代理去捕捉登录时发起的请求参数。
如果请求需要cookies,那么可以添加一个http cookie管理器,只要添加到线程组中即可使用,这个cookie管理器,所有的http请求均可共享使用。
Jmeter默认的SSL协议是使用TLS,如果服务器需要不同的如SSLv3,那么可以修改https.default.protocol=SSLv3的,jmeter可以使用其它额外的协议,可以直接修改https.socket.protocols属性值。
如果你的请求需要cookies,那么你可以添加一个http cookie管理器,只要添加到线程组中即可使用,这个cookie管理器,所有的http请求均可共享使用。
Server Name or IP:web服务器的域名或ip地址,如www.google.com,不需要加上http://前缀
Port:web服务器监听请求的端口号,默认是80端口
Connect Timeout:连接超时时间,即等待连接打开的毫秒数。当HTTP请求中implementation选择java时,需要java1.5或以上版本
Response Timeout:响应超时时间,即等待服务器返回响应的毫秒数。当HTTP请求中implementation选择java时,需要java1.5或以上版本
Implementation:3个选项java、HttpClient3.1、HttpClient4,如果此处没有指定,则默认值取决于jmeter的配置项jmeter.httpsampler,当取不到时,会使用java这个选项
Protocol:http或https
Method:http的get、post请求,此处还包含head、put、options、trace、delete、patch Content encoding:所发送请求的报文内容所使用的编码
Path:资源的路径(如/servlets/myServlet),如果资源需要带上查询参数的话,可以添加到Send Parameters With the Request部分,需要注意的是,path必须填写完整的路径
Redirect Automatically:设置是否自动重定向,可以用在GET和HEAD请求中,勾选此项时,如果服务器返回重定向相关的状态码,会直接取得Response headers中的location值进行重定向请求,察看结果树视图中,看不到重定向的样本,只能看到一个样本。对于POST或PUT的请求,忽略此设置。
Follow Redirects:此选项的设置与Redirect Automatically有互斥关系,当不勾选Redirect Automatically时,才能勾选Follow Redirects。如果设置了此选项,jmeter的取样器将会检查响应是否需要重定向,如果有则会随后发起请求。使用察看结果树视图可以看到,最初的请求和随后的重定向请求都会显示在结果树中。父取样器请求的URL和数据字段都会从最后一个请求中取得,但父样本的字节数和执行时间将包含子取样器的所有数据。
Use KeepAlive:需要先介绍keep-aliver模式:HTTP协议采用“请求-应答”模式,当使用普通模式,即非KeepAlive模式时,每个请求/应答客户和服务器都要新建一个连接,完成之后立即断开连接(HTTP协议为无连接的协议);当使用Keep-Alive模式(又称持久连接、连接重用)时,Keep-Alive功能使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接。勾选此选项,jmeter会在http头加入"Connection: Keep-Alive",才能启用Keep-Alive,它需要选择HttpClient的实现才能起作用 。
Use multipart/form-data for HTTP POST:使用multipart/form-data或者application/x-www-form-urlencoded设置post请求提交数据所使用的格式。
Send parameters with the request:设置参数名和参数值,将会依据你所选的post和get方法发送参数和参数值,当选择get时,参数会被添加到url直接发送,当选择post时,参数将单独发送。当你需要发送一个文件时,需要使用multipart form,参数的创建也需要根据multipart form的规范。表格中还有选项encode?:可以指定某一参数是否进行编码,如果你不确定,那么最好都打上勾,当你的参数值中包含$、&、+、逗号、/、冒号、=、问号、@等时,通常需要进行编码。
Send files with the request:
(1)file path:发送的文件名称,如果不设置,jmeter不会发送文件,当填写文件名时,jmeter会自动以multipart form形式发送。当请求为POST、PUT、PATCH请求时,仅有一个文件,那么parameter name将会被忽略,直接将文件作为请求的整个包体进行发送,这样的使用方式可以允许用户发送任何请求内容。
(2)parameter name:请求参数名“name”的值
(3)MIME Type:MIME类型,如text/plain,如果是POST或PUT请求且“name”值被忽略,或请求仅由参数值构成,那么该字段设置的值将作为请求头content-type的值
Proxy server:
(1)server Name or ip:执行请求的代理服务器或ip地址
(2)port:代理服务器端口
(3)username:代理服务器的用户名
(4)password:代理服务器的密码
Optional tasks:
(1)retrieve All Embedded Resources from HTML Files:设置jmeter是否需要从html文件中解析引用的所有图片、java applets、js文件、css等
(2)Use concurrent pool:使用并发池的连接去获取嵌入的资源
(3)size:concurrent pool的连接数大小
(4)use as monitor:配合监视器结果视图(Monitor results)使用
(5)save response as MD5 hash:如果选择了此项设置,响应将不会被取样器直接存储,jmeter会对响应进行md5哈希后再行存储,这主要针对大数据量的测试
(6)embedded URLs must match:选择时,可以使用正则表达式匹配指定url的资源才被下载,如你需要下载url为http://example.com/的嵌入资源,那么这里可以设置正则表达式为:http://example\.com/.*。
(7)source ip address:设置后,请求或响应均会使用这个属性设置的地址,如有多个ip地址时,则可直接指定
需要注意的是,当使用Redirect Automatically时,cookies仅会发送给初始的url,这可能会导致意想不到的行为,例如:访问www.example.com时重定向到www.example.co.uk,这时服务器可能会返回两个URL的cookies,但jmeter可能只看到最后一个主机地址的cookie,如果在下一个请求还是测试www.example.com而非www.example.co.uk,则可能会发送不正确的cookie。同样请求头的内容也是被发到初始的请求,不会发送给重定向后的URL,这种情况只会在手动创建的测试计划中比较经常出现,如果是通过http代理录制下来的则不会有类似问题。
HTTP请求中可以对parameters和post body进行切换,一旦你需要切换回parameters的tab页时,需要清空post body的内容。在post body模式下,每行将会自动添加CRLF回车换行符,除了最后一行。
响应报文大小的计算设置,通过设置sampleresult.getbytes.body_real_size=true可以获取返回的响应中的body部分的字节数,设置sampleresult.getbytes.headers_size=true则获取整个报文的字节数,包含报文头和报文体。
2.2 Java请求
Java请求取样器允许你控制继承
org.apache.jmeter.protocol.java.sampler.JavaSamplerClient 接口的java类,通过这个接口的编写自己实现,可以使用Jmeter利用多线程输入参数控制和数据收集。
下拉菜单提供了在JMeter的类路径中这类的所有列表实现,下面的表格中指定的参数可以由实现来定义的,提供了两个简单的例子(JavaTest和SleepTest)。
JavaTest例子取样器可以用于检查测试计划,因为它允许在几乎所有领域的设置值。这些可以使用断言等,使用的字段允许使用变量,因此这些值都能清楚看到。
(1)Sleep_Time:设置多长的睡眠时间
(2)Sleep_Mask:这个睡眠时间的计算公式如下:
总睡眠时间 = 睡眠时间 + 系统当前时间 % Sleep_Mask
2.3 MongoDB Script
该取样器允许你向MongoDB发送一个请求,在发送请求前,你需要设置MongoDB资源配置。
填写的参数如下:
(1)MongoDB Source:Jmeter的名称变量MongoDB连接,这个必须符合MongoDB配置源
(2)Database Name:数据库名称,这个名称用在你的数据库脚本中
(3)Username:数据库的登录用户名
(4)Password:数据库的登录密码
(5)Script:Mongo 脚本,也能在MongoDB命令行中使用
2.4、TCP取样器
(1)TCP服务器名称或IP:填写响应的TCP服务器的名称或者IP,图中以百度为例
(2)端口号:TCP服务器的端口号
(3)Timeouts Connection:连接超时时间设置,就是超过多长时间就认为是超时
(4)Timeouts Response:回复超时时间设置,就是多长时间没有回复就认为是超时
(5)Re-use Connect:重用连接(一般都指重用socket)
(6)要发送的文本:就是TCP层之后的内容(一般是相当于payload)
(7)用户名、密码:就是对于有密码的TCP服务器的登录请求需要添加
2.5、Test Action
Test Action取样器是用于有条件的控制器,而不是生成一个样本,测试元素可以暂停或停止选中的目标。
(1)Target:目标,即选中当前线程还是全部线程
(2)Action:动作,Pause:暂停、Stop:停止、Stop Now:直接停止整个目标、Go to next loop iteration:进入下一轮动作
(3)Duration:暂停多少毫秒
2.6、Debug Sampler
Debug Sampler 生成一个包含所有Jmeter变量或属性值的样本。
(1)JMeter properties:是否包含JMeter属性,是则为True,否则为False
(2)JMeter variables:是否包含JMeter变量,是则为True,否则为False
(3)System properties:是否包含系统属性,是则为True,否则为False
3.定时器
3.1 Synchronizing Timer
Synchronizing定时器的目标是阻塞线程,直到指定数量的线程数到达此定时器,然后再一起释放掉,从而模拟瞬间大量负载不断地同时发起请求的场景,与LR中的集合点类似。
(1)Number of Simulated Users to Group by:模拟用户的数量,即指定同时释放的线程数数量
(2)Timeout in milliseconds:超时时间,即超时多少毫秒后同时释放指定的线程数
3.2 固定定时器
如果你需要让每个线程在请求之前按相同的指定时间停顿,那么可以使用这个定时器,这个功能与LR的思考时间类似。下面表示每个线程在请求之前停顿300毫秒。
3.3 高斯随机定时器
如果你需要让每个线程在请求之前按随机的时间停顿,那么可以使用这个定时器,下面表示暂停时间会分布在100到400之间,计算公式参考:Math.abs((this.random.nextGaussian() * 300) + 100)。
3.4 Poisson Random Timer
这个定时器在每个线程请求之前按随机的时间停顿,大部分的时间间隔出现在一个特定的值,总的延迟就是泊松分布值和偏移值之和。下面表示暂停时间会分布在100到400毫秒之间。
(1)Lambda(in milliseconds):兰布达值
(2)Constant Delay Offset(in milliseconds):暂停的毫秒数减去随机延迟的毫秒数
3.5 Uniform Random Timer
这个定时器暂停每个线程请求的随机时间,每个时间间隔都有相同的概率发生,总的延迟时间就是随机值和偏移值之和。下面表示的是随机延迟时间的最大值是100毫秒
(1)Random Delay Maximum(in milliseconds):随机延迟时间的最大毫秒数
(2)Constant Delay Offset(in milliseconds):暂停的毫秒数减去随机延迟的毫秒数
4、断言:
4.1 响应断言
响应断言控制面板可以让你添加要测试的模式串与响应的各个字段进行对比。你可以选择字符串是否匹配整个响应报文,或者响应只是符合正则表达式的要求。可以灵活地添加多个断言到任何控制器中。注意:要测试的模式不应该包含“//”,如使用:Price: \d+,而不是:/Price: \d+/。
默认情况下,模式是多行模式,意味着“.”元字符不匹配换行符,在多行模式中,“^”和“$”匹配任意一行的行首和行尾,而不仅是在整个字符串的开头和结尾匹配,为了重写这些设置,可以使用扩展的正则表式语法,例如:
(1)(?i):忽略大小写
(2)(?s):切换成单行模式,“.”可以匹配每一个字符(包含\n)
(3)(?is):上述上种组合
Ignore status复选框:整个样本的成功状态取决于所有返回的响应报文的组合,当选中此复选框时,将清除之前已执行的断言的结果,所以选择这个选项时需要特别注意,这是第一个断言。
模式匹配规则(Pattern Matching Rule)指示文本如何与模式进行检查,包含:
(1)Contains:包括,当文本中包含符合正则表达式时返回true
(2)Matches:匹配,当整个文本符合正则表达式时返回true
(3)Equals:当整个文本与模式要求的值相同时返回true(区分大小写)
(4)Substring:当整个文本包含模式要求的值时返回true(区分大小写)
Equals和Substring模式是普通的字符串匹配,非正则表达式匹配,Not复选框表示对上述结果进行反义,返回true的场景仅返回成false
Patterns to Test:添加一系列的模式进行测试,每一行均会单独地进行测试,如果其中一行模式测试失败,接下来的模式将不会再进行检查。设置一个断言多个模式或设置多个断言各一个模式这两种设置方案没有什么区别,然而,Ignore status复选框被选择时,这将会影响取消掉之前任何已经失败的断言,因此需要确保这个选项仅在第一个断言中被勾选。
4.2 断言持续时间
断言持续时间用来检测每个请求的响应时间是否在给定的时间内,即下图所示的“持续时间(毫秒)”所设置的值,任意响应如果花费的时间比设置的“持续时间”大那么将标志此请求失败,这与LR的报告中,可以指定响应时间过滤执行结果类似。
4.3 HTML Assertion
HTML Assertion的作用是检查返回的的内容,格式是否符合指定格式的相关标准。 (1)Doctype:文档类型,包括四个类型:omit(省略)、strict(严格)、loose(宽松)、auto(自动)
(2)Format:格式类型,即你按哪种格式来检查返回内容,HTML or XHTML or XML ?
(3)文件名:指明要写入的文件名
(4)Error threshold:最大可以接受的错误数;Warning threshold:最大可以接受的警告数。如果勾选“Error only”这忽略Warning,只对Error作统计检查。如果对返回内容的检查结果不超过指定结果,则断言通过,否则失败。
1、怎样计算Ramp-up period时间?
Ramp-up period是指每个请求发生的总时间间隔,单位是秒。如果Number of Threads设置为5,而Ramp-up period是10,那么每个请求之间的间隔就是10/5,也就是2秒。Ramp-up period设置为0,就是同时并发请求。
2、Get和Post的区别?
他们是http协议的2种不同实现方式。Get是指server从Request URL取得所需参数。从result中的request中可以看到,get可以看到参数,但是post是主动向server发送参数,所以一般看不到这些参数的。
3、