Jmeter基础篇(19)JSR223预处理器

前言

JSR223预处理器是Apache JMeter中的一个组件,它允许用户使用任何支持Java Scripting API (JSR 223) 的脚本语言来执行预处理任务。这个功能非常强大,因为它让测试人员能够利用如Groovy、JavaScript(Nashorn引擎)、BeanShell等脚本来增强JMeter测试计划的能力。

一、JSR223的使用场景

● 动态生成数据:比如在性能测试中需要动态生成请求参数。

● 复杂逻辑处理:当内置的JMeter元件无法满足需求时,可以通过编写脚本来实现更复杂的逻辑。

● 外部系统集成:通过脚本与数据库或其他外部系统交互,获取或更新数据。

二、如何配置JSR223预处理器

  1. 打开JMeter测试计划,并找到想要添加预处理器的地方(一般在Sampler之前)。

  2. 右键点击所选位置 -> Add -> Pre Processors -> JSR223 PreProcessor。

  3. 在打开的JSR223预处理器界面中,您可以设置如下选项:
    ○ Name: 给预处理器命名。
    ○ Script Language: 选择希望使用的脚本语言,默认为groovy。
    ○ Parameters: 如果脚本需要接受参数的话,可以在这里定义。
    ○ Script: 这里输入实际要运行的脚本代码。

  4. 编写脚本。例如,如果想用Groovy来设置一个变量,你可以这样写:

    // 设置名为myVar的JMeter变量
    vars.put("myVar", "这是一段使用Groovy script写的脚本")

  5. 确保保存了更改后,就可以像平常一样运行测试计划了。

三、实际使用

我在测试过程中的实际使用场景为:在某省级发改委项目中,我需要让每一次提交的数据的ID都保持不同,防止插入数据时由于主键重复发生报错,于是借助JSR223预处理器的能力,实现每一次请求过程中动态更换json中的ID信息。具体脚本内容如下:

复制代码
import groovy.json.JsonSlurper
import groovy.json.JsonOutput

// 读取原始的Body Data
def jsonStr = """
{
    "formId":"5d649dcfcb670b4d9619094e21a8f479",
    "catalog_id":"",
    "id":"6717674560b21ae3c1691e04",
    "projectName":"xxxName",
    "projectType":"10",
    "projectLevel":"xxx测试项目",
    "projectAddress":"xxx测试项目",
    "projectQymc":"xxx测试企业20241012",
    "projectTitle":"xxx测试项目",
}
"""

// 解析JSON
def json = new JsonSlurper().parseText(jsonStr)

// 获取当前时间(毫秒)
def currentTimeMillis = System.currentTimeMillis()

// 生成6位随机数
def randomNum = (Math.random() * 900000 + 100000) as int

// 拼接字符串
def suffix = "${currentTimeMillis}${randomNum}"

// 遍历所有字段并替换"formId"
json.each { key, value ->
    if (value instanceof String && value.contains("6717674560b21ae3c1691e04")) {
        json[key] = value.replaceAll("6717674560b21ae3c1691e04", "6717674560b21ae3c1691e04${suffix}")
    }
}

// 将修改后的JSON转换回字符串
def updatedJsonStr = JsonOutput.toJson(json)

// 设置新的Body Data
sampler.getArguments().removeArgument(0)
sampler.addNonEncodedArgument("", updatedJsonStr, "")

通过这种方式,可以尽可能保障每一次调用过程中,json中的formId内容是不同的,防止出现由于主键重复而导致的报错。脚本的具体摆放位置如下:


复制代码
测试开发工程师一只,也在不断的学习阶段,平时的小经验不定期分享。
希望看我写的文字的人,可以少走弯路 祝工作学习顺利。
博主经验有限,若有不足,欢迎交流,共同改进~
愿与同在CSDN的你共同进步。

作者 | 千川
相关推荐
1candobetter12 小时前
JMeter + ServerAgent 压测监控实践
jmeter
查拉图斯特拉面条2 天前
JMeter 实战技巧:JSON 数组筛选指定对象并剔除首尾大括号
jmeter·json
查拉图斯特拉面条2 天前
JMeter 实战:JSON 响应中文节点 + 数值精准断言(附真实接口案例)
jmeter·json
qq_4924484464 天前
Jmeter Transaction Controller(事务控制器) 的 TPS(每秒事务数)严格固定为 1
java·开发语言·jmeter
Rookie_hh4 天前
使用Jmeter进行性能测试
jmeter
qq_452396237 天前
第十四篇:《JMeter插件扩展:自定义函数与第三方插件》
开发语言·python·jmeter
qq_452396237 天前
第十三篇:《分布式压测:JMeter Master-Slave集群》
分布式·jmeter
qq_452396238 天前
第十一篇:《性能压测基础:JMeter线程模型与压测策略设计》
java·开发语言·jmeter
沫沫-小白8 天前
JMeter 上传固定文件时,如何修改 Content-Disposition 的 filename
jmeter
qq_452396239 天前
第六篇:《JMeter逻辑控制器:循环、条件和交替执行》
android·java·jmeter