В чём разница между статическим и динамическим тестированием?

«В чём разница между статическим и динамическим тестированием?» — вопрос из категории Основы тестирования, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Главное отличие — выполняется ли код программы во время проверки.

Статическое тестирование (Static Testing):

  • Код не выполняется. Анализ проводится над артефактами разработки.
  • Когда выполняется: На ранних этапах жизненного цикла (SDLC).
  • Цель: Выявление дефектов, несоответствий и улучшение качества артефактов (требований, кода, дизайна) до этапа компиляции и запуска.
  • Методы:
    • Ревью (Reviews): Неформальный просмотр кода/документов коллегами.
    • Инспекция (Inspection): Формальный, структурированный процесс с ролями (модератор, автор, инспектор).
    • Статический анализ кода (Static Code Analysis): Автоматическая проверка кода на соответствие стандартам и выявление потенциальных уязвимостей (например, с помощью SonarQube, ESLint, Pylint).

Динамическое тестирование (Dynamic Testing):

  • Код выполняется. Программа запускается с тестовыми данными.
  • Когда выполняется: После компиляции/сборки рабочего артефакта.
  • Цель: Проверка реального поведения программы, выходных данных, производительности и функциональности в runtime.
  • Методы: Все виды тестов, где код работает: модульные, интеграционные, системные, приемочные, нагрузочные тесты.

Примеры:

  1. Статическое тестирование (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
  2. Динамическое тестирование (Модульный тест):

    import pytest
    
    def test_apply_tax():
        # Код функции apply_tax ВЫПОЛНЯЕТСЯ здесь
        result = apply_tax(100.0)
        assert result == 250.0  # Проверяем реальный результат выполнения

Вывод: Статическое тестирование — это предупреждение дефектов на этапе создания артефактов. Динамическое тестирование — это обнаружение дефектов в работающем программном обеспечении. Оба подхода критически важны для обеспечения качества.