Делаем нагрузочные тесты за 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). Просто для того, чтобы понять на сколько долго выполнялась операция в целом.
Естественно, решение не полностью универсально, оно не учитывает особенности вашего приложения и не позволяет создать тест с какой либо логикой (спойлер, каждый может дописать/переписать как удобно именно под его проект).
Я решил поделиться этой идеей (авось кому поможет), т.к. нагрузочное тестирование вАжно практически на всех проектах. И провести его здесь и сейчас на коленке часто является не простой задачей команды.
teqs
Жеска