Тестирование ПО

Тема 5

Тестирование рассматривается как метод конструирования, контроля качества, верификации и валидации программ, в методологии TDD и как средство получения требований к ПО. Теория тестирования выступает против необоснованного уровня доверия к серии успешно пройденных тестов. К сожалению, большинство установленных результатов теории тестирования – негативны, означая, по словам Дейкстры, то, что “тестирование программы может использоваться для демонстрации наличия дефектов, но никогда не покажет их отсутствие”. Основная причина этого в том, что полное (всеобъемлющее) тестирование недостижимо для реального программного обеспечения.

1. Понятие тестирования

Тестирование (testing) – это набор операций, проводимых для обеспечения выявления и/или оценки свойств одного или более программных элементов.

Оно служит механизмом получения доказательств качества на всех уровнях создания системы

Артефакт: План тестирования, тестовый сценарий, контрольный пример, отчет об ошибках, матрица прослеживаемости тестирования, тестовое покрытие.

ST_type.png

2. Модульное тестирование

Объект тестирования: Минимально возможный, изолированный компонент исходного кода (отдельная функция, метод класса или сам класс).

  • Кто выполняет: Непосредственно разработчик (Software Engineer) в процессе конструирования.
  • Главная цель: Проверить корректность внутренней логики модуля, алгоритмов и граничных условий в полной изоляции от внешней среды (баз данных, сети, файловой системы).
  • Особенности реализации:
    • Пишется в виде кода с использованием специализированных фреймворков (JUnit, NUnit, PyTest).
    • Изоляция зависимостей: Для исключения влияния внешнего мира используются тестовые дублеры (Test Doubles):
      • Stubs (Заглушки): Возвращают жестко заданные данные при вызове.
      • Mocks (Макеты): Проверяют сам факт вызова метода и правильность переданных в него аргументов.
  • Метрика эффективности: Покрытие кода тестами (Code Coverage) — процент строк или ветвлений логики, выполненных в ходе тестов.

3. Интеграционное тестирование

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

  • Кто выполняет: Разработчики (при сборке модулей) или QA-инженеры (при проверке межсервисного взаимодействия).
  • Главная цель: Выявить дефекты на стыке компонентов. Модули могут идеально работать по отдельности, но ломаться при попытке передать данные друг другу.
  • Типичные выявляемые ошибки: Несовместимость типов данных в API, неверный порядок вызовов, ошибки протокола обмена, проблемы с правами доступа к БД.
  • Подходы к интеграции (из главы Конструирование):
    • Нисходящая (Top-Down) — тестирование сверху вниз с использованием заглушек (Stubs).
    • Восходящая (Bottom-Up) — тестирование снизу вверх с использованием драйверов вызова (Drivers).
    • Непрерывная (CI-driven) — автоматическая проверка интеграции при каждом слиянии веток кода.

4. Системное тестирование

Объект тестирования: Вся программная система в целом, развернутая на окружении, максимально близком к реальному (Staging / Pre-production).

  • Кто выполняет: Отдельная команда инженеров по тестированию (QA/Testing Team).
  • Главная цель: Проверить соответствие всей системы как функциональным, так и нефункциональным (системным) требованиям спецификации.
  • Виды проверок на системном уровне:
    • Функциональное тестирование: Проверка реализации сквозных бизнес-сценариев (End-to-End, E2E).
    • Нагрузочное тестирование (Performance/Stress): Проверка работы системы под пиковыми нагрузками.
    • Тестирование безопасности (Security): Проверка устойчивости к атакам и уязвимостям.
    • Тестирование отказоустойчивости (Failover): Эмуляция сбоев железа и сети для проверки тактик восстановления.

ST_s.png

5. Приемочное тестирование

Объект тестирования: Готовая система, оцениваемая с точки зрения соответствия бизнес-целям, контракту и ожиданиям пользователей.

  • Кто выполняет: Заказчик, конечные пользователи или уполномоченные бизнес-аналитики.
  • Главная цель: Принятие решения о готовности продукта к промышленной эксплуатации (релиз в Production) и подписании актов выполненных работ. Ответ на вопрос: «Мы построили именно ту систему, которую хотел заказчик?» (Валидация).
  • Основные формы приемочного тестирования:
    • UAT (User Acceptance Testing): Проверка реальными пользователями на основе их ежедневных рабочих сценариев.
    • Альфа-тестирование ($\alpha$-testing): Внутреннее приемочное тестирование силами сотрудников внутри компании-разработчика.
    • Бета-тестирование ($\beta$-testing): Передача предрелизной версии ограниченному кругу реальных внешних пользователей для сбора обратной связи в реальных условиях.

6. Методы проектирования тестов

Метод проектирования тестов Идея метода Что проверяет Когда применять Пример
Эквивалентное разбиение Разделение входных данных на классы, внутри которых система должна вести себя одинаково Корректную обработку групп однотипных данных Когда количество возможных входов слишком велико Поле «Возраст»:<0— ошибка,0–120— корректно,>120— ошибка
Анализ граничных значений Проверка значений на границах допустимых диапазонов Ошибки, возникающие на границах условий Для диапазонов, ограничений, размеров, количеств Для диапазона 1–100 проверить:0, 1, 2, 99, 100, 101
Таблицы решений Представление сложной логики в виде комбинаций условий и действий Корректность бизнес-правил Когда результат зависит от нескольких условий Скидка зависит от возраста, статуса клиента и суммы покупки
Диаграммы переходов состояний Построение тестов на основе модели состояний объекта Корректность изменения состояния системы Для объектов с жизненным циклом Заказ: создан → оплачен → отправлен → доставлен
Попарное тестирование Проверка всех пар значений параметров вместо полного перебора комбинаций Ошибки взаимодействия параметров При большом числе настроек и комбинаций Браузер × ОС × язык × тип пользователя
Тестирование на основе сценариев Проверка типичных пользовательских действий Сквозное поведение системы Для пользовательских процессов Регистрация → покупка → оплата → получение заказа
Исследовательское тестирование Одновременное изучение системы и создание тестов Неочевидные ошибки Когда требования неполные или система сложная Поиск неожиданных сценариев работы интерфейса
Предугадывание ошибок Использование опыта тестировщика для поиска вероятных ошибок Типовые дефекты На основе опыта и истории ошибок null, пустые строки, отрицательные числа, переполнение
Мутационное тестирование Искусственное внесение ошибок в код и проверка, находят ли их тесты Качество набора тестов Для оценки эффективности автоматических тестов Изменить>на<и проверить, падает ли тест

Автоматизация тестирования

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

📝 Стандартные задачи