Как протестировать автоматическое переподключение WebSocket?

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

Ответ

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

Пример теста на JavaScript/Node.js:

describe('WebSocket Reconnection Logic', () => {
  let wsClient;
  let mockServer;

  beforeEach(() => {
    mockServer = new MockWebSocketServer();
    wsClient = new AppWebSocketClient('ws://localhost:8080');
  });

  afterEach(() => {
    wsClient.close();
    mockServer.stop();
  });

  it('should attempt to reconnect after a server-side disconnect', async () => {
    // 1. Establish initial connection
    await wsClient.connect();
    expect(wsClient.isConnected()).toBe(true);

    // 2. Simulate a connection drop (e.g., server crash)
    mockServer.forceDropAllConnections();
    await waitForCondition(() => !wsClient.isConnected());

    // 3. Verify reconnection attempts with backoff
    const reconnectionSpy = jest.spyOn(wsClient, 'reconnect');
    await waitForCondition(() => wsClient.isConnected(), 10000); // Wait up to 10s

    expect(reconnectionSpy).toHaveBeenCalled();
    expect(wsClient.isConnected()).toBe(true);
  });
});

Ключевые аспекты для тестирования:

  1. Сценарии разрыва: Имитация таймаута, отключения сервера, потери сети.
  2. Экспоненциальная задержка (backoff): Проверка, что интервалы между попытками увеличиваются (например, 1с, 2с, 4с, ...).
  3. Сохранение состояния: Подписки или данные, существовавшие до разрыва, должны быть восстановлены.
  4. Очередь сообщений: Сообщения, отправленные во время отключения, должны быть доставлены после восстановления связи.
  5. Лимит попыток: Поведение после N неудачных попыток (остановка или переход в состояние ошибки).
  6. Восстановление сессии: Проверка, что не требуется повторная аутентификация после переподключения.