JMeter之BeanShell示例(基础&电商业务)

2309 篇文章 32 订阅
1220 篇文章 7 订阅

在这里插入图片描述
在Apache JMeter中,BeanShell是一种强大的预处理器、后处理器和取样器,可以用来执行自定义Java脚本。利用BeanShell,测试人员能够编写复杂的业务逻辑来处理JMeter的请求数据或响应结果,甚至可以根据需要动态地生成和修改测试数据。

利用BeanShell编写自定义脚本处理复杂业务逻辑的基本步骤和示例:

步骤:

添加BeanShell组件:

在JMeter测试计划中,根据需求将BeanShell Sampler、BeanShell PreProcessor 或 BeanShell PostProcessor 添加到线程组下的相应位置。

编写脚本:

打开选定的BeanShell组件,在“Script”区域输入或粘贴你的Java或BeanShell脚本。

可以访问JMeter内置变量(如${variable}),以及通过vars对象访问用户定义的变量,使用props对象访问属性文件中的值。

调用JMeter API方法:

在BeanShell脚本中可以直接调用JMeter提供的API方法,例如设置变量、获取系统信息、处理HTTP请求等。

调试与运行脚本:

如果需要检查脚本的输出或变量状态,可以使用log.info()方法打印日志信息到jmeter.log文件。

运行测试计划,观察控制台输出或监听器的结果,确保脚本按预期工作。

示例脚本: 假设我们有一个场景,需要从上一个HTTP响应中提取某个JSON字段,并将其作为下一个请求的参数传递:

import org.json.JSONObject;
// 获取上一个HTTP响应体内容
String prevResponse = new String(prev.getResponseData());
// 将响应体转换为JSON对象
JSONObject jsonObject = new JSONObject(prevResponse);
// 提取名为"item_id"的字段
String itemId = jsonObject.getString("item_id");
// 设置新的变量用于后续请求
vars.put("next_request_item_id", itemId);

上述脚本首先获取了前一个HTTP响应的内容,然后将其解析为JSON对象,从中提取了"item_id"字段的值,并将其存储在一个新的JMeter变量next_request_item_id中,该变量可以在后续的HTTP请求中引用。

注意:虽然BeanShell支持Java语法,但由于性能原因,从JMeter 3.1版本开始推荐使用JSR223 Sampler并选择Groovy语言进行脚本编写。

电商测试示例

示例1:动态生成订单号

场景:模拟创建新订单时,需要为每个请求生成唯一的订单号。

import java.util.UUID;
// 生成唯一订单号
String orderId = UUID.randomUUID().toString();
// 设置到变量中以便后续请求使用
vars.put("order_id", orderId);
log.info("Generated unique order ID: " + orderId);

示例2:从响应提取并更新购物车商品数量

场景:在获取购物车详情后,根据响应内容动态调整某个商品的数量。

假设响应数据如下(JSON格式):

Json
{
  "cart": [
    {
      "id": "product1",
      "quantity": 2,
      "name": "Product A"
    },
    {
      "id": "product2",
      "quantity": 1,
      "name": "Product B"
    }
  ]
}
BeanShell PostProcessor脚本:
import org.json.*;
// 获取响应数据
String response = new String(prev.getResponseData());
// 解析JSON
JSONObject jsonObject = new JSONObject(response);
JSONArray cartItems = jsonObject.getJSONArray("cart");
// 遍历购物车商品,找到指定商品并更新数量
for (int i = 0; i < cartItems.length(); i++) {
    JSONObject item = cartItems.getJSONObject(i);
    if ("product2".equals(item.getString("id"))) { // 假设我们想增加"Product B"的数量
        int currentQuantity = item.getInt("quantity");
        item.put("quantity", currentQuantity + 1); // 增加一个单位
        vars.put("new_product_b_quantity", Integer.toString(currentQuantity + 1)); // 存储新的数量到变量中
    }
}
// 更新后的cartItems可以序列化后设置回请求体,如果下一个请求是更新购物车操作
String updatedCartJson = jsonObject.toString();
vars.put("updated_cart", updatedCartJson);

示例3:登录令牌的管理与重置

场景:用户登录后获得一个有效期较短的令牌(token),在每次发起需授权的请求前都需要检查和更新这个令牌。

String token = vars.get("user_token"); // 获取当前存储的令牌
long currentTime = System.currentTimeMillis() / 1000; // 当前时间戳(秒)
// 检查令牌是否过期(假设令牌过期时间为3600秒)
if (token != null && currentTime - Long.parseLong(vars.get("token_expiration_time")) > 3600) {
    // 令牌过期,重新登录获取新令牌
    // 这里简略了登录过程,实际上会包含发送登录请求、解析响应并提取新令牌的过程
    // ...
    // 假设 login 方法返回新的令牌和过期时间
    MaptokenInfo = login(username, password);
    token = tokenInfo.get("token");
    vars.put("user_token", token);
    vars.put("token_expiration_time", Long.toString(currentTime + tokenInfo.get("expiration_seconds")));
}
// 将最新的令牌添加到HTTP Header中
sampler.getHeaderManager().add(new Header("Authorization", "Bearer " + token));

示例4:动态价格加载和比较

场景:在商品详情页抓取实际显示的价格,并与数据库中存储的价格进行对比,确保两者一致。

// 从响应中提取实际显示的商品价格
String response = prev.getResponseDataAsString();
int displayedPrice = -1;
Matcher matcher = Pattern.compile("(\\d+(?:\\.\\d+)?)").matcher(response);
if (matcher.find()) {
    displayedPrice = Float.parseFloat(matcher.group(1)); // 假设价格是以文本形式展示的
}
// 获取数据库中存储的价格
String storedPriceStr = vars.get("stored_product_price");
double storedPrice = Double.parseDouble(storedPriceStr);
// 比较并记录结果
if (displayedPrice != storedPrice) {
    log.error("商品价格不匹配! 显示价格: " + displayedPrice + ", 存储价格: " + storedPrice);
    Failure = true; // 设置失败标志,可在后续逻辑中处理错误
} else {
    log.info("商品价格校验成功,显示价格与存储价格一致。");
}

示例5:模拟库存同步

场景:当订单创建成功后,根据返回信息更新库存(在测试环境中)。

假设订单创建响应包含商品ID及其数量:

Json
{
  "order": {
    "id": "1234",
    "items": [
      {
        "productId": "productA",
        "quantity": 5
      },
      {
        "productId": "productB",
        "quantity": 3
      }
    ]
  }
}
BeanShell PostProcessor脚本:
import org.json.*;
String response = prev.getResponseDataAsString();
JSONObject orderJson = new JSONObject(response);
JSONArray items = orderJson.getJSONArray("items");
for (int i = 0; i < items.length(); i++) {
    JSONObject item = items.getJSONObject(i);
    String productId = item.getString("productId");
    int quantity = item.getInt("quantity");
    // 假设有一个全局变量或集合用于管理库存,这里仅做演示
    int currentStock = Integer.parseInt(vars.get("stock_" + productId));
    currentStock -= quantity; // 减去已售出的数量
    vars.put("stock_" + productId, Integer.toString(currentStock));
    log.info("产品 " + productId + " 库存更新为: " + currentStock);
}
 

以上案例展示了BeanShell在电商流程中的应用,但请注意,在实际性能测试中应尽量避免使用BeanShell,因其执行效率相对较低。推荐使用JSR223 Sampler配合Groovy语言以获得更好的性能。

行动吧,在路上总比一直观望的要好,未来的你肯定会感 谢现在拼搏的自己!如果想学习提升找不到资料,没人答疑解惑时,请及时加入群: 759968159,里面有各种测试开发资料和技术可以一起交流哦。

最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取 【保证100%免费】

在这里插入图片描述

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。在这里插入图片描述
在这里插入图片描述在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值