Как тестировать механизм переподключения (reconnect) в приложении?

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

Ответ

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

Сценарии и методы тестирования:

  1. Имитация разрыва соединения:

    • Отключение сети: В DevTools (Throttling -> Offline), отключение Wi-Fi/эфира.
    • Остановка сервера: Завершение работы backend-сервиса или mock-сервера.
    • Обрыв WebSocket/Long Polling соединения через инструменты разработчика.
  2. Проверка поведения при потере связи:

    • Приложение показывает понятное уведомление пользователю (например, "Соединение потеряно").
    • Блокируются или переводятся в особый режим операции, требующие сеть.
    • Локальное сохранение данных, введенных пользователем во время простоя (например, черновик сообщения).
  3. Проверка процесса переподключения:

    • Автоматическая попытка переподключения после восстановления сети/сервера.
    • Стратегия повторных попыток (retry logic): Проверка экспоненциальной задержки между попытками (exponential backoff).
    • Корректное обновление состояния UI после успешного переподключения (уведомление скрывается, данные синхронизируются).
  4. Проверка восстановления состояния:

    • Синхронизация данных: После reconnect актуальные данные с сервера должны заменить локальные.
    • Повтор отправки неотправленных действий (если такая функциональность заложена).

Пример тест-кейса для WebSocket-соединения:

// Псевдокод для E2E-теста (например, с Cypress или Puppeteer)
describe('Reconnect logic', () => {
  it('should reconnect after server restart', () => {
    // 1. Устанавливаем соединение
    connectToWebSocket();
    expect(isConnected()).toBe(true);

    // 2. Имитируем падение сервера
    stopMockServer();
    expect(isConnected()).toBe(false);
    expect(getUIState()).toBe('disconnected'); // Проверяем UI-уведомление

    // 3. Запускаем сервер снова
    startMockServer();

    // 4. Ждем и проверяем автоматическое переподключение
    waitForReconnect();
    expect(isConnected()).toBe(true);
    expect(getUIState()).toBe('connected');
  });
});

Дополнительно: Тестирование при нестабильном соединении (частые обрывы), проверка таймаутов и максимального числа попыток.