1

对于vu阶段中的负载测试,我生成了许多具有唯一 ID 的对象,并将它们放入数据库中。我想在teardown阶段删除它们,以免污染数据库。

当保持这样的状态时

let ids = [];
export function setup() {
    ids.push('put in setup id');
}

export default function () {
    ids.push('put in vu id');
}

export function teardown() {
    ids.push('put in teardown id');
    console.log('Resources: ' + ids);
}

它不起作用,因为数组总是包含我放在teardown舞台上的数据。

由于众所周知的问题,在阶段之间传递数据也不起作用Cannot extend Go slice,但即使这样,您也无法将数据从vu阶段传递到,teardown因为它总是从setup阶段获取数据。

唯一剩下的解决方案是玩弄console log或者只是使用一个简单的 id 预设并在测试中使用它们。还有其他方法吗?

4

2 回答 2

4

setup()teardown()VU 的default函数在完全不同的 JavaScript 运行时中执行。对于分布式执行,它们可以在完全不同的机器上执行。所以你不能只拥有一个ids可以从任何地方访问的全局变量。

该限制是您应该从其中返回您关心的任何数据的原因setup()- k6 将复制它并将其作为参数传递给default函数(因此您可以使用您设置的任何资源)和teardown()(因此您可以清理它们向上)。

您的示例必须看起来像这样:


export function setup() {
    let ids = [];
    ids.push('put in setup id');
    return ids;
}

export default function (ids) {
    // you cannot push to ids here
    console.log('Resources: ' + ids);
}

export function teardown(ids) {
    console.log('Resources: ' + ids);
}

您可以在https://k6.io/docs/using-k6/test-life-cycle找到更多信息

于 2020-03-07T08:56:07.733 回答
4

为了扩展@na-- 的答案,我提出了一个使用 Redis 和Webdis来管理 ID的外部解决方法。

如果您不介意运行额外的进程,并且不应该对性能产生很大影响,这实际上非常简单:

  1. 启动一个 Webdis/Redis 容器: docker run --rm -it -p 127.0.0.1:7379:7379 nicolas/webdis

  2. script.js

import http from 'k6/http';

const url = "http://127.0.0.1:7379/"

export function setup() {
    const ids = [1, 2, 3];
    for (let id of ids) {
        http.post(url, `LPUSH/ids/${id}`);
    }
}

export default function () {
    const id = Math.floor(Math.random() * 10);
    http.post(url, `LPUSH/ids/${id}`);
}

export function teardown() {
    let res = http.get(`${url}LRANGE/ids/0/-1`);
    let ids = JSON.parse(res.body)['LRANGE'];
    for (let id of ids) {
        console.log(id);
    }
    // cleanup
    http.post(url, 'DEL/ids');
}
  1. 运行 5 次迭代: k6 run -i 5 script.js

示例输出:

INFO[0000] 7
INFO[0000] 2
INFO[0000] 2
INFO[0000] 6
INFO[0000] 5
INFO[0000] 3
INFO[0000] 2
INFO[0000] 1

这个解决方案的一个缺点是它会扭曲整体测试结果,因为额外的 HTTP 请求与测试本身无关。可能有一种方法可以用标签排除这些,否则这将是一个很好的功能请求。:)

使用 Node.js Redis 客户端来避免 HTTP 请求可能是一种替代方案,但这些库通常不是“可浏览的”,因此它们可能无法在 k6 中运行。

于 2020-03-07T09:41:23.773 回答