Одним из этапов разработки серьезного программного продукта является тестирование. Оно бывает нескольких видов: модульное, интеграционное, функциональное и нагрузочное. Последнее считается наиболее важным и, в то же время, сложным. Его задача – проверить производительность и отказоустойчивость программы в условиях большого количества обращений и запросов со стороны пользователей.
Для чего нужно тестирование
Разрабатываемый продукт никогда не выйдет в релиз без предварительного тестирования. Оно проводится на разных этапах разработки, и чем ближе программа к запуску, тем больше времени уделяется проведению различных тестов.
Глобально, тестирование представляет собой проверку продукта на предмет соответствия предъявляемым к нему требованиям. В идеале схема выглядит следующим образом:
- заказчик обращается к бизнес-аналитикам, которые составляют перечень требований;
- затем архитекторы преобразовывают их в ТЗ (техническое задание);
- на его основе программисты пишут код;
- тестировщики проверяют его на соответствие заявленным требованиям.
В зависимости от сложности продукта, предъявляемые требования могут кардинально отличаться. Следовательно, и трудоемкость тестирования может быть совершенно разной. Например, в одном проекте необходимо проверить, располагается ли «меню-бургер» справа и соответствует ли фон страницы выбранной цветовой гамме, а в другом – выдерживает ли система десятки тысяч одновременных пользовательских запросов, при средней скорости обработки не более 2-3 секунд.
Отличия нагрузочного тестирования от других типов подобных работ
Поскольку требования могут сильно варьироваться, в различных видах тестирования также встречаются расхождения (объем работ, цели, квалификация тестировщиков, приоритеты). Чаще всего встречаются следующие разновидности тестирования: автоматизированное функциональное, функциональное и нагрузочное.
Ручное функциональное тестирование
Самый популярный метод, использующийся при разработке практически всех программных продуктов. Ручное функциональное тестирование – это первый этап проверки новой системы. Только после его проведения можно приступать к НТ и АФТ.
Чтобы проводить ФТ, тестировщик должен знать функциональные особенности тестируемой программы, разрабатывать тестовые сценарии, а также разбираться в технической документации. Для освоения данной профессии не требуется фундаментальных технических знаний, достаточно знать базовые принципы работы ПК и хотеть развиваться в новом направлении.
Автоматизированное функциональное тестирование
Данный вид тесно связан с процессом разработки, поскольку от специалистов требуется писать код на различных языках программирования (Python, Java, C# и т.д.). Это необходимо для автоматизации процессов ручного тестирования функциональных возможностей, для которого характерны объемные тесты и проверки.
Как и в предыдущем пункте, здесь широко охватываются функциональные аспекты продукта. Поэтому АФТ требует глубокого погружения в логику исследуемой программы.
Тестировщиков часто сравнивают с программистами и этому есть свое объяснение. К навыкам этих специалистов предъявляются более серьезные требования. От кандидата на должность требуется понимание принципов ООП (объектно-ориентированного программирования), владение SQL и знание хотя бы одного языка программирования. В процессе работы, тестировщик познакомится с другими ЯП, изучит специальные фреймворки, будет взаимодействовать с несколькими инструментами оптимизации, а также приобретет навыки в области DevOps и автоматизации тестирования.
Нагрузочное тестирование
Нагрузочное тестирование является ключевым моментом в проверке программного продукта. Оно позволяет провести испытание нефункциональных требований, предъявляемых к проекту. Это стабильность, производительность, масштабируемость стрессо- и отказоустойчивость.
Поскольку данная разновидность не подразумевает глубоко погружения в функциональные аспекты, может показаться, что по уровню сложности она расположена между функциональным и автоматизированным тестированием. Это не совсем верное предположение. Специалист, занимающийся НТ, должен обладать навыками, характерными сразу для нескольких IT-направлений.
Нагрузочное тестирование требует от специалиста знания архитектуры разработанной системы. Важно понимать, как устроена программа, как она реагирует на взаимодействие с другим ПО, какие источники нагрузки существуют. Также грамотный тестировщик должен владеть знаниями из области аналитики, чтобы разбираться с нестандартными предъявляемыми требованиями и уметь составлять корректные модели тестирования.
Более того, специалисты в этой области выполняют функции администратора и программиста. В первом случае, НТ предполагает взаимодействие с базами данных, инструментами для мониторинга, серверным ПО и операционными системами. Во втором – с различными языками программирования, такими как: Java, С, Scala и Python.
Необходимость владения навыками программирования объясняется инструментарием, который используется при нагрузочном тестировании. Тестировщик пишет различные эмуляторы, скрипты для моделирования нагрузки, а также программы для сбора информации и генерации тестовых данных.
Перечисленные выше разновидности тестирования имеют разные цели и задачи. Объединяющим фактором для них выступает проверка программного продукта на соответствие заданным требованиям.
Виды нагрузочного тестирования
Как и любая другая разновидность, нагрузочное тестирование делится на несколько подтипов:
- тест на стабильность – проверка работоспособности системы на длительном временном отрезке;
- тест на отказоустойчивость – с его помощью специалисты проверяют насколько быстро продукт сможет возобновить работу после его переноса на новый сервер.
- тест на восстановление – помогает определить срок, за который система сможет возобновить работу в случае возникновения внештатной ситуации.
- тест на нагрузку – проверка работоспособности программы при воздействии на нее стандартной нагрузки;
- тест масштабируемости – с его помощью определяется время, для развертки нового кластера;
- стресс-тест – специалисты увеличивают нагрузку на систему до предельных значений и оценивают ее поведение в экстремальных условиях;
- тест объема – проверяется способность системы выдерживать одновременно максимально возможное количество пользователей;
- тест потенциальных возможностей – данная разновидность НТ помогает понять предельные возможности системы (максимальное количество посетителей, предельный объем записей в базе данных, количество одновременных процессов и т.д.).
Поскольку НТ не затрагивает проверку функционала, рамки между его разновидностями могут довольно сильно стираться. Тест на стрессоустойчивость перерастает в тестирование объема, а оно, в свою очередь, трансформируется в тест нагрузки или масштабируемости. Если испытание заканчивается неудачей, наступает очередь тестов, связанных с восстановлением. Именно поэтому тестировщики, работают с заданиями, направленными на проверку конкретного требования.
Методика нагрузочного тестирования
Проверке программного продукта предшествует этап разработки методики нагрузочного тестирования (МТН). Это документ, в котором отражены сценарии дальнейшего развития и прогнозы, помогающие строить гипотезы.
Алгоритм составления МТН выглядит следующим образом:
- вначале специалисты собирают подробную информацию о проекте, чем больше будет вводных данных, тем лучше. На их основе формируется перечень ключевых терминов, которые помогают избежать проблем во время анализа результатов;
- далее выбираются цели и задачи тестирования;
- устанавливаются ограничения, которыми могут быть некоторые функции системы или баги, ранее определенные тестировщиками;
- оговариваются правила для моделирования системы. Они несколько отличаются от реальных условий, в которых будет использоваться продукт. Для их обеспечения используются эмуляторы и специальные заглушки;
- составляется перечень возможных ошибок и причин, которые могли к ним привести;
- устанавливаются характеристики стенда для тестирования и программных решений, применяемых в ходе испытаний;
- определяются характеристики, предъявляемые к исследуемому продукту;
- описываются все этапы проверки в условиях моделирования нагрузки на систему;
- составляется список результатов НТ и методов, применяющихся для проведения анализа;
- даются рекомендации по решению потенциальных проблем в наиболее уязвимых местах, составляются требования к отчетной документации, а также определяется максимально возможная производительность тестируемой системы.
Данная схема представляет примерный план, пункты которого могут меняться в зависимости от специфики тестируемого проекта и задач, поставленных перед командой разработчиков.
Составление МТН помогает повысить эффективность процесса тестирования и доказать его актуальность заказчику. Кроме этого, документация позволяет сформулировать задачи таким образом, чтобы они были максимально понятны тестировщикам.
Этапы нагрузочного тестирования
Нагрузочное тестирование – сложный процесс, требующий выполнения целого ряда действий. Чаще всего они проводится в соответствии со следующим планом:
- изучение программного продукта;
- взаимодействие с клиентом, в ходе которого определяются цели НТ;
- разработка стратегии тестирования;
- создание необходимых методик и скриптов;
- проведение необходимых испытаний;
- сбор и анализ полученных данных;
- подготовка отчетной документации;
- проверка выполнения поставленных задач и сравнение с МТН.
Что должен уметь специалист по нагрузочному тестированию
Нагрузочное тестирование требует наличия разносторонних знаний. Обычно, навыки тестировщика должны соответствовать уровню «middle+» или выше. По сути, такой сотрудник в состоянии самостоятельно справится со стандартным проектом по нагрузочному тестированию.
Первое на что стоит обратить внимание – умение составлять и читать техническую документацию. Это может быть отчетность, тематическая литература, ТЗ или методика нагрузочного тестирования. Чтобы работать эффективно, тестировщику необходимо постоянно поддерживать контакт с членами команды и заказчиком. Для этого он должен иметь опыт ведения письменных и телефонных переговоров.
Не менее важны навыки программирования. Знание ЯП должно быть на таком уровне, чтобы тестировщик мог решить поставленные задачи наиболее оптимальным способом. Однако от него не требуется самостоятельно разрабатывать продукты или вносить глобальные изменения в программный код.
Важно уметь взаимодействовать с базами данных и серверами. Хорошему специалисту просто необходимы навыки администрирования. Сбор статистики и логов, настройка стенда НТ – это лишь малая часть того, с чем тестировщик сталкивается каждый день. Сюда же относится умение работать со средствами мониторинга. Если не собирать данные о состоянии системы, находящейся под нагрузкой, то пользы от нагрузочного тестирования практически не будет.
Тестировщики работают с моделями нагрузки, которые они самостоятельно создают на основе ее источников. Для этого должно быть понимание архитектурных принципов, лежащих в основе сетевых технологий и интеграционных решений. Кроме этого, нужны базовые знания математической статистики. Они нужны для обработки результатов НТ и полученных статистических данных.
И, наконец навык, без которого не обходится работа ни одного IT-специалиста – умение пользоваться интернетом и искать в нем нужную информацию. Практика показывает, что на каждом новом проекте специалисты сталкиваются с новыми технологиями, с которыми они раньше не работали. Чтобы быстро освоить определенный инструмент, тестировщик должен владеть техническим английским, иначе процесс изучения может сильно затянуться.