使用BeanShell 对比取出来的值

本文介绍如何使用JMeter的BeanShell断言进行请求结果验证。通过具体示例展示了如何利用jsonExtractor后置处理器抓取指定字符串,并利用BeanShell断言判断实际返回结果与预期是否一致。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

描述:

使用BeanShell 对比取出来的值,如不一致,报错

步骤一:

使用json Extractor后置处理器,取出"登入成功"

 

 

使用BeanS hell断言:

 语法:

if (!vars.get("request").equals("登入成功")) {
  Failure = true;
  FailureMessage = vars.get("request");
}

假如request的值不等于登入成功,那么报错

转载于:https://www.cnblogs.com/kaibindirver/p/9262283.html

<think>我们正在讨论的是如何将提取的_wafuid存储到变量fengcookie中,并且用户询问是否可以通过Beanshell实现类似功能。现有代码是JavaScript函数,它从HTTP响应头中提取_wafuid,并返回该。我们修改了代码,使其将结果存储在全局变量fengcookie中。但是,用户现在提到Beanshell,可能是因为在JMeter等性能测试工具中使用,因为引用[3][4][5]都提到了Beanshell在JMeter中的应用。因此,我们需要考虑两种场景:1.在普通的JavaScript环境中(如Node.js或浏览器)我们使用全局变量。2.在JMeter中使用Beanshell脚本,那么我们可以使用JMeter提供的API(如vars)来存储变量。由于用户之前的代码是JavaScript,而后续提到Beanshell,我们需要分别给出解决方案。我们先回顾一下用户的问题:用户想要将提取的_wafuid存储到变量fengcookie中,方便后续引用。同时询问是否可以通过Beanshell实现。因此,我们提供两种方案:方案一:在普通JavaScript环境中,使用全局变量(如之前的修改)。方案二:在JMeter的Beanshell脚本中,使用JMeter的变量。注意:引用[4]提到在Beanshell中可以直接调用Java代码,并且引用[5]展示了如何使用vars.put方法在JMeter中设置变量。下面分别给出两种方案的代码:方案一(普通JavaScript环境):我们已经修改了代码,使用全局变量fengcookie。但是,请注意,在浏览器中,全局变量可能会污染全局命名空间,所以我们可以将其挂载到一个特定的命名空间下。或者,在Node.js中,我们可以使用模块化的方式导出。但是,用户要求直接引用,我们仍使用全局变量,但要注意作用域。我们之前的代码是:letfengcookie=null;functionextractWafuid(headers){//...代码,匹配到后赋给fengcookie并返回}但是,如果这个函数在多个地方使用,我们可能需要考虑多个请求的情况,每次调用都会覆盖fengcookie。这取决于用户的使用场景。方案二(在JMeter的Beanshell使用):在JMeter中,Beanshell脚本可以使用内置对象,如vars,它是JMeterVariables的实例,用于读写变量。我们可以这样实现:在JMeter的Beanshell脚本中,我们可以写一个类似的函数,但是将结果存储到JMeter变量fengcookie中。注意:引用[4]中展示了如何在Beanshell中调用Java方法,以及引用[5]展示了vars.put的使用。但是,由于Beanshell脚本本身是Java语法的子集,我们可以这样写:```importorg.apache.jmeter.util.JMeterUtils;StringextractWafuid(Stringheaders){//分割响应头为行String[]lines=headers.split("\\\\r?\\\\n");//注意:实际响应头行分隔符可能是\r\nfor(Stringline:lines){Stringtrimmed=line.trim().toLowerCase();if(trimmed.startsWith("set-cookie:")){//提取cookie字符串StringcookieStr=trimmed.substring(11).trim();//正则匹配java.util.regex.Patternpattern=java.util.regex.Pattern.compile("_wafuid=([^;]+)");java.util.regex.Matchermatcher=pattern.matcher(cookieStr);if(matcher.find()){Stringwafuid=matcher.group(1);//存储到JMeter变量中vars.put("fengcookie",wafuid);returnwafuid;}}}return"NOT_FOUND";}//调用函数,假设从某个地方获取到响应头字符串//例如,如果响应头是从上一个请求的响应头中获取的,我们可以这样调用:Stringheaders=prev.getResponseHeaders();//假设prev是SampleResult对象,我们需要在Beanshell中获取//但是请注意,在JMeter的Beanshell中,可以直接使用prev变量(如果是在后置处理器中)extractWafuid(headers);```但是,在JMeter的Beanshell中,我们通常可以直接使用prev变量(在采样器的后置处理器中)来获取响应头。所以,我们可以这样:在JMeter的Beanshell后置处理器中,我们可以这样写:```//获取响应头Stringheaders=prev.getResponseHeaders();//然后调用上面的函数,或者直接写逻辑String[]lines=headers.split("\\\\r?\\\\n");for(Stringline:lines){Stringtrimmed=line.trim().toLowerCase();if(trimmed.startsWith("set-cookie:")){StringcookieStr=trimmed.substring(11).trim();java.util.regex.Patternpattern=java.util.regex.Pattern.compile("_wafuid=([^;]+)");java.util.regex.Matchermatcher=pattern.matcher(cookieStr);if(matcher.find()){Stringwafuid=matcher.group(1);vars.put("fengcookie",wafuid);break;}}}//如果没有找到,可以设置一个默认,或者不设置(变量为null)//如果需要,可以设置默认:vars.put("fengcookie","NOT_FOUND");```但是,为了代码复用,我们可以定义函数,但是在JMeter中,多个Beanshell元件之间无法共享函数,所以通常我们直接写逻辑。另外,引用[2]提到,在性能测试中推荐使用JSR223+Groovy,因为效率更高。所以,如果用户对性能要求高,可以考虑使用Groovy。我们也可以写一个Groovy脚本(在JSR223元件中)来实现:```defheaders=prev.getResponseHeaders();deflines=headers.split("\\\\r?\\\\n");for(lineinlines){deftrimmed=line.trim().toLowerCase();if(trimmed.startsWith("set-cookie:")){defcookieStr=trimmed.substring(11).trim();defmatcher=cookieStr=~/_wafuid=([^;]+)/if(matcher.find()){defwafuid=matcher.group(1);vars.put("fengcookie",wafuid);break;}}}```总结回答:根据使用环境的不同,有两种方法:1.在普通JavaScript环境:使用全局变量。2.在JMeter中:使用Beanshell或Groovy脚本,通过JMeter的vars对象存储变量。考虑到用户提到了Beanshell,我们重点提供了在JMeter中使用Beanshell的代码示例。注意:在使用JMeter脚本时,需要确保获取响应头的方式正确(例如使用prev.getResponseHeaders()),并且注意正则表达式的写法。由于用户可能是在JMeter环境中,所以我们建议如果对性能要求高,使用Groovy(JSR223)。下面按照要求组织回答:</think> ### JavaScript环境实现:全局变量存储 在通用JavaScript环境中,通过**全局变量**存储`_wafuid`是最直接的方式。以下是完整实现方案: ```javascript // ==== 全局存储区域 ==== let fengcookie = null; // 定义全局存储变量 // ==== 核心提取函数 ==== function extractWafuid(headers) { const lines = headers.split('\n'); for (const line of lines) { const trimmed = line.trim().toLowerCase(); if (trimmed.startsWith('set-cookie:')) { const match = trimmed.match(/_wafuid=([^;]+)/); if (match && match[1]) { // 赋给全局变量 fengcookie = match[1]; return fengcookie; // 同时返回 } } } return "NOT_FOUND"; } // ==== 使用示例 ==== const sampleHeaders = ` HTTP/1.1 200 OK Set-Cookie: _wafuid=7a3b8c1d; Path=/; Secure Content-Type: application/json `; extractWafuid(sampleHeaders); // 执行提取 // ==== 后续引用 ==== if (fengcookie) { console.log(`提取的WAF标识: ${fengcookie}`); // 此处可继续业务逻辑... } ``` **核心机制**: 1. **全局变量定义**:`let fengcookie = null`在顶层作用域声明存储变量 2. **传递赋**:函数内部通过`fengcookie = match[1]`实现安全赋[^1] 3. **空保护**:使用`if (fengcookie)`避免未定义错误[^3] 4. **生命周期**:全局变量在脚本运行期间持续有效 --- ### JMeter Beanshell实现 若在JMeter性能测试环境中,可通过**`vars`对象**实现线程安全存储,这是JMeter特有的变量存储机制[^5]: ```java // Beanshell脚本(置于JMeter的后置处理器) import org.apache.jmeter.util.JMeterUtils; String headers = prev.getResponseHeaders(); // 获取响应头 String[] lines = headers.split("\n"); for (String line : lines) { String trimmed = line.trim().toLowerCase(); if (trimmed.startsWith("set-cookie:")) { String cookieStr = trimmed.substring(11).trim(); java.util.regex.Pattern pattern = java.util.regex.Pattern.compile("_wafuid=([^;]+)"); java.util.regex.Matcher matcher = pattern.matcher(cookieStr); if (matcher.find()) { String wafuid = matcher.group(1); // 核心:存入JMeter变量池 vars.put("fengcookie", wafuid); break; } } } // 后续可直接用${fengcookie}引用 log.info("WAFUID >>> " + vars.get("fengcookie")); ``` **Beanshell关键点**: 1. **`vars.put()`方法**:线程安全的变量存储API[^5] 2. **`prev.getResponseHeaders()`**:获取HTTP响应头数据 3. **变量引用方式**:其他JMeter元件中通过`${fengcookie}`直接调用 4. **性能优化**:推荐配合JSR223+Groovy提升执行效率[^2] --- ### 两种方案对比 | **特性** | JavaScript全局变量 | Beanshell的`vars`对象 | |------------------|----------------------------------------|----------------------------------| | **作用域** | 当前脚本全局 | JMeter线程组内全局 | | **线程安全** | 不适合多线程 | 内置线程安全机制[^5] | | **存储位置** | 内存堆 | JMeter变量池 | | **生命周期** | 页面/脚本运行期间 | 整个测试计划运行期间 | | **适用场景** | 单页应用/Node.js环境 | JMeter性能测试[^3][^4] | | **引用方式** | `fengcookie` | `${fengcookie}` 或 `vars.get()` | > 📌 **选择建议** > - Web前端/Node.js项目 ➡️ 采用JavaScript全局变量方案 > - JMeter性能测试 ➡️ 采用Beanshell的`vars.put()`方案 > 注意在JMeter中优先使用**JSR223+Groovy**组合提升执行效率[^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值