Команда QA инженеров Solid Systems и что мы используем в своей работе
Тестирование программного обеспечения – неотъемлемая часть создания и поддержки программного продукта.
Команда Solid Systems поддерживает методологии гибкой разработки (Agile, Scrum, Экстремальное программирование), ориентированные в первую очередь на использование интерактивной разработки, динамического формирования и изменения требований и обеспечение постоянного взаимодействия внутри рабочей группы. Данный подход нацелен на минимизацию рисков посредством разработки в рамках коротких итераций.
Как и процесс разработки, процесс непрерывного последующего тестирования программного обеспечения на разных стадиях жизненного цикла является залогом качества и также следует определенной методологии. Методология в данном конкретном случае – всевозможное разнообразие и правильное использование комбинаций идей, принципов, концепций и методов, к которым мы прибегаем во время взаимодействия с проектом.
Технологии тестирования
Методология гибкой разработки предполагает участие команды QA инженеров на всех этапах жизненного цикла программного продукта, что говорит о применении в нашей работе двух основных технологий тестирования:
- Статической.
- Динамической.
Процесс статического тестирования напрямую связан с анализом требований, системных и функциональных спецификаций, технических заданий, документов Архитектура, проектирования компонентов и т.д. Использование статического метода тестирования позволяет обнаружить дефекты на раннем этапе разработки программного средства, поскольку позволяет проводить анализ без запуска исходного программного кода приложения. Данный подход предполагает написание пользовательских сценариев, тест кейсов, анализ узких и важных мест разработанного или исправленного модуля до начала запуска и основной проверки программного продукта.
Динамическое тестирование проводится только на работающей системе или подсистеме. Динамический метод занимает большую часть процесса тестирования и является важнейшим звеном всего этапа тестирования. В процессе динамического тестирования важно анализировать три главные составляющие:
- Корректность запуска системы или подсистемыю
- Правильность работы отдельных функциональных элементов или модулей и их взаимодействие.
- точность результата взаимодействия пользователя с системой через графический интерфейс.
Методы тестирования
Среди методов тестирования обычно принято выделять два основных и самых распространенных: метод «черного ящика» и метод «белого ящика» (конечно, можно вписать еще и промежуточный метод «серого ящика», но это уже другая история).
Специфика клиент-серверного приложения позволяет использовать в процессе тестирования наших продуктов «black-box» testing. В данном случае QA инженер имеет доступ к программному продукту только через те же интерфейсы, что и пользователь (графический интерфейс или API). Это позволяет должным образом проработать все пользовательские сценарии на поиск критических мест приложения.
Типы тестирования и применяемые программные средства
Регрессионное тестирование.
Важнейший вид тестирования в методологии гибкой разработки, направленный на проверку изменений, которые были сделаны в приложении или в окружающей среде (новая задача, починка дефекта, миграция на другой сервер и любое другое изменение).
Как правило, для данного типа тестирования используются тест кейсы, написанные на ранних стадиях разработки или тестирования. Каждое изменение в поведении рабочей системы заносится в тест кейсы, что дает гарантию того, что изменения новой версии не повредили уже существующую функциональность (тест кейсы содержат функциональные тесты, позволяющие проверять соответствие продукта функциональным требованиям и спецификациям).
При проведении регрессионного тестирования отдел QA использует собственное приложение для хранения тест кейсов (написано под свои нужды после анализа существующих решений), позволяющее составлять чек-листы, хранить задачи в виде n-мерного дерева, вести одновременную проверку одного или нескольких проектов различными людьми и просматривать прогресс проводимого тестирования.
Нагрузочное тестирование.
Приложения, разрабатываемые командой Solid Systems, являются высоконагруженными и обязаны работать бесперебойно под высокими нагрузками. Любого рода проблемы, которые связаны с плохой производительностью, могут стать причиной отказа клиентов от использования наших систем. Поэтому проведение нагрузочного тестирования – обязательная часть процесса в обеспечении стабильности работы приложений.
Используемые виды нагрузочного тестирования:
- performance testing (тестирование производительности) – определение масштабируемости под нагрузкой (измерение времени выполнения запросов и выбранных операций при определенных интенсивностях этих операций, определение критического количества пользователей, одновременно работающих с приложением, границ необходимой производительности при увеличении нагрузки, исследование производительности на высоких, стрессовых и предельных нагрузках);
- stress testing (стрессовое тестирование) – проверка работоспособности приложения в условиях стресса, высоких нагрузках и оценка способности системы к регенерации после прекращения воздействия стресса. Обычно цели стрессового тестирования пересекаются с тестированием производительности, так как одной из задач stress testing] является оценка деградации производительности;
- volume testing (объемное тестирование) – оценка производительности приложения при увеличении объемов в базе данных приложения (измерение времени выполнения запросов и выбранных операций при повышении нагрузки, оценка одновременно работающих с данными пользователей);
- stability testing (тестирование стабильности) – проверка корректной работоспособности приложения при длительном тестировании с нагрузкой среднего уровня. На первом месте в тестировании стабильности находится проверка на отсутствие перезапуска сервера, отказов в ответе, утечек памяти и других критериев, которые влияют на стабильность системы в целом.
В своей работе для реализации каждого отдельного вида нагрузочного тестирования командой QA инженеров используется Apache Jmeter –легковесный и очень мощный инструмент для проведения нагрузочного тестирования с большим количеством запросов, которые можно распараллелить на нескольких машинах. Jmeter представляет собой Java приложение, что позволяет проводить нагрузочное тестирование любого WEB-приложения, писать скрипты на Java или Javascript, проводить нагрузочные тесты для JDBC, HTTP, FTP, TCP, SOAP, JMS и т.д. В программе реализованы механизмы авторизации виртуальных пользователей, поддерживаются пользовательские сеансы, организовано логирование результатов теста и разнообразная визуализация результатов в виде диаграмм (есть все, что нужно для проведения нагрузочного тестирования, а чего нет, можно написать самому).
Тестирование интерфейса
Тестирование интерфейса включается в себя проверку функциональных характеристик, удобства использования, понятности и соответствия дизайну и определенному стилю (при различных разрешениях экрана и браузерах, в ограниченных условиях и т.д.). В большинстве случаев тестирование интерфейса предполагает ручное тестирование, позволяющее провести сверку UI приложения и макета дизайна или прототипа.
Ручное тестирование взаимодействия пользователя с системой это хорошо, но нельзя не согласиться, что проект с тестами это еще лучше. В тестировании функциональной части взаимодействия пользователя с приложением важен системный подход, который мы стараемся использовать и поддерживать. Мы проводим автоматизированные тесты, позволяющие снизить количество рутинной работы и проверить интерфейс и бизнес-логику приложения.
Для осуществления данной задачи используется Selenium Webdriver – набор инструментов, предназначенных для автоматизации управления браузерами. Выбор Selenium Webdriver обусловлен разработкой собственного фреймворка автоматизации тестирования под нужды наших приложений, способностью работать с любым современным браузером. Немаловажной деталью является возможность написания больших тестовых наборов с достаточно сложной логикой поведения и проверок на Java.
Основные преимущества Selenium Webdriver:
- кросс – браузерная совместимость (Firefox, Chrome, Internet Explorer, Safari);
- поддержка большого количества языков программирования (Java, C#, Ruby, Python);
- совместимость со всеми основными платформами (Windows, Mac OS, Linux) – очень удобно, когда можно вести разработку под Windows и запускать тесты на линуксовом сервере;
- поддержка распределения тестов.
При тестировании GUI приложений, мы эмулируем действия пользователя, что позволяет протестировать не только возможные взаимодействия с интерфейсом, но и функциональность приложения в целом.
Тестирование собственного API
Тестирование API становится особенно востребованным в свете растущей популярности микросервисной Архитектура. Наша компания придерживается RESTful подхода к построению программного интерфейса веб-интерфейса.
REST (Representational State Transfer – «передача состояния представления») обеспечивает общение между клиентом и сервером с помощью обычных HTTP-запросов (GET, POST, PUT, DELETE), передавая информацию от клиента в параметрах самих запросов, информацию от сервера – в теле ответа (например, JSON-объект или XML-документ).
В своей работе мы начали использовать тестирование REST API по нескольким причинам:
- независимость проверки функционала от GUI. Многочисленные действия в браузере часто являются причиной ложных «падений» автоматизированных тестов (например, в Selenium). Сформировав запрос программно, мы сокращаем время на подготовку данных в браузере и отправку их на сервер;
- точность локализации и интерпретации данных. Ошибка в GUI не всегда говорит о том, что произошло в системе. Гораздо проще анализировать проблему, когда известно, какая именно функция системы дала сбой;
- возможность проводить тесты на больших наборах входных данных. Очень важная задача тестирования «черного ящика» - проводить тесты с большим количеством разнообразных наборов входных данных, которые легко можно отделить от кода самого теста (методология Data Driving Testing). На уровне HHTP-запросов это делается очень быстро и с более высокой надежностью.
Для тестирования REST сервисов используется библиотека Rest-Assured, которая является надстройкой над HTTP Builder. Библиотека поддерживает все виды HTTP-запросов (POST, GET, PUT, DELETE, OPTIONS, PATCH, HEAD). Так же может быть использована и для проверки ответов по конкретно заданным запросам.
Rest-Assured использует синтаксис в стиле BDD (Behavior Driven Development – подход к автоматизации тестирования, стремящийся описывать код тестов языком, близким к естественному) с характерными ключевыми словами given, when, then .что позволяет быстро и без каких-либо серьезных усилий писать тесты любой сложности.