Ответ
Цель: Проверить, что клиентское приложение устойчиво к разрывам соединения и корректно восстанавливает связь с сервером.
Пример теста на 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);
});
});
Ключевые аспекты для тестирования:
- Сценарии разрыва: Имитация таймаута, отключения сервера, потери сети.
- Экспоненциальная задержка (backoff): Проверка, что интервалы между попытками увеличиваются (например, 1с, 2с, 4с, ...).
- Сохранение состояния: Подписки или данные, существовавшие до разрыва, должны быть восстановлены.
- Очередь сообщений: Сообщения, отправленные во время отключения, должны быть доставлены после восстановления связи.
- Лимит попыток: Поведение после N неудачных попыток (остановка или переход в состояние ошибки).
- Восстановление сессии: Проверка, что не требуется повторная аутентификация после переподключения.