6.3 断言
1响应断言
所谓断言,就是希望测试得到的结果与预期的结果是否一致的行为,在软件测试中,断言是一种非常重要的活动。响应断言,通过获得HTTP请求报文和响应报文的信息来进行断言。通过右键点击菜单,选择“添加->断言->响应断言”而获得。其界面如图35所示。
图35 响应断言
- Apply to:同正则表达式提取器中对应的字段。
- 测试字段。
Ø 响应文本:是响应报文的Body部分(不包括状态行与响应头信息)。
Ø 响应代码:是响应状态码,比如:200、304、404等。
Ø 响应消息:响应的短语,比如OK、Not Modified、Not Found等。
Ø 响应头:响应报文的头部信息。
Ø 请求头:请求报文的头部信息。
Ø URL样本。请求的URL。如果选择了“跟随重定向”,则包含重定向后的URL。
Ø文档(文本):通过Apache Tika从各种类型的文档中提取文本。此选项开启也会严重影响性能,谨慎使用。
Ø 请求数据:是请求报文的Body部分(不包括请求行与首部字段)
Ø 忽略状态:通过断言的结果与现有的响应状态相结合来确定取样器的总体成功。当选择忽略状态复选框时,将强制响应状态在计算断言之前是成功的。HTTP协议在返回4XX和5XX的状态码默认是不成功的,选择此项可用于在执行进一步检查之前设置状态成功。
- 匹配模式
Ø Contains:如果文本包含正则表达式模式,则为TRUE。
Ø Matches:如果整个文本与正则表达式模式匹配,则为TRUE。
Ø Equals:如果整个文本等于模式字符串(区分大小写),则为TRUE。
Ø Substring:如果文本包含模式字符串(区分大小写),则为TRUE。
注意。
Contains和Matches模式:支持Perl5类型的正则表达式,不区分大小写。
Equals和Substring模式:使用文本字符串,不支持正则表达式,区分大小写。
Contains和Substring模式:是包含关系,即部分匹配。
Matches和Equals模式:是完全匹配。
Ø Not:对断言结果进行否定。
Ø Or:将多个测试模式以逻辑“或”的形式组合起来。
- 通过操作按键,添加需要断言的内容。
- 如果匹配失败的情况下,可以在最下面添加失败信息。
2 BeanShell断言
BeanShell断言,通过脚本来设置断言。通过右键点击菜单,选择“添加->断言->BeanShell断言”而获得。其界面如图36所示。
图36 BeanShell断言
- 每次调用前重置bsh.Interpreter:如果选择此项,则将为每个取样器重新创建解释器。
- 参数(->String Parametersand String[] bsh.args):传递给BeanShell脚本的参数,参数存在下面的变量中。
Ø Parameters:整个参数字符串作为一个变量Parameters。
Ø bsh.args:用空格分隔的字符串被保存到变量数组bsh.args。
- 脚本文件:包含BeanShell脚本的文件,文件名存在变量FileName中。
在BeanShell断言最下面给出了脚本变量,包括。
- 读/写变量:Failure、FailureMessage、SampleResult、vars、props、log。
Ø Failure:布尔值。Failure为True,断言失败;Failure为False,断言成功。
Ø FailureMessage:当断言失败时候的提示信息。
Ø SampleResult:获得取样器结果。
Ø vars:即JMeterVariables,用于操作JMeter的变量,这个变量实际引用了JMeter线程中的局部变量容器(本质上是一个Map),它是测试用例与BeanShell交互的桥梁,常用方法如下。
√vars.get(String key):从JMeter中获得变量值。比如:myname=vars.get("name");获取JMeter变量name,然后赋予BeanShell变量myname。
√vars.put(String key,String value):数据存到JMeter变量中。比如:vars.put("name","cindy");把名为cindy的字符串赋予JMeter变量name。
√vars.putObject("objectName", Object);把一个对象赋予JMeter 对象objectName。
注意:在元件中获取vars变量的值,依然使用:${变量名}。
vars接收的值必须是字符串类型,如果需要传递其他类型,包括null,都会报错。如果想使用数字,数字等类型,方法是做类型转换。例如。
vars.put(“key1”, ““ + 0); vars.put(“key2”, (String)0); vars.put(“key3”, [1,2,3].toString()); vars.put(“key4”, (String)[1,2]); vars.put(“key4”, ““ + [1, 2, 3]); vars.put(“key5”, ““ + false); vars.put(“key6”, false.toString());
Ø props:即JMeterProperties,属于java.util.Properties类。vars有的put、get方式,props都有;操作JMeter属性,该变量引用了JMeter的配置信息,可以获取JMeter的属性,它的使用方法与vars类似,但是只能put进去String类型的值,而不能是一个对象,对应于java.util.Properties。
√props.get("START.HMS");注:START.HMS为属性名,在文件jmeter.properties中定义。
√props.put("PROP1","1234");
Ø log:将信息写入到JMeter日志文件jmeber.log中去,其目的是便于调试。有以下几中使用方法。
log.info("This is a info log"); log.error("This is an error log "); log.warn("This is a warn log ");
- 只读变量:Response[Data|Code|Message|Header] 、RequestHeader、SampleLabel、SampleData、ctx。
Ø ResponseData:响应数据。
Ø ResponseCode:响应代码,比如304、404、500。
Ø ResponseMessage:响应代码信息。
Ø ResponseHeader:响应头。
Ø RequestHeader:请求头。
Ø SampleLabel:取样标签,即在HTTP请求中设置的名称。
Ø SampleData:取样数据。
Ø ctx:该变量引用了当前线程的上下文(context),使用方法可参考http://jmeter.apache.org/api/org/apache/jmeter/threads/JMeterContext.html。
我们在登录BeanShell断言元件中加入下面的代码。
log.info(“ResponseData:”+ResponseData);; log.info(“ResponseCode:”+ResponseCode); log.info(“ResponseHeader:”+ResponseHeader); log.info(“RequestHeader:”+RequestHeader); log.info(“SampleLabel:”+SampleLabel); log.info(“SamplerData:”+SamplerData); log.info(“ctx:”+ctx);
获得如下结果。
2021-08-26 16:28:23,069 INFO o.a.j.u.BeanShellTestElement: ResponseData:[B@35d9015d 2021-08-26 16:28:23,069 INFO o.a.j.u.BeanShellTestElement: ResponseCode:200 2021-08-26 16:28:23,074 INFO o.a.j.u.BeanShellTestElement: ResponseHeader:void 2021-08-26 16:28:23,078 INFO o.a.j.u.BeanShellTestElement: RequestHeader:void 2021-08-26 16:28:23,078 INFO o.a.j.u.BeanShellTestElement: SampleLabel:登录 2021-08-26 16:28:23,078 INFO o.a.j.u.BeanShellTestElement: SamplerData:GET http://192.168.1.3:8000/ GET data: [no cookies] 2021-08-26 16:28:23,078 INFO o.a.j.u.BeanShellTestElement: ctx:org.apache.jmeter.threads.JMeterContext@6cf09382
通过这个例子,可以更好的了解只读变量的含义。