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

问题描述

我一直在阅读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阶段之前(功能),在测试结束时,在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
}

是否有一种设计目的的V6脚本(VU一次身份验证-> VU代码循环->最后一次取消身份验证)?

解决方法

是的,每次测试运行时设置和拆卸都是全局的。

关于每个VU的安装/拆卸,有一个issue,但是它还没有被高度重视,因为还有其他似乎更重要的事情:)。

我还要指出,设置,拆卸和默认代码在分开的 JS VM中运行,其中唯一的共享内存(并在它们之间复制)是{{1 }}是安装程序返回的,它是default和teardown的第一个参数。

当前有两种解决方法(取得不同程度的成功):

  1. 如果您无需取消身份验证就可以(在很多情况下可以取消身份验证),则可以使用诸如data之类的代码在第一次迭代时进行身份验证
  2. 利用if (__ITER == 0) { authenticate(); }可以返回对象数组并对setup代码中的所有VU进行身份验证的事实,然后每个VU都可以进行身份​​验证(我想这是某种令牌)使用setup变量从数组中删除,对于执行__VU函数的VU,变量从1开始。稍后default将获得相同的数组,并可以取消对所有内容的身份验证。您可能需要增加一些[]超时](https://k6.io/docs/using-k6/options#setup-timeout)和/或使用http.batch

根据您要进行身份验证和取消身份验证的精确程度,可能会有更好的选择:)。