Что такое тестирование и как оно устроено

Что такое тестирование и как оно устроено

Вряд ли можно назвать хоть одну вещь, которую можно создать с нуля без единой ошибки. Разработка программ — не исключение: нельзя сказать, как именно поведет себя код в каждой конкретной ситуации, просто прочитав его. Для этого существует тестирование. В этой статье разберемся, как устроен этот процесс, на какие этапы делится и почему это важная инженерная практика.

Зачем тестировать программы

Тестирование программы — это важный этап разработки. Он помогает найти ошибки и проблемы в коде программы и устранить их на ранней стадии — еще до того, как с приложением будет взаимодействовать первый пользователь.  

Представьте, что вы купили новую машину и сразу поехали на ней в путешествие из Владивостока в Лиссабон. Вам может повезти и по дороге ничего не сломается, но лучше заранее убедиться, что все работает хорошо и поездка пройдет без проблем. Тестирование работает по тому же принципу.

Кроме обнаружения ошибок, тестирование позволяет улучшить пользовательский опыт: программа, которая не зависает и работает без сбоев, будет пользоваться большей популярностью. А обнаружение багов на ранней стадии упрощает ее обслуживание и обновление.

Как проходит тестирование ПО

Суть процесса в сравнении реального поведения программы с ожидаемым. Разработчик или тестировщик вводит данные в разных комбинациях и форматах и проверяет, соответствует ли результат ожиданиям.

Например, на сайте есть форма регистрации пользователей с полями имя, фамилия, год рождения, номер телефона и автор электронной почты. Тесты покажут, как поведет себя программа, если пользователь напишет год рождения в неправильном формате, пропустит @ в адресе электронной почты или напишет имя капслоком.

Во время тестирования оцениваются безопасность, производительность, удобство для пользователей, а также совместимость программы с разными платформами и операционными системами.

Тестирование — это сложно?

У тестирования есть разные уровни, которые зависят от глубины проверок и сложности программы. Если речь идет о базовых сценариях, то тестирование пройдет просто и быстро. Но чем больше в программе компонентов и комбинаций входных и выходных данных, тем более трудоемким будет этот процесс. Хотя тестирование увеличивает время на разработку, это инвестиции, которые окупаются в долгосрочной перспективе.

Типичные ошибки при тестировании

Список наиболее распространенных ошибок, которые можно обнаружить при тестировании, выглядит так:

  • Функциональные ошибки — проблемы с базовой функциональностью программы. Например, неправильный вывод или неработающие функции.
  • Ошибки производительности — проблемы, связанные со скоростью, отзывчивостью и масштабируемостью программы.
  • Ошибки совместимости — проблемы, возникающие при использовании программы с различным оборудованием, программным обеспечением или операционными системами.
  • Ошибки безопасности — это уязвимости, которые могут позволить злоумышленнику получить несанкционированный доступ к программе или ее данным.
  • Ошибки юзабилити — проблемы, связанные с интерфейсом программы и пользовательским опытом. Например, запутанная навигация или функции, которыми сложно пользоваться.

Типы тестирования

Функциональное и нефункциональное

Задача функционального тестирование — проверить корректность работы всех функций в программе и оценить код на соответствие требованиям и спецификациям.

Например, тезисный сценарий для функционального тестирование формы входа на сайт может выглядеть так:

  • Может ли пользователь ввести свои логин и пароль
  • Правильно ли система определяет допустимые и недопустимые попытки входа на сайт
  • Правильную ли страницу видит пользователь в случае удачной или неудачной попытки входа на сайт
  • Может ли пользователь выйти из системы.

Нефункциональное тестирование, напротив, сфокусировано на характеристиках программы. Этот тип тестирования проверяет производительность, безопасность, удобство использования, совместимость и надежность программы. Например, во время нефункционального тестирования можно выяснить следующее:

  • Сайт быстро загружается для большинства пользователей, время загрузки страницы находится в допустимых пределах
  • Сайт может обрабатывать большие объемы трафика без замедления или сбоев
  • Сайт может обрабатывать большое количество одновременных запросов от пользователей без снижения производительности
  • Поведение сайта стабильно при разных сетевых условиях и скоростях интернета

Функциональное и нефункциональное тестирование помогают оценить программу с разных сторон и, при соблюдении условий проверки, гарантировать, что она соответствует и функциональными требованиям, и стандартам производительности.

Статическое и динамическое

Это два противоположных друг другу типа тестирования. Статическое выполняется на ранней стадии без запуска кода и помогает предотвратить ошибки в программе. Динамическое, напротив, предполагает запуск кода, выполняется после компиляции и ищет уже совершенные при написании программы ошибки.

Статистическое тестирование требует больше времени (предварительное составление чек-листов, много встреч по доработке кода), но существенно дешевле, поскольку ищет ошибки на раннем этапе. Динамическое занимает меньше времени при разработке, но стоит дороже — на поиск и исправление багов после компиляции кода нужно больше времени и сил.

Другие виды тестирования

  • Нагрузочное. Проверяет, как ведет себя программа при работе почти на максимальной мощности. Выявляет узкие места в производительности или проблемы, которые могут возникнуть в случае быстрого роста нагрузки.
  • Тестирование UX. Проверяет,  насколько пользователям будет удобно пользоваться программой и насколько ее функционал отвечает требованиям потенциальной аудитории.
  • Конфигурационное. Проверяет корректность работы программы на различных аппаратных и программных платформах, а также ее совместимость с браузерами и операционными системами.

Что тестируют на разных этапах разработки

Модульное тестирование. Это самая ранняя стадия тестирования, которая проверяет отдельные компонентов и модули программы отдельно друг от друга (или изолированно). Цель модульного тестирования — выявить ошибки на ранних стадиях написания программ и убедиться, что каждый компонент работает должным образом.

Интеграционное тестирование. Следующий этап после модульного тестирования, во время которого отдельные компоненты интегрируются в  целостную систему. Интеграционное тестирование проверяет взаимодействие между компонентами и позволяет убедиться,  что они работают вместе так, как ожидалось.

Тестирование системы. В этом этапе участвует вся система целиком. Системное тестирование проверяет, соответствует ли система своим требованиям и спецификациям и как она ведет себя при различных сценариях.

Приемочное тестирование. Заключительный этап, который проводится заказчиком программы. Его цель — проверить, что система соответствует требованиям и ожиданиям.

После приемки проводится тестирование производительности, безопасности и регрессионное тестирование. Последнее помогает убедиться, что изменения в системе не вызовут побочных эффектов или непредсказуемых последствий для функциональности программы.

Как проходит тестирование

Тестирование, как и любой другой процесс в разработке, проходит в несколько этапов. Вот основные из них:

  • Планирование. Перед началом тестирования создается план, в котором описываются масштабы, цели и подход к тестированию. В нем обычно прописаны типов тестирования, которые будут выполняться, ресурсы, которые потребуются, и очередность для каждого из этапов.
  • Подготовка. Следующий шаг — настройка среды тестирования,планирование и получение всех ресурсов, которые могут пригодиться в процессе. К последним, например, относится установка программного обеспечения, создание тестовых примеров и подготовка тестовых данных.
  • Выполнение. Только теперь начинается фактическое выполнение тестирования. Данные о любых ошибках или проблемах записываются и анализируются.
  • Отчетность. После завершения тестирования создается отчет, в котором собираются его результаты. Обычно он включает в себя список обнаруженных ошибок, их серьезность и статус любых исправлений, которые были реализованы.
  • Проверка. После исправления ошибок система повторно тестируется, чтобы убедиться, что все проблемы устранены. Это может быть как повторный запуск тех же тестов, так и проведение новых.
  • Развертывание. Как только система пройдет все необходимые тесты и будет проверена на качество, начинается ее развертывание.

Принципы успешного тестирования

Вот несколько принципов, которые помогут сделать тестирование эффективнее:

  • Четко определенные цели и задачи. Начать планирование стоит с четкого понимания, какого результата вы хотите достичь и какие конкретные протестировать.
  • Раннее и непрерывное тестирование. Начинайте тестирование на ранней стадии и продолжайте проводить проверки на протяжении всего процесса разработки. Такой подход позволит быстро выявить проблемы, сэкономит много вашего времени и денег компании, в которой вы работаете.
  • Достаточные ресурсы и время. Как уже говорилось выше, тестирование может отнять дополнительное время и ресурсы разработчика. Но спешка не позволит гарантировать качество, поэтому экономить время на тестировании не стоит.
  • Хорошо продуманные тестовые сценарии. Чем лучше продуманы тестовые сценарии и чем больше ситуаций они охватывают, тем меньше ошибок остается в коде.
  • Автоматизация. Автоматизируйте как можно больше тестов: это позволит сэкономить время и повысить эффективность.
  • Регулярная отчетность и обратная связь. Регулярно отчитывайтесь о ходе тестирования и предоставляйте обратную связь по его результатам. Это помогает выявлять проблемы и отслеживать прогресс в достижении целей тестирования.

Заключение

Хотя со стороны тестирование может показаться сложным, его внедрение заметно повышает качество кода. Чем лучше протестирована программа, тем удобнее ее обслуживать, обновлять и масштабировать. Это важная инженерная практика, которой стоит уделить достаточно внимания.