[英]remove ids generated during the tests
對於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 預設並在測試中使用它們。 還有其他方法嗎?
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);
}
為了擴展@na-- 的答案,我提出了一個使用 Redis 和Webdis來管理 ID 的外部解決方法。
這實際上很簡單,如果您不介意運行一個額外的進程,並且不應該對性能產生很大的影響:
啟動一個 Webdis/Redis 容器: docker run --rm -it -p 127.0.0.1:7379:7379 nicolas/webdis
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');
}
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 中工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.