Что делать, если баг не воспроизводится локально?

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

Ответ

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

  1. Воссоздание окружения: Разворачиваю максимально приближенную к production среду, используя Docker-контейнеры с идентичными версиями ПО (PHP, веб-сервер, СУБД) и настройками.
  2. Сбор данных: Запрашиваю у тестировщика или из системы мониторинга полный контекст:
    • Точные шаги воспроизведения.
    • Логи ошибок (PHP, nginx/Apache).
    • Данные окружения (phpinfo(), $_SERVER).
    • Состояние данных на момент ошибки (дампы БД, кэша).
  3. Детективное расследование: Ищу различия между средами. Частые причины:
    • Разные версии PHP или расширений: Проверяю php -v и php -m.
    • Конфигурация: Настройки памяти (memory_limit), времени выполнения (max_execution_time).
    • Проблемы с данными: Уникальное состояние базы данных или кэша, специфичное для продакшена.
    • Поведение пользователя: Особые куки, сессия, права доступа (ACL).

Пример инструментария для отладки:

// Временное логирование в контроллере или middleware для сбора контекста
if ($_SERVER['REMOTE_ADDR'] == 'IP_ТЕСТИРОВЩИКА') {
    error_log(json_encode([
        'timestamp' => date('c'),
        'request_uri' => $_SERVER['REQUEST_URI'],
        'request_params' => $_REQUEST,
        'session_id' => session_id(),
        'user_agent' => $_SERVER['HTTP_USER_AGENT'],
        'backtrace' => debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 5)
    ], JSON_PRETTY_PRINT));
}

Если проблема остаётся неуловимой, подключаю инструменты распределённой трассировки (например, OpenTelemetry) или мониторинга ошибок (Sentry, Bugsnag), чтобы поймать её при следующем возникновении в проде.