Что такое статический анализ кода и как он применяется в тестировании?

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

Ответ

Статический анализ кода — это процесс выявления дефектов, уязвимостей и "запахов кода" (code smells) без выполнения программы, путём анализа её исходного кода или байт-кода.

Как это работает в тестировании: Статический анализ выполняется на этапе написания кода или в CI/CD пайплайне, выступая как "нулевой уровень" тестирования, который находит проблемы до запуска юнит-тестов.

Категории обнаруживаемых проблем:

  1. Баг-паттерны: Вероятные ошибки.
    // ESLint: 'eqeqeq' rule
    if (x == y) { } // Предупреждение: используйте строгое равенство (===)
  2. Уязвимости безопасности:
    # Bandit: 'B608' rule - возможная SQL-инъекция
    query = "SELECT * FROM users WHERE id = " + user_input # ОПАСНО
  3. Нарушения стиля кода и best practices:
    # Pylint: 'C0103' rule
    myVariable = 10 # Предупреждение: имя переменной должно быть в snake_case
  4. Избыточная сложность: Высокая цикломатическая сложность функций.
  5. Дублирование кода (code clones).

Интеграция в процесс разработки:

  1. В редакторе кода (IDE): Мгновенные подсказки через плагины (ESLint, Pylint, SonarLint).
  2. В pre-commit хуках: Запуск анализаторов перед коммитом для предотвращения попадания проблем в репозиторий.
    # Пример хука в .pre-commit-config.yaml
    - repo: local
      hooks:
        - id: pylint
          name: pylint
          entry: pylint
          args: [--errors-only, src/]
          language: system
  3. В CI/CD пайплайне: Автоматический запуск и блокировка сборки при критических нарушениях.
    # Пример шага в GitHub Actions
    - name: Run Static Analysis
      run: |
        npm run lint   # Запуск ESLint для JS/TS
        sonar-scanner  # Запуск SonarQube анализа

Популярные инструменты:

  • Универсальные/серверные: SonarQube, Coverity.
  • Для языков: ESLint/TSLint (JavaScript/TypeScript), Pylint/Flake8 (Python), Checkstyle/PMD (Java), RuboCop (Ruby).