前言
JSR223预处理器是Apache JMeter中的一个组件,它允许用户使用任何支持Java Scripting API (JSR 223) 的脚本语言来执行预处理任务。这个功能非常强大,因为它让测试人员能够利用如Groovy、JavaScript(Nashorn引擎)、BeanShell等脚本来增强JMeter测试计划的能力。
一、JSR223的使用场景
● 动态生成数据:比如在性能测试中需要动态生成请求参数。
● 复杂逻辑处理:当内置的JMeter元件无法满足需求时,可以通过编写脚本来实现更复杂的逻辑。
● 外部系统集成:通过脚本与数据库或其他外部系统交互,获取或更新数据。
二、如何配置JSR223预处理器
- 打开JMeter测试计划,并找到想要添加预处理器的地方(一般在Sampler之前)。
- 右键点击所选位置 -> Add -> Pre Processors -> JSR223 PreProcessor。
- 在打开的JSR223预处理器界面中,您可以设置如下选项:
○ Name: 给预处理器命名。
○ Script Language: 选择希望使用的脚本语言,默认为groovy。
○ Parameters: 如果脚本需要接受参数的话,可以在这里定义。
○ Script: 这里输入实际要运行的脚本代码。 - 编写脚本。例如,如果想用Groovy来设置一个变量,你可以这样写:
// 设置名为myVar的JMeter变量
vars.put("myVar", "这是一段使用Groovy script写的脚本")
- 确保保存了更改后,就可以像平常一样运行测试计划了。
三、实际使用
我在测试过程中的实际使用场景为:在某省级发改委项目中,我需要让每一次提交的数据的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内容是不同的,防止出现由于主键重复而导致的报错。脚本的具体摆放位置如下:
测试开发工程师一只,也在不断的学习阶段,平时的小经验不定期分享。
希望看我写的文字的人,可以少走弯路 祝工作学习顺利。
博主经验有限,若有不足,欢迎交流,共同改进~
愿与同在****的你共同进步。
作者 | 千川