удалить идентификаторы, сгенерированные во время тестов

Для нагрузочного тестирования на этапе 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, либо просто использовать простую предустановку идентификаторов и использовать их в тестах. Есть ли другой способ?


person lapots    schedule 06.03.2020    source источник


Ответы (2)


Функции setup(), teardown() и 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

person na--    schedule 07.03.2020
comment
так что в основном я должен отделить генерацию идентификатора от этапа vu? - person lapots; 07.03.2020
comment
да, это, наверное, самый простой и чистый вариант - person na--; 07.03.2020

Чтобы расширить ответ @na-, я предлагаю внешний обходной путь с использованием Redis и Webdis для управления идентификаторами.

На самом деле это довольно просто, если вы не возражаете против запуска дополнительного процесса и не должны сильно влиять на производительность:

  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.

person imiric    schedule 07.03.2020
comment
Безумие, что k6 не может исправить это простым способом. - person basickarl; 19.05.2021
comment
@basickarl Это потому, что это не простая проблема, которую можно решить для всех случаев использования. Как было объяснено, экспортированные функции выполняются в разных средах выполнения JS и, возможно, в разных процессах или на разных машинах при распределенном выполнении. Для синхронизации состояния требуется некий централизованный процесс, и Redis — один из подходов. Хотя с введением расширений k6 сохранение глобального счетчика в рамках одного процесса k6 стало возможным с помощью github.com/ MStoykov/xk6-counter , поэтому я полагаю, что что-то подобное можно сделать для общего глобального состояния. - person imiric; 19.05.2021