удалить идентификаторы, сгенерированные во время тестов - PullRequest
1 голос
/ 06 марта 2020

Для нагрузочного тестирования на этапе vu я генерирую множество объектов с уникальными идентификаторами, которые помещаю их в базу данных. Я хочу удалить их на этапе 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 stage.

Единственное оставшееся решение - либо поиграть с console log, либо просто использовать простой набор идентификаторов и использовать их в тестах. Есть ли другой способ?

Ответы [ 2 ]

3 голосов
/ 07 марта 2020

Функции 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

2 голосов
/ 07 марта 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');
}
Выполнить 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-запросы, не относящиеся к самому тесту. Там может быть способ исключить их с помощью тегов, в противном случае это будет хороший запрос функции. :)

Использование клиента Redis Node.js во избежание HTTP-запросов может быть альтернативой, но эти библиотеки, как правило, не «просматриваются», поэтому они, скорее всего, не будут работать в k6.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...