Сегодня рассмотрим один из особых видов тестирования — производительности, его подтипы, цели и задачи, а также установим и эксплуатируем инструмент Apache JMeter.
Дисклеймер: указанные в статье материалы допускаются в учебно-ознакомительных целях. Статьями 272–274 Уголовного Кодекса Российской Федерации предусмотрена ответственность за преступления в сфере компьютерной информации (Глава 28 УК РФ).
Тестирование производительности (англ. Performance Testing) — тестирование, которое проводится с целью определения того, как быстро работает вычислительная система или её часть под определённой нагрузкой. Согласно ISTQB, тестирование производительности — собирательное понятие, объединяющее все виды тестирования производительности (отклика) системы или её части под различными объёмами нагрузки.
В таблице приведены различные виды тестирования производительности и их цели:
Наиболее популярный вид тестирования производительности — это нагрузочное тестирование. Так, на популярном сайте по поиску работы HeadHunter, упоминание нагрузочного тестирования встречается в 959 открытых вакансиях в России. В 202 из них указан уровень получаемой заработной платы от 95 000 рублей, а из них — 21 вакансия с заработной платой от 335 000 рублей. Хороший стимул для изучения!
Перед тем, как перейти к рассмотрению инструмента Apache JMeter отметим, что IT-специалисты проводят тестирование производительности не в целях сломать систему (будьте специалистами — никогда так не делайте), а в целях исследования поведения системы при различных нагрузках (например, утром, днём, вечером, ночью), пиковых значениях (Новый год: когда все, ожидаемо, поздравляют друг друга), резких всплесках (выход какой-либо новости: например, после слов о введении режима самоизоляции при коронавирусе пользователи резко стали заходить в социальные сети, чтобы обсудить это с друзьями). Иными словами, система должна работать стабильно при любой ситуации — как запланированной, так и неожиданной. Задача специалистов по тестированию — сделать продукт качественнее, а пользователей — счастливее.
JMeter — инструмент для проведения нагрузочного тестирования, разрабатываемый Apache Software Foundation. Хотя изначально JMeter разрабатывался как средство тестирования web-приложений, в настоящее время он способен проводить нагрузочные тесты для JDBC-соединений, FTP, LDAP, SOAP, JMS, POP3, IMAP, HTTP и TCP.
Преимущество JMeter заключается в ряде факторов: это бесплатный инструмент с интуитивно понятным UI или работой из консоли, поддержкой многопоточности, расширяемостью, возможностью создания разнообразных отчётов. Многие инструменты нагрузочного тестирования используют под своей основой именно движок JMeter. Соответственно, данная программа является одной из самых популярных у специалистов.
Для запуска JMeter на ПК должен быть установлен Java Development Kit. Скачать его можно на официальном сайте компании Oracle.
Скачать Apache JMeter можно тут.
Распаковываем архив в папку C:\tools\jmeter. Открываем, заходим в папку /bin, выбираем jmeter.jar для Windows или jmeter.sh (Mac). Если всё сделали правильно, то увидим то же, что на скриншоте ниже.
Добавим пользователей, которые будут посещать vk.com/search. Для этого выбираем Test Plan, открываем контекстное меню кликом правой кнопкой мыши и затем следуем в /Add/Threads (Users)/Thread Group:
Нас интересует блок Thread Properties.
А) Number of Threads (users) — количество пользователей, посещающих web-ресурс (в учебно-ознакомительных целях укажем 10).
В) Ramp-up period (seconds) — время, в течение которого будут прибавляться пользователи. Необходимо для плавного старта. Укажем 2 секунды.
C) Load Count — количество итераций. В данном случае 1, то есть каждый пользователь сделает 1 запрос.
Напомним, злоумышленное использование данных параметров преследуется по закону. А при выставлении огромного количества пользователей могут повредиться память и режим работы процессора вашего ПК.
Запустим тест. Для этого нужно указать веб-адрес, подвергаемый нагрузке, и его тип запроса. Это делается через правый клик по уже добавленному Thread Group и выбор Add/Sampler/HTTP Request.
Заполним параметры. Protocol — https, Server Name — vk.com, HTTP Request — GET, Path — /search.
Чтобы исследовать результаты теста, в программе имеется несколько отчётов. Самый доступный для анализа — Summary Report, который добавляется через правый клик по Test Plan и далее — Add/Listener/Summary.
Запустим тест нажатием на кнопку Start (см. скриншот), предварительно его сохранив в папку bin (программа сама предложит это сделать).
В результате получаем следующие показатели:
# Samples — было сделано 10 запросов (10 пользователей по 1 запросу каждый).
Average — среднее время ответа составило 114 мс. При этом минимальное время ответа (Min) — 108 мс, максимальное (Max) — 126 мс.
Std. Dev. — показатель стандартного отклонения (5,90), позволяет оценить, насколько сильно значения из выборки (результата тестового прогона) отличаются от рассчитанного среднего значения.
Error % — количество ошибок в процентах, которое возвращает сервер (в данном случае ни одной).
Throughput — количество запросов в секунду (5,2).
Received — количество полученных данных (158,08 Кб/с).
Sent — количество отправленных данных (1,95 Кб/с).
Avg. Bytes — среднее количество полученных данных (30869 байт).
Специалист по тестированию сверяет полученные значения с установленными согласно спецификации/требованию заказчика/здравому смыслу. Наличие отклонений свидетельствует о возможном дефекте. Имея внутреннюю статистику по степени загрузки сайта в зависимости от времени, наличия «запланированных» событий, повышающих нагрузку (Новый Год, финал Чемпионата мира по футболу и т. д.), а также добавляя риски «незапланированных» событий (отключение одного из серверов) специалисты могут оптимизировать инфраструктуру ресурса с целью минимизации затрат. Полученные в результате тестирования данные важны для исправления различных дефектов, повышения качества работоспособности продукта в любых условиях.
Материал подготовил Илья Алимов — участник программы VK Testers. Присоединяйтесь к комьюнити бета-тестировщиков или посмотрите наши вакансии на сайте team.vk.company.