K6 负载测试 - 如何为整个测试制作顺序 ID 运行

K6 Load Testing - How to make sequential id for entire test run

我有一个 api 端点,每个请求都需要一个不同的 id ,但是如何为所有 VU 共享的每次迭代创建一个 id 全局和顺序增量,就像数据库上的主键 table.

例如:

request 1 : <id>400</id> VU :1
request 2 : <id>401</id> VU :1

request 1 : <id>402</id> VU :2

request 3 : <id>403</id> VU :1
request 4 : <id>404</id> VU :1

request 2 : <id>405</id> VU :2
request 3 : <id>406</id> VU :2

有没有办法声明一个被整个测试共享的变量? Setup 和 Init 是针对每个 VU 的,不能根据文档共享数据。

这不容易实现,因为每个 VU 都在单独的 JavaScript VM 中运行,并且它们之间不共享内存。有关详细信息,请参阅 Test life cycle documentation。这样做是为了允许测试运行分布在 k6 实例之间,因此在它们之间同步数据将需要外部解决方案。

您可以采取的一种方法是跟踪并增加 Web 服务中的 ID,您的 k6 脚本可以查询该 ID 以从中获取下一个 ID。 Redis 可以很好地满足这个目的,请参阅 了解想法。但请注意,任何此类解决方案都会影响您的 end-of-test 测试指标和测试本身的性能,因此它并不理想,但我没有看到更好的方法。

对于正在寻找生成序列号方法的任何人。自版本 v0.0.34 以来,引入了 k6/execution,它有一个 属性 iterationInTest,它是一个整数,描述为:

The unique and zero-based sequential number of the current iteration in the scenario. It is unique in all k6 execution modes - in local, cloud and distributed/segmented test runs. However, while every instance will get non-overlapping index values in cloud/distributed tests, they might iterate over them at different speeds, so the values won't be sequential across them.

这可以在您的测试代码中用于生成序列号,例如:

import exec from 'k6/execution':

export default function () {
  const url = `https://foo.bar/${exec.scenario.iterationInTest}`;
  http.get(url)
}

我能够为测试的每次迭代增加一个数字。