首页 > 解决方案 > 根据另一组随机数据随机化数据以在 Jmeter 中作为请求正文发送

问题描述

我是 Jmeter 脚本的新手,我尝试了一些功能。我在这里要做的是:

我有一个带有客户 ID 作为路径变量的 POST 请求,但我将其随机化:

http://endpoint/customers/${__RandomFromMultipleVars(customerId1|customerId2|customerId3, customer_id)}/verify

上面的行有效,它在三个客户 ID 中获取一个随机值,请求可能导致:

http://endpoint/customers/6fb5ef21-6b3e-4564-952f-e83df63a9907/verify

customerId1、customerId2 和 customerId3 来自配置元素:用户定义变量

现在,在响应正文中,我有这个 groovy 脚本而不是实际的 JSON 请求正文:

${__groovy(
    if ("${customer_id}" == "6fb5ef21-6b3e-4564-952f-e83df63a9907") {

    } else if ("${customer_id}" == "8f0b21e5-ddf6-42d4-b07e-6da09db6a611") {

    } else if ("${customer_id}" == "40aa4f1b-424b-40d2-8213-36a39f5c98b2") {

)}

我的问题是我不知道这是否可能,但是对于每个 if 语句,我想根据设置的客户 ID 再次随机化请求正文。

我试过做:

if ("${customer_id}" == "6fb5ef21-6b3e-4564-952f-e83df63a9907") {
    ${__RandomFromMultipleVars(resp1|resp2|resp3)}          
}

但它导致了一个错误。我试过只返回一个简单的字符串:

if ("${customer_id}" == "6fb5ef21-6b3e-4564-952f-e83df63a9907") {
   "TEST"       
}

它有效,字符串“TEST”被用作请求正文。我真的不确定如何继续前进。我感谢任何意见或建议。谢谢!

标签: groovyjmeter

解决方案


根据JSR223 采样器文档:

JMeter 在将脚本字段传递给解释器之前会处理函数和变量引用,因此这些引用只会被解析一次。脚本文件中的变量和函数引用将逐字传递给解释器,这很可能导致语法错误。为了使用运行时变量,请使用适当的 props 方法,例如

props.get("START.HMS");

props.put("PROP1","1234");

所以请记住,您不应该将JMeter 函数和/或变量内联到 Groovy 脚本中。而不是像${customer_id}您应该使用vars速记那样访问变量,它代表JMeterVariables类实例。

如果你想继续使用__groovy() 函数,你正在寻找的语法应该是这样的:

${__groovy(if (vars.get('customer_id').equals('6fb5ef21-6b3e-4564-952f-e83df63a9907')) { return vars.get('resp' + org.apache.commons.lang3.RandomUtils.nextInt(1\, 4))},)}

演示:

  • 在测试计划级别定义的变量

    在此处输入图像描述

  • Groovy 脚本在行动:

    在此处输入图像描述

有关 JMeter 中 Groovy 脚本的更多信息:Apache Groovy - 为什么以及如何使用它


推荐阅读