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

Posted

技术标签:

【中文标题】K6 负载测试 - 如何为整个测试运行创建顺序 ID【英文标题】:K6 Load Testing - How to make sequential id for entire test run 【发布时间】:2020-08-07 02:17:13 【问题描述】:

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

【问题讨论】:

【参考方案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)

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

以上是关于K6 负载测试 - 如何为整个测试运行创建顺序 ID的主要内容,如果未能解决你的问题,请参考以下文章

开源负载测试工具k6比JMeter更容易的5件事

使用 k6 下载整个网站

使用 K6(负载影响)对 API 进行负载测试时的限制

K6性能测试工具的使用入门

从 K6 模拟每个 VU 的浏览器缓存以进行负载测试

k6:WARpanic:运行时错误:无效的内存地址或 nil 指针取消引用