Ответ
Цель — убедиться, что приложение устойчиво к разрывам соединения и может автоматически восстановить работу.
Сценарии и методы тестирования:
-
Имитация разрыва соединения:
- Отключение сети: В DevTools (Throttling -> Offline), отключение Wi-Fi/эфира.
- Остановка сервера: Завершение работы backend-сервиса или mock-сервера.
- Обрыв WebSocket/Long Polling соединения через инструменты разработчика.
-
Проверка поведения при потере связи:
- Приложение показывает понятное уведомление пользователю (например, "Соединение потеряно").
- Блокируются или переводятся в особый режим операции, требующие сеть.
- Локальное сохранение данных, введенных пользователем во время простоя (например, черновик сообщения).
-
Проверка процесса переподключения:
- Автоматическая попытка переподключения после восстановления сети/сервера.
- Стратегия повторных попыток (retry logic): Проверка экспоненциальной задержки между попытками (exponential backoff).
- Корректное обновление состояния UI после успешного переподключения (уведомление скрывается, данные синхронизируются).
-
Проверка восстановления состояния:
- Синхронизация данных: После 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');
});
});
Дополнительно: Тестирование при нестабильном соединении (частые обрывы), проверка таймаутов и максимального числа попыток.