1

在 Artillery 中,如何在从 GET 返回的 JSON 数组中捕获随机索引的属性,以便我后续的 POST 均匀分布在资源中?

https://artillery.io/docs/http-reference/#extracting-and-reusing-parts-of-a-response-request-chaining

我正在使用无服务器火炮来运行负载测试,该测试在后台使用 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"

但我一直无法在 JSONPath 定义中找到任何可以让我这样做的东西。

4

2 回答 2

4

在自定义 JS 代码中定义 setResourceId 函数并告诉 Artillery 加载您的自定义代码,将 config.processor 设置为 JS 文件路径:

处理器:“./custom-code.js”

   - get:
      url: "/resource"
      capture:
        json: "$"
        as: "resources"
  - function: "setResourceId"
  -  post:
      url: "/resource/{{ resourceId }}/subresource"
      json:
        body: "Example"

包含以下函数的 custom-code.js 文件

function setResourceId(context, next) {
    const randomIndex = Math.round(Math.random() * context.vars.resources.length);
    context.vars.resourceId = context.vars.resources[randomIndex].id;
}
于 2019-10-30T07:09:57.617 回答
1

使用这个版本:

------------ Version Info ------------
Artillery: 1.7.9
Artillery Pro: not installed (https://artillery.io/pro)
Node.js: v14.6.0
OS: darwin/x64

上面的答案对我不起作用。

我从这里获得了更多信息,并使其与以下更改一起工作:

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
}
于 2021-09-29T12:05:21.027 回答