Как установить итерации для этапов?

Я пытаюсь настроить запуск в K6 с поэтапной настройкой и кратким описанием. Я пытаюсь выяснить, как настроить K6, чтобы он запустил новую итерацию прогона после завершения этапов. Я просто включаю итерации в блок stage или мне нужно что-то еще сделать?

1 ответ

То, что вы в основном хотите, это заданный набор этапов повторяться в течение длительного периода времени.

Есть два решения:

  1. Просто запустите скрипт в цикле в скрипте bash/cmd/shell - между запусками будет несколько пауз, так как k6 потребуется снова инициализировать. Кроме того, у вас будет несколько выходов, но это может быть неплохо, см. Ниже.

  2. Есть этапы, которые столько, сколько вам нужно. Вы можете сделать это вручную или просто написать скрипт внутри тестового скрипта:

import http from "k6/http";
import { check, sleep } from "k6";

let stages = [// total 30 seconds
        // Ramp-up from 1 to 5 VUs in 10s
        { duration: "10s", target: 5 },

        // Stay at rest on 5 VUs for 5s
        { duration: "5s" },

        // Ramp-down from 5 to 0 in 15s
        { duration: "15s", target: 0}
    ];

let final_stages = [];

// 30 seconds by 120 seconds is 3600 seconds or 1 hour
for (let i =0 ;i < 120; i++) {
    final_stages = final_stages.concat(stages)
}

export let options = {
    stages: final_stages,
    discardResponseBodies: true
};

export function setup() {
    console.log(JSON.stringify(options.stages));
}
export default function(testStart) {
        // normal execution
        let res = http.get("http://httpbin.org/");
        check(res, { "status is 200": (r) => r.status === 200 });
}

Я настоятельно рекомендую запустить K6 с --no-summary и может быть даже --no-thresholds или просто не используйте пороговые значения, если время, в течение которого они будут выполняться, будет велико, поскольку вы, вероятно, собираетесь исчерпать память, просто собирая данные внутри k6. Это означает, что вам, вероятно, следует использовать некоторое хранилище для таких метрик, как effxdb или даже Insight Load Impact. Это, конечно, не может быть правдой в вашем случае - вам придется проверить:).

Ответьте, как я понял на вопросе ранее: "Я хочу иметь этапы, а затем я хочу выполнить конкретное количество итераций сценария вместо заданной продолжительности, как это будет происходить на другом этапе"

Простой ответ - нет.

Если у вас есть этапы, итерации и длительность теста являются взаимоисключающими - будет учитываться только один из них. Посмотрите на конец для возможного обходного пути.

Длинный ответ:

Если я правильно понимаю, вам нужно иметь несколько этапов, а затем после всех этапов запустить несколько VUS, которые выполняют заданное количество итераций. В настоящее время это не поддерживается и нам (команде k6) интересно, зачем вам это нужно.

Обходной путь (ы): В настоящее время я могу придумать два обходных пути - оба хакерские:

  1. Если вам ничего не нужно из теста на более поздних итерациях, сделайте два теста и создайте скрипт bash/shell/cmd, чтобы запускать их один за другим. Это будет иметь некоторую паузу между тестовыми прогонами, и у вас будет два выхода, но определенно будет легче.
  2. Сделайте еще один этап после того, как все этапы закончатся достаточно долго, чтобы выполнить все итерации. Имейте переменную, в которую вы записываете начало всего теста - желательно в настройке, а затем вычисляете, когда вы достигнете последней стадии. Запустите столько итераций, сколько захотите, а затем дайте спать до конца теста.

Важно отметить, что на данный момент нет способа обмена данными между VU, поэтому вам придется решить, что при наличии 10 VU каждый будет делать 5, чтобы получить 50 итераций, и, возможно, один VU завершит работу намного быстрее или позже, или что-то вроде тот.

import http from "k6/http";
import { check, sleep } from "k6";

export let options = {
    stages: [
        // Ramp-up from 1 to 5 VUs in 10s
        { duration: "10s", target: 5 },

        // Stay at rest on 5 VUs for 5s
        { duration: "5s" },

        // run for some amount of time after that
        { duration: "15s"}
    ],
    discardResponseBodies: true
};
export function setup() {
    return Date.now();
}

let iter = 5; // how many iteration per VU should be done in the iterations part
export default function(testStart) {
    // 15ms is the amount of time for the pre iterations phase
    if (Date.now() - testStart > 15 * 1000) {
        // "iterations part"
        if (iter == 0) { // we have ran out of iterations to do
            sleep(15000) // sleep for the duration of the phase
        }
        iter = iter - 1;
        // debug log
        console.log(__VU, __ITER, iter);

        // the actual part you want  to do
        let res = http.get("http://httpbin.org/");
        check(res, { "status is 200": (r) => r.status === 200 });

    } else {
        // normal execution
        let res = http.get("http://httpbin.org/");
        check(res, { "status is 200": (r) => r.status === 200 });
    }
}
 
Это, очевидно, должно быть адаптировано к вашему случаю и не будет точным, но, опять же, гораздо интереснее, что вы хотите с ним сделать и почему.

Примечание:

Во время обсуждения исполнения на основе скорости поступления это обсуждалось, и текущий план должен поддерживаться, но эта работа, вероятно, по крайней мере в месяц далека от возможности альфа / бета, поскольку для поддержки всего необходим большой внутренний рефакторинг мы хотим добавить вместе с этим. Вам, вероятно, следует написать вопрос с вашим вариантом использования, который будет учтен в будущем.

Другие вопросы по тегам