Мы не ищем баги: что такое нагрузочное тестирование
Как узнать, не превратится ли ваш интернет-магазин в тыкву во время «чёрной пятницы» — когда трафик вырастет в 10 раз.
кадр из фильма «Зомби по имени Шон»
Давид Нариманидзе
об авторе
Taode01 в Twitter. 28 лет. Полтора года в нагрузочном тестировании, куда перекатился из системного администрирования и любительской разработки мобильных приложений. В абсолютном восторге от работы, потому что это редкая возможность спасать компанию от лишних трат, а клиентов — от расходования совсем не казённых нервов. Да ещё и практически неограниченно развиваться самому: во время работы в НТ приходится и код писать, и железо подбирать, и взаимодействовать с большим количеством клёвых специалистов из других отделов.
Нагрузочное тестирование (НТ) — один из тестов производительности. От любой системы требуется быстро и правильно отвечать на запросы пользователей: и если правильность ответов относится скорее к функциональному тестированию, скорость является как раз заботой специалистов по нагрузочному тестированию. Однако формулировка «система должна отвечать быстро» — слабое требование.
Мне нравится определение из блога Miro на «Хабре»: «Нагрузочное тестирование — это тип тестирования, в котором мы проверяем, соответствует ли наша система поставленным нефункциональным требованиям к производительности при работе под высокой нагрузкой в различных сценариях».
В основе статьи — Twitter-тред автора.
Какими бывают нагрузочные тесты
Начнём с того, какие бывают виды тестирования. У каждого инженера есть мнение на этот счёт, поэтому и я поделюсь своим :) Я разделяю тесты на функциональные, нефункциональные и связанные с изменениями.
Функциональное тестирование. В него входит проверка безопасности и взаимодействия — мы испытываем систему и осознанно бьём по её слабым местам, убеждаемся, что она выполняет все функции, которые были прописаны в ТЗ.
Нефункциональное тестирование (НФ). Определяет характеристики ПО, которые измеряются в каких-то конкретных величинах. В первую очередь на таких тестах изучают производительность системы — проводят нагрузочное и стрессовое тестирование, исследуют стабильность и работу с большими базами данных. А после этого проверяют настройки, отказоустойчивость и восстановление системы, ищут способы увеличить её производительность. Тестирование производительности помогает узнать, как меняются стабильность и быстродействие системы под разной нагрузкой, а также проверить её масштабируемость, надёжность и уточнить, сколько ресурсов она будет использовать.
Вид НФ-теста | На какие вопросы отвечает |
---|---|
Нагрузка | Соответствует ли нефункциональным требованиям система |
Стабильность | Надёжно ли работает система в течение продолжительного времени |
Отказоустойчивость | Сможет ли система сама переместиться на другой сервер, если откажет основной |
Восстановление | Как быстро система восстановится после сбоя |
Стресс | Что случится при незапланированной нагрузке |
Объём | Как будет работать проект, если база данных вырастет в 100 раз |
Масштабируемость | Как будет увеличиваться нагрузка на компоненты системы с ростом числа пользователей |
Потенциал | Сколько пользователей могут работать в системе одновременно |
Конфигурация | Как заставить систему работать быстрее |
Сравнение | Какое оборудование и ПО выбрать |
Тесты, связанные с изменениями. К этой категории относятся:
- регрессионное тестирование — когда мы ищем ошибки в старых частях программы;
- смоук-тест — когда мы определяем работоспособность новой сборки;
- тест билда — когда ищем все баги.
Как составить методику нагрузочного тестирования
Методика нагрузочного тестирования (МНТ) — почти как Библия для нагрузочника. Это документ, в который необходимо вписать всё, что может случиться на проекте, учесть максимальное число сценариев и результаты тестов.
Чтобы обезопасить себя от факапов, в методике нужно сразу прописать значения всех терминов, чтобы потом не возникло недопонимания, которое обычно приводит к судам и нервотрёпке.
Я разрабатываю методику нагрузочного тестирования по такой структуре:
1. Информация о проекте и определения терминов.
2. Цели тестирования. Например, «внедрить в программу новую фичу» или «подготовить интернет-магазин к распродаже, когда пользователей на сайте будет в X раз больше».
3. Ограничения нагрузочного тестирования. Это не функциональное тестирование, а значит, мы намеренно не ищем баги и не оцениваем внешние системы, потому что нас наняли на проверку только одной.
4. Отличия от настоящей системы. Клиент должен знать, что мы используем заглушки, эмуляторы и виртуализацию, а база данных отличается от той, которая будет на продакшене. Заглушки на результаты не влияют, виртуализация — слабо, а вот отличия в БД — сильно.
У меня заглушки и эмуляторы работают на Java, скрипты я пишу в HP LoadRunner, а запускаю в Performance Center.
5. Причины ошибочных результатов. Пишем, что неправильный пейсинг — время задержки между сценариями — приведёт к некорректным данным тестов.
6. Раздел с описанием тестового стенда. Это схемы с серверами, заглушками и генераторами нагрузки.
7. Таблица с требованиями к железу.
8. Таблица отличий стенда от системы на продакшене.
9. Стратегия тестирования.
10. Описание видов тестирования.
11. Требования к производительности от заказчика.
12. Моделирование нагрузки.
13. Профиль (который мы получаем от аналитиков или собираем на основе бизнес-прогнозов).
14. Мониторинг.
15. Стоимость внезапного изменения требований к проекту. Это избавит исполнителя и заказчика от лишних забот.
16. Материалы для сдачи проекта, куда входит всё, что мы подготовили для следующего специалиста.
Зачем всё это?
Если заказчик ничего не знает о конкретном тестировании, методика ответит на все его вопросы. В ней объясняется, за что компания платит деньги подрядчику и какие результаты получит на выходе.
В МНТ можно дать определение максимальной производительности. Мы пишем, что выполним серию тестов и пошагово будем увеличивать нагрузку до предельной, а в конце сделаем контрольную проверку и выясним показатели производительности.
Стратегия заканчивается выводами и списком критериев успешного завершения НТ. В выводы включаются данные, которые мы получили в результате мониторинга, общее заключение и список успешно проведённых тестов.
Как проводят нагрузочное тестирование
Чтобы провести нагрузочные тесты новой системы, я использую такой чек-лист:
- Разбираюсь в системе.
- Узнаю, зачем клиенту нужно нагрузочное тестирование.
- Разрабатываю методику и стратегию.
- Пишу скрипты.
- Провожу тесты.
- Собираю данные мониторинга.
- Анализирую полученные данные.
- Пишу отчёт.
- Сверяюсь с МНТ, чтобы удостовериться, что все пункты выполнены.
ПО для НТ
Для проведения нагрузочного тестирования необходимо специфическое ПО.
Я лично работаю с HP LoadRunner, ещё есть ПО Gatling, Apache JMeter, BlazeMeter, LoadNinja и даже отечественный «Яндекс.Танк». У каждого из них есть свои плюсы и минусы: одни не работают со специфическими протоколами, другие бесплатны, третьи больше дружат с тяжёлыми скриптами и так далее.
Почему я использую LoadRunner? С одной стороны, он ориентирован на энтерпрайз-приложения — и это влияет на ценообразование, он очень дорогой. Да, пару десятков вьюзеров вы, конечно, сможете прогнать бесплатно, но этого не хватит для полноценного НТ, в котором используются сотни и тысячи виртуальных пользователей.
Зато LoadRunner позволяет тестировщикам ПО проводить комплексную оценку производительности своей системы. Его фишка — выявление узких мест ещё до того, как приложение будет внедрено или развёрнуто. В результате пользователи могут оценить каждый компонент по отдельности — даже прежде, чем он начнёт работать.
Выводы
- Нагрузочное тестирование не выявляет баги, а помогает узнать, на что способна система. Вы будете уверены, что сайт или приложение не упадут, когда пользователей станет больше или база данных вырастет.
- Работу нельзя начинать без методики нагрузочного тестирования. В ней необходимо указать, как пройдёт тестирование и какой результат получит клиент: это защищает от возможной нервотрёпки и судов.