JMeter 重用以前的线程有效负载而不是新的线程有效负载

Posted

技术标签:

【中文标题】JMeter 重用以前的线程有效负载而不是新的线程有效负载【英文标题】:JMeter reusing previous thread payload instead of new thread payload 【发布时间】:2018-11-29 02:09:00 【问题描述】:

我正在尝试调整我必须使用 .csv 数据输入运行的脚本。当脚本在没有 .csv 的情况下运行时,它对于我选择使用的任何配置都可以完美运行。当它使用 .csv 运行时,第一行中的任何场景都将完美运行,但从那里开始的一切都会失败。失败的原因是因为我的一些变量从第一个线程被重用,我不知道如何阻止这种情况发生。

这就是我的脚本的样子:

HTTP 请求 - GET $url(url 在 CSV 数据输入中声明,每次运行都会更改)

-> 提取 Variable_1、Variable_2 和 Variable_3 的后处理器

采样器1

-> JSR223预处理器:使用javascript创建payloadSampler1,示例:

var payloadSampler1 =  ;
payloadSampler1.age = vars.get("Variable_2");
payloadSampler1.birthDate = "1980-01-01";
payloadSampler1.phone = ;
payloadSampler1.phone.number = "555-555-5555";
vars.put("payloadSampler1", JSON.stringify(payloadSampler1));

采样器2

-> JSR223 预处理器:使用 javascript 创建 payloadSampler1(与上面相同,但值不同)

采样器3

-> JSR223 预处理器:使用 javascript 创建 payloadSampler1(与上面相同,但值不同)

采样器4

-> JSR223 预处理器:使用 javascript 创建 payloadSampler1(与上面相同,但值不同)

HTTP 请求 - POST $url/$Variable_1/submit

-> JSR223 预处理器:使用 javascript 创建 payloadSubmit,并混合和匹配来自上述采样器的结果 - 像这样:

var payloadSubmit =  ;
if (vars.get("someVar") != "value" && vars.get("someVar") != "value2" && vars.get("differentVar") != "true") 
    payloadSubmit.ageInfo = [$payloadSampler1];

if (vars.get("someVar2") != "true") 
    payloadSubmit.paymentInfo = [$payloadSampler2];

payloadSubmit.emailInfo = [$payloadSampler3"];
payloadSubmit.country = vars.get("Variable_3");
vars.put("payloadSubmit", JSON.stringify(payloadSubmit));

-> BodyData 如截图所示:

request

我有一个 Debug PostProcessor 来查看我正在创建的所有这些变量的值。对于我的脚本的第一次迭代,一切都很完美。然而,对于第二个,Debug PostProcessor 显示所有 payloadSampler 的值,并且所有变量都正确更改以匹配新的行数据(来自 csv),但是,最后一个变量,payloadSubmit 只是重用第一个的任何值线程迭代。

例子:

Debug PostProcessor 在第一次迭代结束时显示:

Variable_1=ABC
Variable_2=DEF
Variable_3=GHI
payloadSampler1="age":"18","email":null,"name":"firstName":"Charles","age":"38","email":null
payloadSampler2="paymentChoice":"cardType":"CreditCard","cardSubType":"VI","amount":"9.99","currency":"USD"
payloadSampler3="email":"tes@email.com"
payloadSubmit="ageInfo":["age":"18","email":null,"name":"firstName":"Charles","age":"38","email":null],"paymentInfo":["paymentChoice":"cardType":"CreditCard","cardSubType":"VI","amount":"9.99","currency":"USD"],"emailInfo":["email":"tes@email.com"],"country":"GHI"

但在第二次迭代结束时,它显示:

Variable_1=123
Variable_2=456
Variable_3=789
payloadSampler1="age":"95","email":null,"name":"firstName":"Sam","age":"12","email":null
payloadSampler2="paymentChoice":"cardType":"CreditCard","cardSubType":"DC","amount":"19.99","currency":"USD"
payloadSampler3="email":"tes2@email.com"
payloadSubmit="ageInfo":["age":"18","email":null,"name":"firstName":"Charles","age":"38","email":null],"paymentInfo":["paymentChoice":"cardType":"CreditCard","cardSubType":"VI","amount":"9.99","currency":"USD"],"emailInfo":["email":"tes@email.com"],"country":"USA"

我还可以看到最终的 HTTP 请求确实在发送旧值。

我的理解非常有限,因为我正在调用像“$payloadSampler1”这样的变量,它将使用第一次运行采样器时设置的值(回到第一次线程迭代中)。这些是我尝试过的事情:

如果我在 HTTP 采样器的主体上使用 vars.get("payloadSubmit") ,我会收到一个错误,所以这不是一个选项。如果我在创建变量的采样器上使用 vars.get("payloadSampler1") ,则会添加额外的转义字符,这会破坏我的 JSON。我尝试在变量名的末尾添加一个计数器,并在每次线程迭代时增加该计数器,但结果是相同的。除最后一个之外的所有变量和采样器都有更新的值,但最后一个将始终重用第一次线程迭代中的变量。

我也试过用$__javaScript(vars.get("payloadSubmit_"+vars.get("ThreadIteration"))),但结果总是一样。

我也尝试过使用 $__counter(,) 元素,但如果我将其设置为 TRUE,则每次线程迭代它始终为 1,如果我将其设置为 FALSE,则它从 2 (我假设这是因为我在该线程中的另一个采样器中使用了计数器 - 但即使在删除该计数器之后,这种情况仍然会发生。

我显然做错了什么(或很多事情)。

如果有人能发现我的错误,我将非常感谢您的想法。或者甚至被指向一些我可以阅读的资源,以获得我可以使用的方法。我对 javascript 和 jmeter 的了解都不是很好,所以我总是乐于学习更多并纠正我的错误。

最后,非常感谢您阅读这堵文字墙并尝试理解它。

【问题讨论】:

【参考方案1】:

    如果没有看到这些 someVarpayload 的值,很难判断您的问题到底出在哪里,很可能无法将某些内容解析为有效的 JSON,因此在第二次迭代中,您的最后一个 JSR223 PostProcessor 无法运行到最后结果你的payloadSubmit 变量值没有得到更新。仔细查看 JMeter GUI,那里有一个带有感叹号的黄色三角形,表示脚本中的错误数量。它还会在点击时打开JMeter Log Viewer

    如果三角形旁边有一个红色数字 - 显然您有问题,您需要查看 jmeter.log 文件以了解详细信息。

    Since JMeter 3.1 it is recommended to use Groovy language 用于任何形式的脚本,主要是因为Groovy has higher performance comparing to other scripting options。查看Parsing and producing JSON 指南,详细了解如何在 Groovy 中使用 JSON 数据。

【讨论】:

非常感谢,德米特里。我将调查可能存在的任何错误,以及使用 Groovy。 这里留个便条,以防有人好奇。我解决了这个问题。我可以选择“缓存已编译的脚本脚本(如果可用)”。取消选中它就可以了。感谢所有花时间思考这个问题的人!

以上是关于JMeter 重用以前的线程有效负载而不是新的线程有效负载的主要内容,如果未能解决你的问题,请参考以下文章

jmeter结果分析(图形报表和聚合报告)

jmeter - jp@gc - Active Threads Over Time(多台负载用户)

JMeter 中是不是有更多线程安全变量可用于 get() 和 set() 变量?

Jmeter运行原理

java线程

jmeter聚合报告中响应时间的单位是秒,还是微秒