一次营销试算接口压测(jmeter+groovy)

事情是这样的公司每月有大促,但是一次大促的时候没有提前做压测,导致pos无法收银,损失很多,所以就打算坐下试算接口的压测

1.测试场景:一个试算接口可能加购一个商品,或者加购多个商品,每个商品有多个信息,比如条码,价格,门店

2.分析:刚开始写压测脚本的时候想的是引入csv文件,但是看上图画红线的部分数据太多了,而且如果是上图画黑线的部分,那么我还要引入多个csv文件,并且还要实现随机加购一件或者多件,那么可能还需要jmeter的循环,这个太复杂直接放弃,这个时候想到了使用groovy文件定制化操作

3.找到要做压测的接口-右键添加-前置处理气-JSR223PreProcessor

复制代码
import java.util.UUID
import groovy.json.JsonBuilder
import java.util.Random
import java.text.SimpleDateFormat
// 定义商品数据池
def products = [
    [shopsku: "51682680313", merchantsku: "8345", productId: "1001574",barcode:"2800001026",plu:"26117",price:"230"],
    [shopsku: "51682601313", merchantsku: "8342", productId: "1001575",barcode:"2800001025",plu:"26116",price:"260"],
    [shopsku: "51682526313", merchantsku: "8339", productId: "1001576",barcode:"2800001024",plu:"26115",price:"100"],
    [shopsku: "51682447313", merchantsku: "8336", productId: "1001576",barcode:"2800001023",plu:"26114",price:"240"]
]

// 随机决定购物车中的商品数量(1-3个)
def itemCount = new Random().nextInt(3) + 1
def cartItems = []
def receiptno= new SimpleDateFormat("yyMMddHHmmssS").format(new Date())

// 为每个商品项生成唯一数据
for (int i = 0; i < itemCount; i++) {
    def randomProduct = products[new Random().nextInt(products.size())]
    def cartItem = [
        "cartItemId": UUID.randomUUID().toString(),
        "shopItemSkuId": randomProduct.shopsku,
        "salePrice": randomProduct.price,
        "quantity": String.format("%.3f", 0.03 + new Random().nextDouble() * 0.02),
        "categoryId": 10040701,
        "weightType": 1,
        "productType": 1,
        "merchantItemSkuId": randomProduct.merchantsku,
        "basicPrice": randomProduct.price,
        "productId": randomProduct.productId,
        "barcode": randomProduct.barcode,
        "plu": randomProduct.plu
    ]
    cartItems.add(cartItem)
}


// 构建完整JSON请求体
def params = [
    "shop_id": "800000313",
    "cart_items": cartItems,
    "sn": "b51d40cc263992bb",
    "receipt_no": "POSA00315"+receiptno,
    "pickupOrderNo": "",
    "fullGiftCalculateFlow": 1,
    "userId":[0, 1404984][new Random().nextInt(2)] ,
    "selectedDiscountMemberPoint": 0,
    "isFinal": 2,
    "freshCalculateFlow": 1
]

// 构建完整API请求体
def requestBody = [
    "params": params,
    "timestamp": System.currentTimeMillis(),
    "version": "1.0",
    "nonce": UUID.randomUUID().toString(),
    "api": "ypsx.pos.order.v1.OrderService.CalcOrder"
]

// 转换为JSON字符串并存储为变量
def jsonString = new JsonBuilder(requestBody).toPrettyString()
vars.put("dynamicCartPayload", jsonString)

log.info("成功生成包含 " + itemCount + " 个商品的购物车数据")

把groovy脚本中输出的数据写入到接口的请求入参中

4.最终的体会就是使用groovy脚本做压测脚本定制化程度高再也不用去学习jmeter中一系列超级多的功能了

相关推荐
爆更小哇4 天前
jmeter插件下载+创建梯度线程组+命令生成性能测试报告
测试工具·jmeter·自动化
抓到小松鼠5 天前
jmeter-事务控制器
jmeter
张永清-老清5 天前
每周读书与学习->Jmeter中如何使用Bean Shell脚本(三)Bean Shell的基础语法之运算符和控制流语句
学习·jmeter·性能优化·性能测试·jmeter性能测试·beanshell·每周读书与学习
张永清6 天前
每周读书与学习->Jmeter中如何使用Bean Shell脚本(三)Bean Shell的基础语法之运算符和控制流语句
jmeter·性能测试·性能调优·jmeter性能测试·性能分析·性能监控·性能诊断·每周读书与学习·bean shell
半个俗人6 天前
13.jmeter性能测试高并发及高频率弱压力及持续高并发
jmeter
程序员杰哥7 天前
Jmeter正则表达式提取器和JSON提取器基础用法
自动化测试·软件测试·测试工具·jmeter·正则表达式·json·测试用例
半个俗人7 天前
12.jmeter跨越线程组传值-全局变量
jmeter
半个俗人7 天前
14.jmeter图形化报告
jmeter
爆更小哇7 天前
JMeter配置和使用入门指南
java·开发语言·测试工具·jmeter·自动化