K6 - 迭代数组,但不是每个 VU

问题描述

我正在编写一个脚本来使用 k6 测试我的基础设施。

我希望将每个 VU 分配给从现有数组中获得的先前已知的 id,并且该 VU 在创建 VU 时仅执行一次 default 函数中的指令。>

如何遍历这个数组,获取 id 并将其用于脚本创建的每个 VU?

最初的想法如下,但我确信它是不正确的。

export let options = {
    stages: [
        { duration: '10s',target: 1 },{ duration: '10s',target: 10 },],};

const ids = [
    {'id':1,'name':'name1'},{'id':3,'name':'name3'},{'id':4,'name':'name4'},{'id':18,'name':'name18'}];

export default function () {
    for(var i=0; i<ids.length; i++) {
        var user = ids[i];
        //do something with user.id
    }
}

根据 K6 手册,每个 VU 都会执行 default 函数内的所有内容,但这会使所有 VU 执行 for 循环,这不是我想要的行为。

我希望 VU 执行 for 中的内容,但对每个新 VU 使用不同的 id。像下面这样:

export default function () {
    var user = ids[i];
    //do something with user.id
}

解决方法

我最终使用... scenarios :-) 和全局变量 __VU 的组合来解决这个特定场景。

在场景配置中,我说每个 VU 在整个测试过程中只会迭代 1 次,并且我将启动与 ids 数组中的 VU 一样多的 VU。这样,每个 VU 将使用其中一个 ID 并仅运行 default 函数 1 次。

因为 __VU 从 1 开始,我还必须使用 __VU-1 来正确索引数组。

const ids = [
    {'id':1,'name':'name1'},{'id':3,'name':'name3'},{'id':4,'name':'name4'},{'id':18,'name':'name18'}];

export let options = {
    scenarios: {
        stress_test: {
            executor: 'per-vu-iterations',vus: ids.length,iterations: 1
        }
    }
};

export default function () {
    var user = ids[__VU-1];
    //do something with user.id
}