Что такое динамическое тестирование?

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

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

Ключевое слово — выполнение. Если код запускается — это динамическое. Если вы только читаете или анализируете код без запуска — это статическое.

Как динамическое тестирование дополняет статическое

Статическое и динамическое тестирование — не конкуренты, а партнёры. Каждый находит дефекты, недоступные другому.

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

Динамическое находит: Реальные сбои в runtime, узкие места производительности, утечки памяти под нагрузкой, ошибки интеграции, проблемы UX, race conditions.

Взаимодополняющая связь

graph TB subgraph Статическое тестирование S1[Ревью требований] S2[Ревью кода] S3[Инструменты анализа] end subgraph Динамическое тестирование D1[Юнит-тесты] D2[Интеграционные тесты] D3[Системные тесты] D4[Тесты производительности] end S1 -->|Валидирует требования до| D3 S2 -->|Ловит проблемы кода до| D1 S3 -->|Выявляет паттерны до| D2 style S1 fill:#60a5fa,color:#000 style S2 fill:#60a5fa,color:#000 style S3 fill:#60a5fa,color:#000 style D1 fill:#34d399,color:#000 style D2 fill:#34d399,color:#000 style D3 fill:#34d399,color:#000 style D4 fill:#34d399,color:#000

Статическое vs. Динамическое: Сравнение

ПараметрСтатическоеДинамическое
Выполнение кодаНетДа
Когда возможноС этапа требованийС этапа реализации
Типичные активностиРевью, walkthroughs, статический анализЮнит-тесты, интеграционные, системные
Нужная средаНет (только артефакт)Среда выполнения
Типы дефектовНарушения стандартов, потенциальные багиРеальные сбои, проблемы производительности
Стоимость поискаНиже (раньше в SDLC)Выше (нужна среда, выполнение)
Скорость обратной связиБыстрая (минуты для инструментов)Варьируется (секунды для юнит, часы для E2E)
Находит runtime-проблемыНет (только прогнозирует)Да (наблюдает напрямую)
Проверяет нефункциональные требованияОграниченноДа (производительность, юзабилити)

Техники динамического тестирования

Динамическое тестирование охватывает множество техник:

По знанию кода:

  • Black-box (Урок 2.27), White-box (Урок 2.26), Grey-box (Урок 2.28)

По уровню: Модульное, интеграционное, системное, E2E, приёмочное

По назначению: Функциональное, производительности, безопасности, юзабилити, надёжности (Урок 2.25)

По подходу: Скриптованное, исследовательское (Урок 2.32), ad hoc (Урок 2.33)

Когда начинать динамическое тестирование

Распространённое заблуждение: динамическое тестирование начинается только после сборки всего приложения. На самом деле оно должно начаться при появлении исполняемого кода:

Фаза SDLCДинамическая активность
РеализацияРазработчики пишут и запускают юнит-тесты
ИнтеграцияИнтеграционные тесты проверяют взаимодействия
Системное тестированиеQA выполняет функциональные и нефункциональные тесты
UATБизнес-пользователи валидируют в среде, подобной продакшну
ПродакшнSmoke-тесты, синтетический мониторинг, хаос-инженерия

Процесс динамического тестирования

  1. Планирование — Определить что тестировать, выбрать техники, подготовить данные
  2. Проектирование — Создать тест-кейсы с входными данными и ожидаемыми результатами
  3. Подготовка — Настроить тестовую среду, развернуть билд
  4. Выполнение — Запустить тесты, наблюдать фактические результаты
  5. Сравнение — Сопоставить фактические результаты с ожидаемыми
  6. Отчётность — Задокументировать: pass, fail или blocked
  7. Перетестирование — После исправлений проверить устранение дефекта

Упражнение: Классифицируйте активности тестирования

Для каждой активности определите: статическое или динамическое тестирование.

  1. Разработчик запускает pytest для выполнения юнит-тестов
  2. QA-инженер читает user story, проверяя ясность критериев приёмки
  3. SonarQube сканирует Java-проект и находит 15 code smells
  4. Тестировщик открывает веб-приложение, вводит логин и проверяет успешный вход
  5. Команда проводит walkthrough кода модуля платежей
  6. Автоматизированный тест Playwright переходит на checkout и проверяет итоговую сумму
  7. Инструмент SAST ищет захардкоженные API-ключи
  8. Инструмент нагрузочного тестирования отправляет 1000 одновременных запросов
  9. Разработчик читает diff пулл-реквеста и комментирует обработку ошибок
  10. QA использует Postman для отправки POST-запроса к /users и проверки status code
  11. ESLint проверяет неиспользуемые переменные в проекте
  12. Тестировщик устанавливает приложение на устройство и тестирует онбординг
ПодсказкаГлавный вопрос: «Нужно ли запускать ПО для этой активности?» Если да → динамическое. Если активность только изучает артефакт без запуска → статическое.
Решение
  1. Динамическоеpytest выполняет код и проверяет фактические результаты.
  2. Статическое — QA читает документ без выполнения ПО. Это ревью требований.
  3. Статическое — SonarQube анализирует исходный код без его выполнения.
  4. Динамическое — Тестировщик взаимодействует с работающим приложением.
  5. Статическое — Walkthrough — активность ревью без выполнения кода.
  6. Динамическое — Playwright запускает браузер, приложение выполняется.
  7. Статическое — SAST сканирует исходный код без выполнения.
  8. Динамическое — Инструмент отправляет реальные HTTP-запросы к работающему приложению.
  9. Статическое — Разработчик читает код и даёт обратную связь без выполнения.
  10. Динамическое — Postman отправляет реальный HTTP-запрос к работающему серверу.
  11. Статическое — ESLint читает файлы и применяет правила без выполнения.
  12. Динамическое — Тестировщик запускает реальное приложение на устройстве.

Итого: 1, 4, 6, 8, 10, 12 — динамические. 2, 3, 5, 7, 9, 11 — статические.

Почему важны оба: реальный пример

Рассмотрим функцию расчёта стоимости доставки:

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

Ревью кода может найти: отсутствие обработки международной доставки, противоречие логики скидки требованиям.

Динамический юнит-тест может найти: для заказа на $49.99 бесплатная доставка применена некорректно (баг граничного значения).

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

Каждая техника выявляет разные проблемы. Зависимость от одной оставляет значительные пробелы.

Ключевые выводы

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