Тестирование программного обеспечения, или испытание программных систем, — это системный процесс изучения программного продукта. Его задача — установить, насколько фактическое поведение программы совпадает с ожидаемым. Для этого используют ограниченный набор проверок, называемых тестами. Международный стандарт ISO/IEC TR 19759:2005 даёт похожее определение и подчёркивает проверочную роль тестирования.
За годы в профессиональном сообществе появилось множество определений, каждое подчёркивает свой аспект. Гленфорд Майерс акцентировал внимание на выполнении программы для поиска ошибок. Другие специалисты рассматривали тестирование как дисциплину для повышения надёжности при разумных затратах. С. Канер видел в тестировании источник информации о качестве для различных заинтересованных сторон. В общем и целом тестирование — это не только поиск дефектов, но и комплексная оценка соответствия продукта требованиям и ожиданиям пользователей.

История развития тестирования программного обеспечения
История тестирования плотно связана с развитием самой разработки программ. В начальный период, при создании первых вычислительных систем, тестирование было строго формализованным: данные, процедуры и результаты фиксировались подробно. Тестирование традиционно выделялось в отдельный этап и зачастую выполнялось теми же специалистами, кто писал код.
В 1960‑х годах популярной была идея исчерпывающего тестирования — проверки всех путей выполнения и всех входных данных. Быстро выяснилось, что это нереалистично: комбинаций входных данных и путей исполнения слишком много, а архитектурные и спецификационные ошибки таким способом часто не выявляются. Концепция оказалась теоретически интересной, но практически неприменимой.
В 1970‑х происходил переход к представлению тестирования как демонстрации корректности или подтверждения правильности работы. На практике доказательство корректности оказалось трудоёмким и неполным, поэтому его применение ограничилось, например, приёмочными испытаниями.
Позже, во второй половине 1970‑х, парадигма сместилась: тестирование стали рассматривать прежде всего как процесс поиска ошибок. Тест считался удачным, если он находил ранее неизвестные дефекты. Такой подход дал практический эффект, поскольку стимулировал активный поиск проблем и улучшал качество продукта.
В 1980‑е годы к задачам тестирования добавилось предупреждение дефектов. Проектирование тестов признали средством предотвращения ошибок, а сам процесс — управляемым и протяжённым по всему циклу разработки. Тесты стали охватывать требования, архитектуру, код и сами тестовые сценарии. Появление первых инструментов автоматизации в середине 1980‑х расширило возможности проверок и снизило трудоёмкость рутинных операций.
В 1990‑е тестирование превратилось в комплексную дисциплину, включающую планирование, проектирование, подготовку и выполнение тестов и окружений. В этот период развивались среды автоматизации, системы управления тестами и инструменты нагрузочного тестирования. С ростом сетевых и веб‑приложений возникла потребность в гибких подходах, которые шли в ногу с изменениями в разработке.

Цели и задачи тестирования программного обеспечения
Главная цель тестирования — дать объективную информацию о качестве продукта заинтересованным лицам, чтобы принять решение о выпуске или доработке. Для этого решают конкретные задачи:
Ниже перечислены основные задачи тестирования:
- обнаружение дефектов;
- проверка соответствия требованиям;
- оценка качества продукта;
- снижение рисков.
Подтверждение готовности к выпуску обычно описывается отдельно, поскольку это итоговое решение, основанное на собранных результатах тестирования.
Основные принципы тестирования
Эффективное тестирование опирается на ряд общепринятых принципов. Их знание помогает выстраивать процесс логично и экономично:
- Тестирование показывает наличие дефектов, но не их отсутствие.
- Исчерпывающее тестирование невозможно.
- Чем раньше начинается тестирование, тем дешевле исправлять ошибки.
- Дефекты концентрируются в ограниченном числе частей системы.
- Повторение одних и тех же тестов снижает их эффективность.
- Подходы к тестированию зависят от контекста и назначения системы.
- Соответствие требованиям не гарантирует удовлетворённость пользователей.
Стандарты в области тестирования
Существуют международные стандарты, которые выравнивают терминологию, процессы и требования к документации. Они помогают командам применять проверенные практики и говорить на одном языке при организации тестирования.
Классификации видов и методов тестирования
Тестирование охватывает множество подходов, которые удобно классифицировать по разным признакам. Это упрощает выбор методов для конкретной задачи.
По объекту тестирования
Ниже перечислены основные виды тестирования по объекту проверки:
- функциональное тестирование;
- тестирование производительности;
- конфигурационное тестирование;
- юзабилити‑тестирование;
- тестирование безопасности;
- тестирование локализации;
- тестирование совместимости.
Виды нагрузочного тестирования выделены отдельно:
- нагрузочное тестирование;
- стресс‑тестирование;
- тестирование стабильности.
По знанию внутреннего строения системы
Подходы различаются по объёму информации о внутренней структуре, доступной тестировщику:
- тестирование чёрного ящика;
- тестирование белого ящика;
- тестирование серого ящика.
По степени автоматизации
Тестовые проверки можно выполнять разными способами:
- ручное тестирование;
- автоматизированное тестирование;
- полуавтоматизированное тестирование.
По степени изолированности
Тестирование делят в зависимости от масштаба проверяемых единиц:
- тестирование компонентов;
- интеграционное тестирование;
- системное тестирование.
По времени проведения тестирования
Различают типы тестирования по стадии разработки:
- альфа‑тестирование;
- дымовое тестирование;
- тестирование новой функции;
- подтверждающее тестирование;
- регрессионное тестирование;
- приёмочное тестирование;
- бета‑тестирование.
По признаку позитивности сценариев
Сценарии разделяют по ожидаемому характеру входных данных:
- позитивное тестирование;
- негативное тестирование.
По степени подготовленности к тестированию
Тестовые подходы различаются по наличию документации и структурированности:
- тестирование по документации;
- интуитивное (ad hoc) тестирование.
Уровни тестирования
Тестирование выстраивается в уровнях с разными целями и объёмом проверок:
- тестирование компонентов;
- интеграционное тестирование;
- системное тестирование;
- альфа‑тестирование;
- бета‑тестирование.
Статическое и динамическое тестирование
Методы различаются по тому, запускается ли код во время проверки:
- динамическое тестирование;
- статическое тестирование.
Регрессионное тестирование
Регрессионное тестирование проводят после изменений в коде, чтобы убедиться, что исправления или новые функции не нарушили уже работающую функциональность. Его можно выполнять вручную или автоматизировать, что особенно полезно для крупных и часто обновляемых систем.

Тестовые сценарии
Тестовые сценарии — это набор шагов с условиями и ожидаемым результатом для проверки конкретной функции. Хорошо продуманные сценарии обеспечивают системность и повторяемость проверок и концентрируются на критичных участках системы.
Тестирование белого ящика, чёрного ящика и серого ящика
Эти термины описывают степень доступа к внутренностям системы при подготовке и выполнении тестов:
- тестирование белого ящика;
- тестирование чёрного ящика;
- тестирование серого ящика.
Альфа‑ и бета‑тестирование относятся к стадиям публикации и объёму аудитории, тогда как белый, чёрный и серый ящик описывают методы подготовки и выполнения тестов.
Покрытие кода
Покрытие кода — метрика белого ящика, показывающая, какая часть исходного кода была выполнена в ходе тестов. Различают основные типы покрытия:
Ниже перечислены способы измерения покрытия кода:
- покрытие операторов;
- покрытие условий;
- покрытие путей;
- покрытие функций.
Высокое покрытие не гарантирует полного отсутствия дефектов, но снижает риск пропуска ошибок в критичных частях кода.
Роль тестирования в жизненном цикле разработки программного обеспечения
Тестирование должно быть встроено в процесс разработки, а не восприниматься как финальная проверка. Современные практики предусматривают участие тестировщиков на этапах требований, проектирования, кодирования и последующей верификации. Такой сдвиг влево позволяет находить и устранять проблемы раньше и дешевле.
Инструменты для тестирования
Инструменты автоматизируют рутинные операции и помогают управлять процессом. Основные категории инструментов перечислены ниже:
- системы управления тестами;
- инструменты автоматизации тестирования;
- инструменты для нагрузочного тестирования;
- инструменты статического анализа кода;
- системы отслеживания ошибок.
Каждая категория решает отдельный набор задач: планирование, выполнение, измерение производительности, выявление уязвимостей и управление дефектами.
Профессия тестировщика
Тестировщик — это специалист, который глубоко погружается в продукт, требования и пользовательские сценарии. Он выступает представителем интересов пользователя, стремясь повысить качество и удобство. Для успешной работы нужны аналитическое мышление, внимательность, умение работать с документацией и инструменты автоматизации. Роль требует постоянного обучения и адаптации к технологиям и методологиям разработки.

