K6:测试生命周期中的授权

K6: Authorization in the Test Life Cycle

我一直在通读 K6 文档,正在努力寻找一种方法来使 K6 脚本符合我的需要。我脑海中想象的场景:

// 1. init code
export function setup() {
  // 2. setup code
  // The VU would get setup here with authentication once
}
export default function (data) {
  // 3. VU code
  // The VU would run this code a repeated amount of times
}
export function teardown(data) {
  // 4. teardown code
  // The VU would be deauthed here after the VU code has ran its course

不幸的是,根据我在这里阅读的内容:https://k6.io/docs/using-k6/test-life-cycle,我的理解是上述情况是不可能的。 "setup 在测试开始时调用,在初始化阶段之后但在 VU 阶段之前(默认函数),在测试结束时调用 teardown,在 VU 阶段之后(default函数)。因此,在执行 setupteardown 函数时,VU 编号为 0。”我将其解释为在上述情况下,所有 VU 将对 运行 VU 代码使用相同的身份验证,而不是每个 VU 获得自己的单独身份验证。

如果我简单地排除设置和拆卸部分,那么每个 VU 都会在每个循环中获得新的身份验证:

export default function (data) {
  // 3. VU code
  // VU gets authenticated
  // VU does a bunch of stuff
  // VU clears authentication
}

有没有办法按照我的意图设计K6脚本(VU验证一次-> VU代码循环->最后一次验证)?

是的,根据测试,设置和拆卸是全局的 运行。

每个 VU setup/teardown 有一个 issue,但它没有被高度优先考虑,因为有...其他看起来更重要的东西:)。

我还想指出,设置、拆卸和默认代码是 运行 在 单独的 JS 虚拟机中,其中唯一的共享内存(它是在它们之间复制)是由设置 return 编辑的 data 并且是默认和拆卸的第一个参数。

目前有两种解决方法(成功率各不相同):

  1. 如果您可以不取消身份验证(在很多情况下取消身份验证很好),您可以在第一次迭代时使用类似 if (__ITER == 0) { authenticate(); }
  2. 的代码进行身份验证
  3. 利用 setup 可以 return 对象数组的事实,并验证 setup 代码中的所有 VU,然后每个 VU 都可以获得他们的验证(我猜是某种标记)从使用 __VU 变量的数组开始,对于执行 default 函数的 VU,从 1 开始。稍后 teardown 将获得相同的数组并且可以取消验证所有内容。您可能需要增加一些]超时](https://k6.io/docs/using-k6/options#setup-timeout) and/or use http.batch.

取决于您将如何准确地进行身份验证和取消身份验证……可能有更好的选择:)。