【发布时间】: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 如截图所示:
我有一个 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 的了解都不是很好,所以我总是乐于学习更多并纠正我的错误。
最后,非常感谢您阅读这堵文字墙并尝试理解它。
【问题讨论】:
标签: javascript jmeter