Делаем нагрузочные тесты за 5 минут (ну почти)
Не так давно делился историей о том, как решали проблему E2E автотестов в маленьком проекте (см статью). Продолжим историю )
Начало статьи очень похоже, т.к. проект и условия ровно такие же.
Дано:
-
Проект с небольшим бюджетом.
-
Максимальное возможное количество тестировщиков на проекте = 2.
-
Тим лид или автоматизатор, у которого есть еще несколько других проектов. т. е. постоянно писать и обслуживать тесты не может.
Найти:
-
Регулярные нагрузочные тесты
-
Потратить на это минимальное количество денег/времени/сил
По причине невысокого бюджета приходим к тому, что нет возможности нанять полноценных нагрузочных тестировщиков. Можно сделать заказ в профильной компании и какие то другие опции, но мы пойдем своим путем.
Итак. т.к. мы уже подключили наших ручных тестировщиков к разработке автотестов, очень хотелось пойти по аналогичному пути. Что мы можем сделать для этого?
-
Выбрать готовые инструменты и составить сценарий из последовательных вызовов API. Но тесты придется постоянно поддерживать, API регулярно изменяется. Придется постоянно менять сценарий.
-
Обучить тестировщиков основам разработки нагрузочных тестов. Аналогично, постоянная поддержка тестов при любых изменениях продукта.
-
Придумать свое простое решение, которое поможет нам.
Что для нас важно
-
По большой части вариативная читающая нагрузка
-
Тесты должны быть актуальными всегда. А если сломались на обновление сценария нужно не больше 30 минут
-
Отчет теста должен сохраняться в html или каком то ином виде, для возможности исторического сравнения поведения системы
-
Обновление/разработка нового сценария должна быть доступна любому члену команды. Аналитик, разработчик, тестировщик, менеджер
-
Приоритизация сценария. Сценарии должны иметь приоритет и запускаться с учетом этого приоритета
В качестве нагрузочного инструмента я ранее использовал Locust — хороший, не сложный и очень гибкий нагрузочный инструмент. Все, что можно написать на python можно нагрузить через Locust + из коробки у Locust есть приоритизация сценария. Единственная проблема, что человеку незнакомому с кодом невозможно самостоятельно разработать сценарии теста.
Информация об инструменте Locust:
Что может выполнить любой член команды для обновления сценария? Любой член команды может в браузере совершать действия с системой, соответственно может собрать логи «хождения» по системе (har‑лог). Остался вопрос, как превратить har‑лог в сценарий, который съест Locust? Ответ нашли довольно быстро, можно написать скрипт, который будет анализировать har лог и на его основе формировать сценарий/сценарии
Как работает итоговое решение:
-
Тестировщик собирает har‑лог в системе и сохраняет его в необходимом месте: FTP, репозиторий гит, у себя на ПК (нужное подчеркнуть). В имени файлика необходимо указать вес сценария и его наименование.
-
Скрипт забирает, анализирует эти har‑логи и формирует нагрузочный тест для Locust. Тут я использую полностью самописное решение (не искал других, возможно такие есть).
-
Далее уже в сборке Jenkins (заранее 1 раз настроенной) запускается нагрузочный тест. И туда же прикладывается отчет.
-
Отправка уведомления в телеграмм о запуске, завершении + можно и отчётик прислать в чат. Удобно.
В публичный доступ выкладываю версию, которая подходит только для независимых друг от друга действий пользователя (т. е. данные между шагами теста не прокидываются)
Вся информация по использованию присутствует в readme.md в репозитории проекта simple.perfomance.
Делаем 1 тест локально
Давайте попробуем сделать 1ый нагрузочный тест вместе на локальном ПК. Вы увидите как это просто.
-
Для начала необходимо установить python на свой локальный ПК (поддерживается python 3.10 или выше). Загружаем здесь www.python.org/downloads/ и устанавливаем
-
С помощью pip установим locust
Для windows
pip install locust
Для Linux/mac
pip3 install locust
-
Загружаем наш публичный репозиторий в удобную директорию
git clone https://github.com/autotetst/simple.perfomance.git
При отсутствии git можно просто скачать zip-архив с github и распаковать
4. Самое интересное — собираем har лог.
-
Откройте в Google Chrome интерфейс своего приложения или сайта.
-
Включите devtools (F12) и совершайте действия в системе, которые хотите добавить в нагрузочный сценарий.
Старайтесь не перегрузить сценарий и не делайте его большим. Сценариев в тесте может быть сколько угодно
-
Перейдите на вкладку network в devtools браузера
-
Нажмите Export HAR и сохраните в удобную директорию
-
Если нужен еще сценарий → удаляем текущие запросы из вкладки network и мы готовы записывать следующий
-
Помним, что каждый сценарий — отдельный har‑лог
-
Мы собрали har‑логи сценариев, которые хотим автоматизировать.
Осталось дать им имя в правильном формате: <Вес сценария>!<имя сценария>.har.
Имя сценария — произвольное имя на латинице. Нельзя начинать с цифры, нельзя использовать спецсимволы кроме _, нельзя использовать пробелы
Вес сценария — определяет частоту его выполнения. Должен быть целым числом. Чем выше вес сценария относительно других, тем чаще сценарий будет выполнен Например 100!perfomance_test_1.har
-
Получившиеся сценарии разместим в директории BaseHar в проекте
-
Запустим автоматическое создание нагрузочного теста Для windows
python mappHarToCode.py
Для Linux/mac
python3 mappHarToCode.py
-
Если все прошло хорошо, то будет создан новый или обновлен существующий файл perf.py. В этом файле содержится полный код нагрузочного сценария
-
Вы можете его открыть и при необходимости даже исправить ошибки (если какие то возникли). Но ожидается, что он будет рабочим сразу
-
Редактируем locust.conf (при необходимости)
Вы можете ознакомиться с документацией locust, чтобы использовать свои аргументы — https://docs.locust.io/en/stable/configuration.html
От себя я добавил несколько кастомных аргументов, которые вы тоже можете использовать:
host = https://save-link.ru #Адрес сервиса, к которому необходимо отправлять запросы теста #Обратите внимание на отсутствие слеша в конце SuperLogin = test SuperPass = test #Будут использоваться только в том случае, если добавить авторизацию для каждого потока #Для этого необходимо править scenario_code.py под ваши задачи. #Там есть закомментированный пример авторизации #+ Поправить функцию авторизации Auth/auth.auth access_token = '' #Можно подставить токен для авторизации, токен будет автоматически подставлен к каждому запросу в http header #Посмореть и изменить http header можно в Auth/auth.get_http_headers ssl_check = True #Позволяет выключать проверку ssl сертификатов при выполнении теста. #Если ваш сайт/приложение не использует ssl сертификаты #и работает по http протоколу, то необходимо задать False в этом параметре
-
Запускаем наш нагрузочный тест
locust
Ура. Тест запущен
Мы можем контролировать его выполнение в браузере, для этого перейдем по адресу http://127.0.0.1:8089
В интерфейсе Locust есть все необходимое:
-
мы можем останавливать и запускать тест
-
добавлять количество потоков (пользователей)
-
мониторить время отклика и нагрузку
-
следить за ошибками и логами
-
скачать статистику в html отчет или в другой вид
В отчете будет так же зафиксировано и общее время прохождения сценария (тип такой записи будет = SCENARIO). Просто для того, чтобы понять на сколько долго выполнялась операция в целом.
Естественно, решение не полностью универсально, оно не учитывает особенности вашего приложения и не позволяет создать тест с какой либо логикой (спойлер, каждый может дописать/переписать как удобно именно под его проект).
Я решил поделиться этой идеей (авось кому поможет), т.к. нагрузочное тестирование вАжно практически на всех проектах. И провести его здесь и сейчас на коленке часто является не простой задачей команды.
ссылка на оригинал статьи https://habr.com/ru/articles/844132/
Добавить комментарий