JMeter使用记录整理(十二)断言

目录

响应断言

APPly to(适用范围)

测试字段

模式匹配规则

断言结果

JSON断言

大小断言

持续时间断言

Bean Shell断言

什么是Bean Shell

Bean Shell常用内置变量

log

vars

props

prev

引用外部文件

引用外部java文件

引用外部class文件

引用外部Jar包

使用示例


在使用JMeter进行性能测试或者接口自动化测试工作中,经常会用到的一个功能,就是断言。断言相当于检查点,用来判断系统返回的响应结果是否正确,以此帮我们判断测试是否通过。

响应断言

响应断言 :对服务器的响应进行断言校验

作用对象:响应报文中的所有对象

增加断言: 线程组 -> 添加 -> 断言 -> 响应断言

APPly to适用范围

Main sample and sub-samples:作用于父节点取样器及对应子节点取样器

Main sample only:仅作用于父节点取样器

Sub-samples only:仅作用于子节点取样器

JMeter Variable:作用于jmeter变量(输入框内可输入jmeter的变量名称)

测试字段

响应文本

响应代码

响应信息

响应头

URL样本

文档(文本)

忽略状态

请求数据

模式匹配规则

包括

返回结果包括指定的内容,支持正则匹配。

例如断言为:1、invalid    2、[a-z]+

当返回值为:{"msg":"channel invalid."} , 这两个断言都是ok的,返回true

匹配

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 只匹配了返回值部分,而不是全部匹配。

Equals

返回结果与你指定断言完全一致

SubString

与 “包括”差不多,都是指返回结果包括指定的内容,但是subString不支持正则字符串。

例如断言为:1、invalid    2、[a-z]+

当返回值为:{"msg":"channel invalid."} , 断言1返回true, 但断言2返回false。

相当于取反。如果上面断言结果为true,勾选“否”后,最终断言结果为false。如果上面断言结果为false,勾选“否”后,则最终断言结果为 true。

或者

响应报文中包含下面填写的"要测试模式"的其中之一即可。

断言结果

添加断言结果监听:线程组 -> 添加 -> 监听器 -> 断言结果

执行线程组,查看结果,绿线为执行成功的效果,红线为执行失败的效果。

JSON断言

对判断某个请求执行状态(成功/失败),且响应为JSON格式时,就可以使用JSON断言。

增加断言: 线程组 -> 添加 -> 断言 -> JSON断言

断言结果示例

大小断言

判断响应结果是否包含正确数量的byte。可定义(=, !=, >, <, >=, <=)。

持续时间断言

判断是否在给定的时间内返回响应结果。

Bean Shell断言

在BeanShell中,可以使用java语言自定义函数来处理特定的逻辑,结合BeanShell的内置

对象进行变量的存取,提高脚本的灵活性。

什么是Bean Shell

BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法。

BeanShell是一种松散类型的脚本语言(这点和JS类似)。

BeanShell是用Java写成的,一个小型的、免费的、可以下载的、嵌入式的Java源代码解释器,具有对象脚本语言特性,非常精简的解释器。

BeanShell执行标准Java语句和表达式,另外包括一些脚本命令和语法。

Bean Shell常用内置变量

JMeter在它的BeanShell中内置了变量,用户可以通过这些变量与JMeter进行交互,其中主要的变量及其使用方法如下:

log

写入信息到jmeter.log文件,使用方法:log.info(“This is log info!”);

vars

操作变量,这个变量实际引用了JMeter线程中的局部变量容器(本质上是Map),它是测试用例与BeanShell交互的桥梁,常用方法:

1、 vars.get(String key):从JMeter中获得变量值

2、 vars.put(String key,String value):数据存到JMeter变量中

props

操作属性,该变量引用了JMeter的配置信息,可以获取Jmeter的属性,它的使用方法与vars类似,但是只能put进去String类型的值,而不能是一个对象。对应于java.util.Properties。

1、props.get("START.HMS");

注:START.HMS为属性名,在文件jmeter.properties中定义

2、props.put("PROP1","1234");

prev

获取前面的sample返回的信息,常用方法:

1、getResponseDataAsString():获取响应信息

2、getResponseCode() :获取响应code

引用外部文件

引用外部java文件

在BeanShell中通过 source("java文件路径") 方法引入java,然后调用方法和java一样,new一个class,再调用里面的方法。

引用外部class文件

用 addClassPath("class文件路径") 方法引入class文件,再用import导入包及类,然后就可以像java一样调用了。

引用外部Jar包

把jar包放到JMeter的lib目录下。

使用示例

使用JSONObject对象来获取json数据,进行断言和数据处理。

首先需要下载org.json的jar包

(https://search.maven.org/search?q=g:org.json%20AND%20a:json&core=gav),

然后在测试计划中导入该jar包,并在JMeter的lib目录下放入该jar包。

示例1:

验证retCode的值是否等于200:

import org.json.*;

//获取上一个请求的返回
String jsonString = prev.getResponseDataAsString();
JSONObject responseJson = new JSONObject(jsonString);

//判断返回值是否和预期一致
if (responseJson.getInt("retCode") != 200) {
    //把断言失败置为真,即用例失败,并在结果树中显示FailureMessage
    Failure = true;
    FailureMessage = "retCode的返回值有误";
}

示例2:

验证respone中retMsg的值是否与预期一致:

import org.json.*;

//获取上一个请求的返回
String jsonString = prev.getResponseDataAsString();
JSONObject responseJson = new JSONObject(jsonString);

//判断返回值是否和预期一致
String retMsg = responseJson.getString("retMsg");
if (!retMsg.equals("result_success")) {
    //把断言失败置为真,即用例失败,并在结果树中显示FailureMessage
    Failure = true;
    FailureMessage = "retMsg与实际值不一致";
}

示例3:

使用变量进行断言:

添BeanShell 后置处理器

import org.json.*;

//获取上一个请求的返回值
String response = prev.getResponseDataAsString();
//将返回值转换为json
JSONObject responseJson = new JSONObject(response);
//获取responseMessage
String message = responseJson.getString("retMsg");
log.info("message的值:" + message);
//使用vars.put()方法储存变量message
vars.put("message",message);

在后面如需要使用变量message,可以使用${message}来获取变量的值。

可以添加调试取样器,在结果树中查看变量是否被取到。

 变量储存好后,在需要断言的接口后面添加BeanShell断言,使用Failrue来标识断言失败,FailureMessage标示断言失败的原因,如:

//使用vars.get()方法获取变量的值
String message= vars.get("message");

if(!message.equals("result_success")) {
    Failure = true;
    FailureMessage = "规则解析失败";
}else{
    FailureMessage = "规则解析成功";
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值