问题描述
我一直在阅读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
因此,在执行setup
和teardown
函数时,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的第一个参数。
当前有两种解决方法(取得不同程度的成功):
- 如果您无需取消身份验证就可以(在很多情况下可以取消身份验证),则可以使用诸如
data
之类的代码在第一次迭代时进行身份验证 - 利用
if (__ITER == 0) { authenticate(); }
可以返回对象数组并对setup
代码中的所有VU进行身份验证的事实,然后每个VU都可以进行身份验证(我想这是某种令牌)使用setup
变量从数组中删除,对于执行__VU
函数的VU,变量从1
开始。稍后default
将获得相同的数组,并可以取消对所有内容的身份验证。您可能需要增加一些[]超时](https://k6.io/docs/using-k6/options#setup-timeout)和/或使用http.batch。
根据您要进行身份验证和取消身份验证的精确程度,可能会有更好的选择:)。