Что такое тестирование и как оно устроено
Вряд ли можно назвать хоть одну вещь, которую можно создать с нуля без единой ошибки. Разработка программ — не исключение: нельзя сказать, как именно поведет себя код в каждой конкретной ситуации, просто прочитав его. Для этого существует тестирование. В этой статье разберемся, как устроен этот процесс, на какие этапы делится и почему это важная инженерная практика.
Зачем тестировать программы
Тестирование программы — это важный этап разработки. Он помогает найти ошибки и проблемы в коде программы и устранить их на ранней стадии — еще до того, как с приложением будет взаимодействовать первый пользователь.
Представьте, что вы купили новую машину и сразу поехали на ней в путешествие из Владивостока в Лиссабон. Вам может повезти и по дороге ничего не сломается, но лучше заранее убедиться, что все работает хорошо и поездка пройдет без проблем. Тестирование работает по тому же принципу.
Кроме обнаружения ошибок, тестирование позволяет улучшить пользовательский опыт: программа, которая не зависает и работает без сбоев, будет пользоваться большей популярностью. А обнаружение багов на ранней стадии упрощает ее обслуживание и обновление.
Как проходит тестирование ПО
Суть процесса в сравнении реального поведения программы с ожидаемым. Разработчик или тестировщик вводит данные в разных комбинациях и форматах и проверяет, соответствует ли результат ожиданиям.
Например, на сайте есть форма регистрации пользователей с полями имя, фамилия, год рождения, номер телефона и автор электронной почты. Тесты покажут, как поведет себя программа, если пользователь напишет год рождения в неправильном формате, пропустит @ в адресе электронной почты или напишет имя капслоком.
Во время тестирования оцениваются безопасность, производительность, удобство для пользователей, а также совместимость программы с разными платформами и операционными системами.
Тестирование — это сложно?
У тестирования есть разные уровни, которые зависят от глубины проверок и сложности программы. Если речь идет о базовых сценариях, то тестирование пройдет просто и быстро. Но чем больше в программе компонентов и комбинаций входных и выходных данных, тем более трудоемким будет этот процесс. Хотя тестирование увеличивает время на разработку, это инвестиции, которые окупаются в долгосрочной перспективе.
Типичные ошибки при тестировании
Список наиболее распространенных ошибок, которые можно обнаружить при тестировании, выглядит так:
- Функциональные ошибки — проблемы с базовой функциональностью программы. Например, неправильный вывод или неработающие функции.
- Ошибки производительности — проблемы, связанные со скоростью, отзывчивостью и масштабируемостью программы.
- Ошибки совместимости — проблемы, возникающие при использовании программы с различным оборудованием, программным обеспечением или операционными системами.
- Ошибки безопасности — это уязвимости, которые могут позволить злоумышленнику получить несанкционированный доступ к программе или ее данным.
- Ошибки юзабилити — проблемы, связанные с интерфейсом программы и пользовательским опытом. Например, запутанная навигация или функции, которыми сложно пользоваться.
Типы тестирования
Функциональное и нефункциональное
Задача функционального тестирование — проверить корректность работы всех функций в программе и оценить код на соответствие требованиям и спецификациям.
Например, тезисный сценарий для функционального тестирование формы входа на сайт может выглядеть так:
- Может ли пользователь ввести свои логин и пароль
- Правильно ли система определяет допустимые и недопустимые попытки входа на сайт
- Правильную ли страницу видит пользователь в случае удачной или неудачной попытки входа на сайт
- Может ли пользователь выйти из системы.
Нефункциональное тестирование, напротив, сфокусировано на характеристиках программы. Этот тип тестирования проверяет производительность, безопасность, удобство использования, совместимость и надежность программы. Например, во время нефункционального тестирования можно выяснить следующее:
- Сайт быстро загружается для большинства пользователей, время загрузки страницы находится в допустимых пределах
- Сайт может обрабатывать большие объемы трафика без замедления или сбоев
- Сайт может обрабатывать большое количество одновременных запросов от пользователей без снижения производительности
- Поведение сайта стабильно при разных сетевых условиях и скоростях интернета
Функциональное и нефункциональное тестирование помогают оценить программу с разных сторон и, при соблюдении условий проверки, гарантировать, что она соответствует и функциональными требованиям, и стандартам производительности.
Статическое и динамическое
Это два противоположных друг другу типа тестирования. Статическое выполняется на ранней стадии без запуска кода и помогает предотвратить ошибки в программе. Динамическое, напротив, предполагает запуск кода, выполняется после компиляции и ищет уже совершенные при написании программы ошибки.
Статистическое тестирование требует больше времени (предварительное составление чек-листов, много встреч по доработке кода), но существенно дешевле, поскольку ищет ошибки на раннем этапе. Динамическое занимает меньше времени при разработке, но стоит дороже — на поиск и исправление багов после компиляции кода нужно больше времени и сил.
Другие виды тестирования
- Нагрузочное. Проверяет, как ведет себя программа при работе почти на максимальной мощности. Выявляет узкие места в производительности или проблемы, которые могут возникнуть в случае быстрого роста нагрузки.
- Тестирование UX. Проверяет, насколько пользователям будет удобно пользоваться программой и насколько ее функционал отвечает требованиям потенциальной аудитории.
- Конфигурационное. Проверяет корректность работы программы на различных аппаратных и программных платформах, а также ее совместимость с браузерами и операционными системами.
Что тестируют на разных этапах разработки
Модульное тестирование. Это самая ранняя стадия тестирования, которая проверяет отдельные компонентов и модули программы отдельно друг от друга (или изолированно). Цель модульного тестирования — выявить ошибки на ранних стадиях написания программ и убедиться, что каждый компонент работает должным образом.
Интеграционное тестирование. Следующий этап после модульного тестирования, во время которого отдельные компоненты интегрируются в целостную систему. Интеграционное тестирование проверяет взаимодействие между компонентами и позволяет убедиться, что они работают вместе так, как ожидалось.
Тестирование системы. В этом этапе участвует вся система целиком. Системное тестирование проверяет, соответствует ли система своим требованиям и спецификациям и как она ведет себя при различных сценариях.
Приемочное тестирование. Заключительный этап, который проводится заказчиком программы. Его цель — проверить, что система соответствует требованиям и ожиданиям.
После приемки проводится тестирование производительности, безопасности и регрессионное тестирование. Последнее помогает убедиться, что изменения в системе не вызовут побочных эффектов или непредсказуемых последствий для функциональности программы.
Как проходит тестирование
Тестирование, как и любой другой процесс в разработке, проходит в несколько этапов. Вот основные из них:
- Планирование. Перед началом тестирования создается план, в котором описываются масштабы, цели и подход к тестированию. В нем обычно прописаны типов тестирования, которые будут выполняться, ресурсы, которые потребуются, и очередность для каждого из этапов.
- Подготовка. Следующий шаг — настройка среды тестирования,планирование и получение всех ресурсов, которые могут пригодиться в процессе. К последним, например, относится установка программного обеспечения, создание тестовых примеров и подготовка тестовых данных.
- Выполнение. Только теперь начинается фактическое выполнение тестирования. Данные о любых ошибках или проблемах записываются и анализируются.
- Отчетность. После завершения тестирования создается отчет, в котором собираются его результаты. Обычно он включает в себя список обнаруженных ошибок, их серьезность и статус любых исправлений, которые были реализованы.
- Проверка. После исправления ошибок система повторно тестируется, чтобы убедиться, что все проблемы устранены. Это может быть как повторный запуск тех же тестов, так и проведение новых.
- Развертывание. Как только система пройдет все необходимые тесты и будет проверена на качество, начинается ее развертывание.
Принципы успешного тестирования
Вот несколько принципов, которые помогут сделать тестирование эффективнее:
- Четко определенные цели и задачи. Начать планирование стоит с четкого понимания, какого результата вы хотите достичь и какие конкретные протестировать.
- Раннее и непрерывное тестирование. Начинайте тестирование на ранней стадии и продолжайте проводить проверки на протяжении всего процесса разработки. Такой подход позволит быстро выявить проблемы, сэкономит много вашего времени и денег компании, в которой вы работаете.
- Достаточные ресурсы и время. Как уже говорилось выше, тестирование может отнять дополнительное время и ресурсы разработчика. Но спешка не позволит гарантировать качество, поэтому экономить время на тестировании не стоит.
- Хорошо продуманные тестовые сценарии. Чем лучше продуманы тестовые сценарии и чем больше ситуаций они охватывают, тем меньше ошибок остается в коде.
- Автоматизация. Автоматизируйте как можно больше тестов: это позволит сэкономить время и повысить эффективность.
- Регулярная отчетность и обратная связь. Регулярно отчитывайтесь о ходе тестирования и предоставляйте обратную связь по его результатам. Это помогает выявлять проблемы и отслеживать прогресс в достижении целей тестирования.
Заключение
Хотя со стороны тестирование может показаться сложным, его внедрение заметно повышает качество кода. Чем лучше протестирована программа, тем удобнее ее обслуживать, обновлять и масштабировать. Это важная инженерная практика, которой стоит уделить достаточно внимания.