簡體   English   中英

刪除測試期間生成的 ID

[英]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);
}

您可以在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 中工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM