如何从无服务器火炮中的随机 JSON 索引捕获属性
How to capture an attribute from a random JSON index in serverless artillery
在 Artillery 中,如何捕获从 GET 返回的 JSON 数组中随机索引的属性,以便我的后续 POST 均匀分布在资源中?
我正在使用 serverless artillery 到 运行 负载测试,它在后台使用 artillery.io 。
我的很多场景都是这样的:
-
get:
url: "/resource"
capture:
json: "$[0].id"
as: "resource_id"
-
post:
url: "/resource/{{ resource_id }}/subresource"
json:
body: "Example"
获取资源列表,然后POST到其中一个资源。
如您所见,我正在使用 capture
从 JSON 响应中捕获 ID。我的问题是它总是从数组的第一个索引中获取 id。
这意味着在我的负载测试中,我最终会完全攻击一个资源,而不是均匀地攻击它们,这将是一种更有可能的情况。
我希望能够做类似的事情:
capture:
json: "$[RANDOM].id
as: "resource_id"
但我无法在 JSON路径定义中找到允许我这样做的任何内容。
在自定义 JS 代码中定义 setResourceId 函数并告诉 Artillery 加载您的自定义代码,将 config.processor 设置为 JS 文件路径:
processor: "./custom-code.js"
- get:
url: "/resource"
capture:
json: "$"
as: "resources"
- function: "setResourceId"
- post:
url: "/resource/{{ resourceId }}/subresource"
json:
body: "Example"
自定义-code.js 包含以下函数的文件
function setResourceId(context, next) {
const randomIndex = Math.round(Math.random() * context.vars.resources.length);
context.vars.resourceId = context.vars.resources[randomIndex].id;
}
使用这个版本:
------------ Version Info ------------
Artillery: 1.7.9
Artillery Pro: not installed (https://artillery.io/pro)
Node.js: v14.6.0
OS: darwin/x64
上面的答案对我不起作用。
我从 here 那里获得了更多信息,并通过以下更改使其正常工作:
function setResourceId(context, events, done) {
const randomIndex = Math.round(Math.random() * (context.vars.resources.length - 1));
context.vars.resourceId = context.vars.resources[randomIndex].id;
return done();
}
module.exports = {
setResourceId: setResourceId
}
在 Artillery 中,如何捕获从 GET 返回的 JSON 数组中随机索引的属性,以便我的后续 POST 均匀分布在资源中?
我正在使用 serverless artillery 到 运行 负载测试,它在后台使用 artillery.io 。
我的很多场景都是这样的:
-
get:
url: "/resource"
capture:
json: "$[0].id"
as: "resource_id"
-
post:
url: "/resource/{{ resource_id }}/subresource"
json:
body: "Example"
获取资源列表,然后POST到其中一个资源。
如您所见,我正在使用 capture
从 JSON 响应中捕获 ID。我的问题是它总是从数组的第一个索引中获取 id。
这意味着在我的负载测试中,我最终会完全攻击一个资源,而不是均匀地攻击它们,这将是一种更有可能的情况。
我希望能够做类似的事情:
capture:
json: "$[RANDOM].id
as: "resource_id"
但我无法在 JSON路径定义中找到允许我这样做的任何内容。
在自定义 JS 代码中定义 setResourceId 函数并告诉 Artillery 加载您的自定义代码,将 config.processor 设置为 JS 文件路径:
processor: "./custom-code.js"
- get:
url: "/resource"
capture:
json: "$"
as: "resources"
- function: "setResourceId"
- post:
url: "/resource/{{ resourceId }}/subresource"
json:
body: "Example"
自定义-code.js 包含以下函数的文件
function setResourceId(context, next) {
const randomIndex = Math.round(Math.random() * context.vars.resources.length);
context.vars.resourceId = context.vars.resources[randomIndex].id;
}
使用这个版本:
------------ Version Info ------------
Artillery: 1.7.9
Artillery Pro: not installed (https://artillery.io/pro)
Node.js: v14.6.0
OS: darwin/x64
上面的答案对我不起作用。
我从 here 那里获得了更多信息,并通过以下更改使其正常工作:
function setResourceId(context, events, done) {
const randomIndex = Math.round(Math.random() * (context.vars.resources.length - 1));
context.vars.resourceId = context.vars.resources[randomIndex].id;
return done();
}
module.exports = {
setResourceId: setResourceId
}