1、为什么要添加断言?
在jmeter进行测试的时候,有时候,我们需要确定Jmeter究竟有没有正确工作,因为有时候,我们利用监听器查看的时候,监听器返回的结果是正确的,但是,实际上,我们发送的请求中的有些参数可能是错误的,系统并没有按照我们预期的方式进行相应,比如,一般典型的web应用一般都会:
(1)有一个登录页,它是整个应用的入口。当用户登录之后,应用会将用户相关的安全信息放到session中。
(2)有一个filter,它拦截请求,检查每个请求相关的session中是否包含有用户安全信息。如果没有,那么请求被重定向到登录页,要求用户提供安全信息。
在这种配置下测试计划,除了登录页之外的其它请求都将因为缺少用户安全信息,而使请求实际定位到登录页。如果不加断言,那么在监听器看来所有的请求都是成功。而实际上,这些请求最终都没有到达它们应该去的地方。显然,这种测试结果不是我们所期望的。
以响应断言为例:
如果我们要确定Jmeter有没有按照我们的预期进行工作,我们应当考虑使Jmeter提供的断言,加到Sampler里面可以对返回的结果进行判断,例如判断HTTP返回结果里面是否含有某个字符串。如果断言为真,JMeter会标记请求为成功,否则标记为失败。为了最大限度的灵活性,JMeter允许使用正则表达式创建断言。
要在JMeter中添加断言,我们首先要知道我们期望返回什么结果,比如我们利用jmeter测试http请求,向程序添加数据,同时,Jmeter又有查询的http请求,那么,我们当然要验证我们利用jmeter的http请求,是否成功添加了数据,这个时候,我们可以在查询的http请求中添加断言。
2、Jmeter断言-所有断言讲解
见如下文章,讲解的比较详细,具体用到断言会在之后的文章中分述
http://blog.csdn.net/Foreverlemon/article/details/72821830?locationNum=12&fps=1
3、响应断言添加步骤
(1)右键点击相应请求,然后添加->断言->响应断言
(2)设置响应断言
各项含义如下:
1)APPly to: 适用范围
a. Main sample and sub-samples: 作用于父节点取样器及对应子节点取样器
b. Main sample only: 仅作用于父节点取样器
c. Sub-samples only: 仅作用于子节点取样器
d. JMeter Variable: 作用于jmeter变量(输入框内可输入jmeter的变量名称)
说明:
关于应用范围,我们大多数勾选“main sample only” 就足够了,因为我们一个请求,实质上只有一个请求。但是当我们发一个请求时,可以触发多个服务器请求,类似于ajax那种,那么就有main sample 和 sub-sample之分了。
对于有重定向的请求,并且勾选了“跟随重定向”, 那么这两个请求都是 sub-sample,重定向后的请求(第二个请求)就是main-sample。关于main sample and sub sample,有兴趣的可以看看这个帖子:
http://stackoverflow.com/questions/28214936/jmeter-in-which-scenario-i-can-use-main-sample-or-sub-sample-or-both-for-te
2) 要测试的响应字段:要检查的项,包含 响应文本,Document(Text),url样本,响应代码,响应信息,Response Header,ignore status
a. 响应报文: 服务器响应文本,一般普通http响应,都勾选这个。
b. Documeng(text):
测试文件,一切Apache Tika 支持服务器响应,包括文本响应,还支持 PDF, Office, Audio, Video formats。jmeter会用Apache Tika 去解析服务器响应内容,会很耗内存,而且也很容易解析失败。所以一般普通http请求,不要选择这个。
c. URL样本
是对sample的url进行断言。如果请求没有重定向(302),那么就是这个就是请求url。 如果有重定向(且跟随重定向),那么url就包含请求url 和 重定向url
d. 响应代码
http响应代码,如101,200,302,404,501等。但当我们要验证404,501等http响应代码时,需要勾选“ ignore status”。因为当http 响应代码为400,500时,jmeter默认这个请求时失败的。
e. 响应信息:
http响应代码对应的响应信息,例如:OK, Found HTTP/1.1 200 Ok HTTP/1.1 302 Found/
f. Response Headers: 响应头部
Server: Tengine
Date: Thu, 12 Mar 2015 09:43:52 GMT
Content-Type: text/html
Content-Length: 260
Connection: close
Location: http://www.baidu.com/404.html
g. Ignore status:忽略返回的响应报文状态码
3)模式匹配规则
a. 包括:返回结果包括你指定的内容,支持正则匹配
例如:
响应字段为: 响应文本
模式匹配规则:包含
断言为:1、invalid 2、[a-z]+
当返回值为:{"msg":"channel invalid."} , 这两个断言都是ok的,返回true
b. 匹配:
(1) 相当于 equals 。当返回值固定时,可以返回值做断言,效果和equals相同
(2) 正则匹配 。 用正则表达式匹配返回结果,但必须全部匹配。 即正则表达式必须能匹配整个返回值,而不是返回值的一部分。
例如:
响应字段为: 响应文本
模式匹配规则:匹配
断言为:1、{"msg":"channel invalid."} 2、\{"msg":"[a-z]+ invalid\."\} , 3、[a-z]+
当返回值为:{"msg":"channel invalid."} ,断言1 2 是ok的, 断言3是false
当返回值为:{"msg":"channel invalid."} , 断言1 3是false, 断言2才是ok的。
原因是,断言1 只能用于equals,而断言3 只匹配了返回值部分,而不是全部匹配。
c. Equals:返回结果与你指定断言完全一致
d. Substring:与 “包括”差不多,都是指返回结果包括你指定的内容,但是subString不支持正则字符串
例如:
响应字段为: 响应文本
模式匹配规则:匹配
断言为:1、invalid 2、[a-z]+
当返回值为:{"msg":"channel invalid."} , 断言1返回true, 但断言2返回false
e:否:就相当于取反。 如果上面断言结果为true,勾选“否”后,最终断言结果为false。如果上面断言结果为false,勾选“否”后,则最终断言结果为 true。
断言中可以添加多个断言一起判断,断言中也可以使用参数化方法,进行动态判断。
网友评论