删除测试期间生成的id



对于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);
}

它不起作用,因为数组总是包含我放入CCD_ 3阶段的数据。

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

剩下的唯一解决方案要么是玩console log,要么只是使用一个简单的id预设并在测试中使用它们。还有别的办法吗?

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

为了扩展@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中工作。

最新更新