1

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

前任:

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 的,不能按照文档共享数据。

4

2 回答 2

2

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

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

于 2020-08-07T09:10:17.237 回答
1

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

场景中当前迭代的唯一且从零开始的序号。它在所有 k6 执行模式中都是独一无二的——在本地、云和分布式/分段测试运行中。然而,虽然每个实例都会在云/分布式测试中获得不重叠的索引值,但它们可能会以不同的速度迭代它们,因此这些值不会在它们之间是连续的。

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

import exec from 'k6/execution':

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

我可以用来为测试的每次迭代增加一个数字。

于 2021-10-25T23:14:56.307 回答