Загрузка целых сайтов с помощью k6 - PullRequest
1 голос
/ 30 марта 2020

В настоящее время я оцениваю, подходит ли k6 для наших нагрузочных испытаний. У нас довольно традиционная архитектура веб-сайтов, которая использует Apache веб-серверы с PHP и MySQL базой данных. Отправка простых HTTP-запросов с помощью k6 выглядит достаточно просто, и я думаю, что мы сможем протестировать все основные функции с его помощью, так как мы не полагаемся на JavaScript так много, и большинство страниц остаются c.

Однако я не уверен, как обращаться с ресурсами (таблицами стилей, изображениями и т. Д. c.), На которые есть ссылка в HTML, возвращаемом в запросах. Мы также должны загрузить их, так как это иногда приводит к запросам к базе данных, которые должны быть частью нагрузочного теста.

Есть ли в k6 некоторые готовые функции, которые позволяют загружать все ресурсы как браузер? Я знаю, что k6 НЕ отображает страницу, и мне это не нужно. Мне нужно только запросить все ресурсы внутри HTML.

Ответы [ 2 ]

1 голос
/ 30 марта 2020

У вас в основном есть два варианта, оба с их предостережениями:

  1. Запишите ваш сеанс - вы можете либо экспортировать har напрямую из браузера, как показано там, либо использовать расширение, сделанное для вашего браузера, здесь firefox и chromes . Оба должны быть пригодны для использования без облачной учетной записи k6, вам просто нужно настроить их на загрузку хар, и он будет автоматически (и несколько тихо) загружать их, когда вы нажмете «Стоп». А затем либо используйте конвертер в k6 har (который устарел, но все еще работает), либо новый har-to-k6 , который.

    Этот метод особенно хорош, если у вас есть много страниц и / или ресурсов и даже работает, если у вас есть приложение в стиле одной страницы, поскольку оно просто получает то, что браузер запросил как HAR , а затем преобразует его в скрипт. И если бы не было динамических c вещей, которые нужно было бы ввести (имя пользователя / пароль), последний сценарий можно использовать как обычно.

    Самая большая проблема этого подхода заключается в том, что если вы добавляете файл css, вам необходимо повторить все это упражнение. Это еще более проблематично c, если вы меняете имя файла css / js при каждом изменении или что-то в этом роде. Для этого подходит следующий метод:

  2. Используйте parse HTML, а затем найдите интересующие вас элементы и сделайте запрос на них.
import http from "k6/http";
import {parseHTML} from "k6/html";

export default function() {
    const res = http.get("https://stackoverflow.com");
    const doc = parseHTML(res.body);
    doc.find("link").toArray().forEach(function (item) {
        console.log(item.attr("href"));
        // make http gets for it
        // or added them to an array and make one batch request
     });
}

будет производить

NFO[0001] https://cdn.sstatic.net/Sites/stackoverflow/img/favicon.ico?v=4f32ecc8f43d
INFO[0001] https://cdn.sstatic.net/Sites/stackoverflow/img/apple-touch-icon.png?v=c78bd457575a
INFO[0001] https://cdn.sstatic.net/Sites/stackoverflow/img/apple-touch-icon.png?v=c78bd457575a
INFO[0001] /opensearch.xml
INFO[0001] https://cdn.sstatic.net/Shared/stacks.css?v=53507c7c6e93
INFO[0001] https://cdn.sstatic.net/Sites/stackoverflow/primary.css?v=d3fa9a72fd53
INFO[0001] https://cdn.sstatic.net/Shared/Product/product.css?v=c9b2e1772562
INFO[0001] /feeds
INFO[0001] https://cdn.sstatic.net/Shared/Channels/channels.css?v=f9809e9ffa90

Как вы можете видеть, некоторые URL-адреса являются относительными, а не абсолютными, поэтому вам придется справиться с этим. И в этом примере только некоторые из них css, поэтому, возможно, потребуется дополнительная фильтрация. Проблема здесь в том, что вам нужно написать код, и если вы добавляете относительную ссылку или что-то еще, вам нужно обрабатывать ее. К счастью, в k6 можно писать сценарии, поэтому вы можете повторно использовать код: D.

0 голосов
/ 07 апреля 2020

Я последовал предложению Михаила Стойкова и написал свою собственную функцию для загрузки ресурсов. Может быть, это поможет некоторым будущим читателям. Вы можете установить способ загрузки ресурсов (пакетное или последовательное получение с помощью options.concurrentResourceLoading).

/**
* @param {http.RefinedResponse<http.ResponseType>} response
*/
export function getResources(response) {
const resources = [];
response
    .html()
    .find('*[href]:not(a)')
    .each((index, element) => {
    resources.push(element.attributes().href.value);
    });
response
    .html()
    .find('*[src]:not(a)')
    .each((index, element) => {
    resources.push(element.attributes().src.value);
    });

if (options.concurrentResourceLoading) {
    const responses = http.batch(
    resources.map((r) => {
        return ['GET', resolveUrl(r, response.url), null, { headers: createHeader() }];
    })
    );
    responses.forEach(() => {
    check(response, {
        'resource returns status 200': (r) => r.status === 200,
    });
    });
} else {
    resources.forEach((r) => {
    const res = http.get(resolveUrl(r, response.url), {
        headers: createHeader(),
    });
    !check(res, {
        'resource returns status 200': (r) => r.status === 200,
    });
    });
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...