我正在尝试使用.csv数据输入来适应已经必须运行的脚本。当脚本在没有.csv的情况下运行时,它可以完美运行,适合我选择使用的任何配置。当它使用.csv运行时,第一行中的任何情况都将运行完美,但是此后的所有操作都会失败。失败的原因是因为我的某些变量已从第一个线程重用,我不知道如何阻止这种情况的发生。
这是我的脚本的样子:
HTTP请求-GET $ {url}(URL在CSV数据输入中声明,并且每次运行都会更改)
->后处理器,可提取Variable_1,Variable_2和Variable_3
Sampler1
-> JSR223预处理器:使用javascript创建有效负载采样器1,例如:
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));
Sampler2
-> JSR223预处理器:使用javascript创建有效负载采样器1(与上述相同,但值不同)
Sampler3
-> JSR223预处理器:使用javascript创建有效负载采样器1(与上述相同,但值不同)
采样器4
-> JSR223预处理器:使用javascript创建有效负载采样器1(与上述相同,但值不同)
HTTP请求-POST $ {url} / $ {Variable_1} / submit
-> JSR223预处理器:使用javascript创建有效载荷提交,并混合和匹配上述采样器的结果-像这样:
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会显示所有payloadSamplers的值,并且正确更改了所有变量以匹配新行数据(来自csv),但是最终变量payloadSubmit仅重用第一个变量的值线程迭代。
示例:
在第一次迭代结束时调试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 Sampler的主体上使用vars.get(“ payloadSubmit”),则会收到错误消息,因此这不是一种选择。如果我在创建变量的采样器上使用vars.get(“ payloadSampler1”),则会添加额外的转义字符,这会破坏JSON。我尝试在变量名的末尾添加一个计数器,并在每次线程迭代时使该计数器增加,但是结果是相同的。除最后一个变量外的所有变量和采样器均具有更新的值,但最后一个变量将始终重用第一次线程迭代中的变量。
我也尝试使用$ {__ javaScript(vars.get(“ payloadSubmit _” + vars.get(“ ThreadIteration”)))},但结果始终相同。
我也尝试过使用$ {__ counter(,)}元素,但是如果我将其设置为TRUE,则每次线程迭代将始终为1,如果将其设置为FALSE,则它将从2开始(我认为这是因为我在该线程内的另一个采样器中使用了计数器-但是即使删除了该计数器,这种情况仍然会发生。
我显然做错了(或很多事情)。
如果任何人都能发现我的错误,我将非常感谢听到您的想法。甚至指向一些我可以阅读的资源,以获取可以用于此目的的方法。我对javascript和jmeter的知识都不是很好,所以我总是愿意学习更多并纠正错误。
最后,非常感谢您阅读本文并尝试理解它。
答案 0 :(得分:0)
在不查看这些someVar
和payload
的值的情况下很难分辨出您的确切问题所在,很可能无法将某些内容解析为有效的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数据的更多信息。