ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] 断言:依靠软件程序自动判断操作结果的正确性,用于检查测试中得到的响应数据等是否符合预期。在接口测试用例中没有断言的接口用例是无效的,一个接口的断言有三个层面,一个是HTTP状态码的断言,另外一个是业务状态码的断言,最后是某一接口请求后服务端响应数据的断言 Jmeter最常用断言:Response Assertion(响应断言),Json断言,beanshell断言 >[success] ## 一:Response Assertion(响应断言) 响应断言:可选择断言验证的范围(URL,响应头,响应码,响应体,响应附件),匹配的模式(纯文本还是正则表达式匹配) >[info] ### **1:操作响应断言:添加-断言-响应断言** :-: ![](https://img.kancloud.cn/e7/b6/e7b6c442a37725b518728b5b46622598_593x548.png) 对web请求http状态码的断言 1.对http请求状态码的验证 :-: ![](https://img.kancloud.cn/81/02/8102af7ba3c2cd744cb4f1a1c52ba2c9_1152x720.png) <br> <br> **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): 一个请求多项响应断言时,忽略某一项断言的响应结果,而继续下一项断言     **模式匹配规则**   包括:响应的结果中包含指定的文本或者字段值,支持正则表达式   匹配:完全匹配,期望值与实际结果必须完全一致,一般结合正则表达式使用   相等:响应结果与指定的内容完全一致,不支持正则表达式   字符串:返回结果,包含指定的字符串,不支持正则表达式   否:不进行匹配 <br> <br> >[info] ### **2:添加断言结果,添加-监听器-断言结果** :-: ![](https://img.kancloud.cn/a8/4e/a84e4a12f326e0110a57937c562c7372_702x586.png) <br> <br> >[info] ### **3:发送请求,查看断言结果** :-: ![](https://img.kancloud.cn/1f/8e/1f8e399c96dda257aba003a9ea79e1ef_1152x720.png) <br> <br> <br> <br> >[success] ## **二:Json断言** JSON断言可以对服务器返回的JSON文档进行验证。 JSON断言有两种使用模式: 1.根据JSONPath能否在JSON文档中找到路径; 2.根据JSONPath提取值并对值进行验证。 若文档格式为非JSON则断言失败;找不到路径断言失败;提取值与预期值不一致断言失败。 <br> <br> >[info] ### **1:添加-断言-Json断言** :-: ![](https://img.kancloud.cn/ea/b8/eab8549d667d1c6357817ec44d43e9a5_594x526.png) 若响应数据返回是Json格式,我们可以对其进行json断言操作,在请求的察看结构树响应数据里提取数值对其进行断言,示例提取data里的phone进行断言如下 :-: ![](https://img.kancloud.cn/eb/0e/eb0ed62f79c293febcddcfba8e8c3852_1152x720.png) :-: ![](https://img.kancloud.cn/19/c6/19c61271cce7189c2c51593ed3c5a51e_876x150.png) 可看到实际响应结果与预期不一致,故fail <br> <br> <br> <br> >[success] ## **三:Beanshell断言**### **Bean Shell常用内置变量**    JMeter在它的BeanShell中内置了变量,用户可以通过这些变量与JMeter进行交互,其中主要的变量及其使用方法如下: **log**:写入信息到jmeber.log文件,使用方法:log.info **ctx**:该变量引用了当前线程的上下文,使用方法可参考:org.apache.jmeter.threads.JMeterContext。 **vars** - (JMeterVariables):操作jmeter变量,这个变量实际引用了JMeter线程中的局部变量容器(本质上是Map),它是测试用例与BeanShell交互的桥梁,常用方法: <br> <br> &ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;a) `vars.get(String key):`从jmeter中获得变量值 &ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;b) `vars.put(String key,String value):`数据存到jmeter变量中 <br> <br> **props** - (JMeterProperties - class java.util.Properties):操作jmeter属性,该变量引用了JMeter的配置信息,可以获取Jmeter的属性,它的使用方法与vars类似,但是只能put进去String类型的值,而不能是一个对象。对应于java.util.Properties。 <br> <br> &ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;a) `props.get("START.HMS");`  注:START.HMS为属性名,在文件jmeter.properties中定义 &ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;b) `props.put("PROP1","1234"); ` <br> <br> **prev** - (SampleResult):获取前面的sample返回的信息,常用方法: <br> <br> &ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;a) **`getResponseDataAsString():`获取响应信息** &ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;b) **`getResponseCode() :`获取响应code** <br> <br> **sampler** - (Sampler):gives access to the current sampler  在这里除了可以使用beanshell的内置变量外,主要通过 Failure 和 FailureMessage来设置断言结果。 :-: ![](https://img.kancloud.cn/cc/45/cc45568f2b233451cc124649822540f2_1152x720.png) ``` 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; } } ```