Ответ
Главное отличие — выполняется ли код программы во время проверки.
Статическое тестирование (Static Testing):
- Код не выполняется. Анализ проводится над артефактами разработки.
- Когда выполняется: На ранних этапах жизненного цикла (SDLC).
- Цель: Выявление дефектов, несоответствий и улучшение качества артефактов (требований, кода, дизайна) до этапа компиляции и запуска.
- Методы:
- Ревью (Reviews): Неформальный просмотр кода/документов коллегами.
- Инспекция (Inspection): Формальный, структурированный процесс с ролями (модератор, автор, инспектор).
- Статический анализ кода (Static Code Analysis): Автоматическая проверка кода на соответствие стандартам и выявление потенциальных уязвимостей (например, с помощью SonarQube, ESLint, Pylint).
Динамическое тестирование (Dynamic Testing):
- Код выполняется. Программа запускается с тестовыми данными.
- Когда выполняется: После компиляции/сборки рабочего артефакта.
- Цель: Проверка реального поведения программы, выходных данных, производительности и функциональности в runtime.
- Методы: Все виды тестов, где код работает: модульные, интеграционные, системные, приемочные, нагрузочные тесты.
Примеры:
-
Статическое тестирование (Code Review):
# Проблема: "магическое число", отсутствие типизации и документации. def process(d): return d * 2.5 # Что такое 2.5? Коэффициент? Нужно вынести в константу.Улучшенная версия после ревью:
TAX_RATE = 2.5 def apply_tax(amount: float) -> float: """Применяет налоговую ставку к сумме.""" return amount * TAX_RATE -
Динамическое тестирование (Модульный тест):
import pytest def test_apply_tax(): # Код функции apply_tax ВЫПОЛНЯЕТСЯ здесь result = apply_tax(100.0) assert result == 250.0 # Проверяем реальный результат выполнения
Вывод: Статическое тестирование — это предупреждение дефектов на этапе создания артефактов. Динамическое тестирование — это обнаружение дефектов в работающем программном обеспечении. Оба подхода критически важны для обеспечения качества.