平时我们在性能测试的过程中断言使用的频率并不多。主要是因为性能测试中的断言会增加脚本执行时间,但是接口测试中断言是必备的。
那么什么是断言?
说白了断言其实就是功能测试中常说的预期结果和实际结果是否相等。
首先来看下断言的类型有哪些:
在jmeter的断言中存在如下13中断言:
响应断言添加方式及位置如上图,一般来说可以将其放在某一个HTTP请求下,以使其对之生效。
此外还需要添加一个断言结果,它专门用于捕获断言结果,用于查看断言是否通过。
我们对界面上的组件做一下解释:
Apply to (响应断言的应用范围)
Main sample and sub-samples:作用于父节点取样器及对应子节点取样器
Main sample only:只作用于父节点取样器(一般的断言都选这个)
Sub-samples only:只作用于子节点取样器
JMeter Variable:只作用于jmeter变量(可写入正则提取的响应值)
测试字段:
响应文本:请求的响应文本信息,不包含响应头信息。最常用的断言字段
响应代码:对应http返回的响应码
响应信息:匹配响应信息
响应头:响应头信息
URL样本: 请求url,如果有重定向包含重定向url
文档(文本):通过Apache Tika从各种的文档中提取的文本进行验证,包括响应文本,pdf、word等等各种格式
忽略状态(Ignore Status): 一个请求多项响应断言时,忽略某一项断言的响应结果,而继续下一项断言
模式匹配规则:
包括:响应的结果中包含指定的文本或者字段值,支持正则表达式
匹配:完全匹配,期望值与实际结果必须完全一致,一般结合正则表达式使用
相等:响应结果与指定的内容完全一致,不支持正则表达式
字符串:返回结果,包含指定的字符串,不支持正则表达式
否:不进行匹配
文档(文本) / Document(Text):
URL样本:
响应代码(Response code)
响应信息(Response information)
响应断言-模式匹配规则
接口测试中较少用到
JSON Assertion,如字面意,检查JSON的断言
Assert JSON Path exists:$.
新增一个 JSON Assertion,在 $. 后面加入需要检查的json字段;
Expected Value:是要检查的json结果;
Additionally assert value: – 判断返回值等于Expected Value,也可以用正则表达式,勾选 Match as regular expression
Expect null: – 勾选了Additionally assert value才生效;与Additionally assert value是或的关系,判断优先级高于Additionally assert value;
Invert assertion: – 以上设置的校验不成立才通过
Additionally assert value:等于特定值
Match as regular expression:符合正则表达式
返回的字节大小符合指定的,就是成功。
举个例子:
这里我们选择返回字节为200,比较类型为>
运行一下,并查看结果树和断言结果
察看结果树:
断言结果:
里面没有任何失败的提示语既表示断言通过
JSR223断言,需要写js代码。要有一点js基础不然你将不知从何下手
JSR223 Assertion可以选择多种语言,如下图所示:
我常用的是beanshell和JS。这里我们以beanshell举例:
JSR223 Assertion实例:
import org.json.*;
//获取上一个请求的返回值
String response = prev.getResponseDataAsString();
//将返回值转换为json
JSONObject responseJson = new JSONObject(response);
//获取responseMessage
String status = responseJson.get("status").toString();
String message = responseJson.getString("message");
if(!status.equals("0")) {
Failure = true;
FailureMessage = "status错误";
}else{
FailureMessage = "status正确";
}
if(!message.equals("username or password error")) {
Failure = true;
FailureMessage = "message错误";
}else{
FailureMessage = "message错误";
}
这个断言很简单,就是左边(xpath)等于右边(预期结果)
Xpath主要用于标识XML文档中某个位置的元素,类似于HTML的树状结构,可以一级一级地向下寻找元素。
XPath断言其实更多的适用于被测系统有前端页面的测试场景。
定义: XPath即为XML路径语言,它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言。
XPath基于XML的树状结构,提供在数据结构树总找寻节点的能力。
作用对象: 针对返回信息为XPath的数据类型进行断言
区别: 与响应断言相比,Xpath Assertion是用Xpath,响应断言是直接用文字进行匹配
用的比较多是响应断言,可以利用响应断言加上一些代码的判断,去判断用例到底是成功还是失败,得到一些比较确切的结果
页面选项详细说明:
Apply to:
Main sample and sub-samples – 可以同时应用到主取样器和子取样器。例如带有嵌入资源的HTTP取样器、Mail Reader 或者事务控制器生成的取样器。
Main sample only -只能应用到主取样器。
Sub-samples only - 只能应用到子取样器
JMeter Variable Name to use –应用到指定名称的变量(对指定的变量的值进行提取)
对所有符合条件的取样器按顺序进行取样。例如,如果有一个主取样器和三个子取样器,
当设置为Sub-samples only时,则只对3个子取样器进行检查;
当Main sample and sub-samples,则对1个主取样器和3个子取样器进行检查;。
XML Parsing Options (XML解析选项):
Use Tidy:当需要处理的页面是HTML格式时,必须选中该选项;如果是XML或XHTML格式(例如RSS返回),则取消选中;
Quiet表示只显示需要的HTML页面,Report errors表示显示响应报错,
Show warnings表示显示警告;
Use Namespaces:如果启用该选项,后续的XML解析器将使用命名空间来分辨;
Validate XML:根据页面元素模式进行检查解析;
Ignore Whitespace:忽略空白内容;
Fetch external DTDs:如果选中该项,外部将使用DTD规则来获取页面内容引用名称:下一个请求要引用的参数名称,如填写title,则可用${ var_regexp2}引用它。
Return entire XPath fragment of text content:返回文本内容的整个XPath片段;
Reference Name:存放提取出的值的参数。
XPath Query:用于提取值的XPath表达式。
Default Value:参数的默认值。
PS:XPath是XML/XHTML中常用的选取给定节点和节点集的方法。
这是一种比较特殊的断言元件,针对断言进行字符串替换时使用;
作用对象:需要替换的字符串
Select Comparison Operators:选择比较运算符
Compare Content:可以选择比较的内容类型(true/false或者自定义,编辑)
Compare Time:比较时间(可以设定比较的时间,单位为秒,默认为-1)
Comparison Fitters:比较修改工具
regular expression substitutions:替换正则表达式
Regex String:要替换的字符串(可从断言结果中选择)
substitutions:替换的字符串(替换结果)
这个就比较好理解了。断言取样器运行测试消耗掉的时间,比如我们的持续时间填写10,实际时间如果是20s,那么就会断言失败。
用于判断服务器的响应时间
作用对象:服务器
APPly to:适用范围
Main sample and sub-samples:作用于父节点取样器及对应子节点取样器
Main sample only:仅作用于父节点取样器
Sub-samples only:仅作用于子节点取样器
Duration to assert:持续断言
Duration in milliseconds:响应时间设置(单位:毫秒),如果响应时间大于设置的响应时间,则断言失败,否则成功!
对响应类为XML类型的文件进行断言;
作用对象:针对sampler中的SOAP/XML-RPC Request而使用的断言
Tidy Settings:Tidy 环境(Tidy是一个HTML语法检查器和打印工具,可以将HTML转换为XML类型的文件)
Doctype:文档类型(可通过下拉框选择不同文档类型→ omit疏忽遗漏的/auto动态的/strict严格的/loose宽泛的。。。。。。我也不太懂这里什么意思GG)
Format:文件格式(可选择HTML/XHTML/XML三种不同类型的文件格式来检查返回内容)
Errors only:误差校正(能接受的最大值)
Error threshold:误差/错误范围(可选择误差/错误数量的范围,最大值)
Warning threshold:警告范围(可选择误差警告的数量范围,最大值)
如果勾选“Error only”这里忽略Warning,只对误差作统计检查;如果对返回内容的检查结果不超过指定结果,则断言通过,否则失败。
Write JTidy report to file:写入JTidy报告的文件(JTidy是Tidy的一个java移植,可以将它当成一个处理HTML文件的DOM解析器)
对返回的MD5进行断言,直接填入即可。
MD5是一种消息摘要算法,用以提供消息的完整性保护(具体关于MD5的知识请自行查询);
作用对象:针对参数类型为MD5Hex加密的参数的断言
MD5Hex:将已被MD5加密的参数写入其中,添加取样器等其他元件
SMIME是一种多用途网际邮件扩充协议,相比于之前的SMAP邮件传输协议,增加了安全性,对邮件主题进行保护;
作用对象:针对采用了该种邮件传输协议的信息
signature:签名(可选择对协议的签名验证状态)
Verify signature:验证签名
Message not signed:没有签名消息
Signer certificate:签名证书(因为SMIME协议增加了安全传输,需要证书验证)
No check:不检查
Check values:检查
Signer distinguished name:签名证书者名称(证书注册者的名称)
Sigmer email address:签名者的邮件地址(注册的邮件地址)
Issuer distinguished name:发行者名称(由谁发行的证书)
Serial Number:证书序号
Certificate file:选择证书文件
Execute assertion message at position:执行断言消息的位置(在返回消息的具体哪个位置执行断言)
用来验证响应数据是正确的XML格式,不常用。
XML模型断言/XML数据类型断言;XML Schema 定义了两种主要的数据类型:①xml document schema 文档架构 ;② 文档架构xml-schema xml模式
作用对象:返回结果为XML概要断言的2中数据类型的消息
XML Schema:XML概要模型
File Name:文件名(写入需要断言的文件名称)
Bean Shell常用内置变量
JMeter在它的BeanShell中内置了变量,用户可以通过这些变量与JMeter进行交互,其中主要的变量及其使用方法如下:
log:写入信息到jmeber.log文件,使用方法:log.info(“This is log info!”);
ctx:该变量引用了当前线程的上下文。
vars - (JMeterVariables):操作jmeter变量,这个变量实际引用了JMeter线程中的局部变量容器(本质上是Map),它是测试用例与BeanShell交互的桥梁,常用方法:
a) vars.get(String key):从jmeter中获得变量值
b) vars.put(String key,String value):数据存到jmeter变量中
props - (JMeterProperties - class java.util.Properties):操作jmeter属性,该变量引用了JMeter的配置信息,可以获取Jmeter的属性,它的使用方法与vars类似,但是只能put进去String类型的值,而不能是一个对象。对应于java.util.Properties。
a) props.get(“START.HMS”); 注:START.HMS为属性名,在文件jmeter.properties中定义
b) props.put(“PROP1”,“1234”);
prev - (SampleResult):获取前面的sample返回的信息,常用方法:
a) getResponseDataAsString():获取响应信息
b) getResponseCode() :获取响应code
sampler - (Sampler):gives access to the current sampler
在这里除了可以使用beanshell的内置变量外,主要通过 Failure 和 FailureMessage来设置断言结果。
脚本:
if ("200".equals(""+ResponseCode) == false )
{
// 响应码不等于200时,设置断言失败,并输出失败信息
Failure=true ;
FailureMessage ="Response code was not a 200 response code it was " + ResponseCode + "." ;
print ( "the return code is " + ResponseCode); // this goes to stdout
log.warn( "the return code is " + ResponseCode); // this goes to the JMeter log file
} else {
// 响应码等于200时,设置断言成功,并输出成功信息
Failure=false;
FailureMessage = "Return true, and the response code was " + ResponseCode;
}
}
这个用的比较多,用法比较复杂,后面单独拿出来讲一下