Что такое веб-сокеты (WebSockets)?

«Что такое веб-сокеты (WebSockets)?» — вопрос из категории Сети, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Веб-сокеты (WebSockets) — это протокол связи, предоставляющий полнодуплексный (двусторонний) канал между клиентом (например, браузером) и сервером через одно постоянное TCP-соединение. В отличие от HTTP с его циклом «запрос-ответ», WebSockets позволяют серверу主动но отправлять данные клиенту в любой момент.

Актуальность для тестировщика: Многие современные веб-приложения (чаты, дашборды с реальными данными, онлайн-игры, collaborative tools) используют WebSockets для интерактивности. Это требует специфических подходов к тестированию.

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

  1. Установление соединения (Handshake): Проверка успешного «апгрейда» HTTP-соединения до WebSocket.
  2. Обмен сообщениями: Тестирование отправки и получения данных в обоих направлениях. Важно проверять корректность формата сообщений (часто JSON).
  3. Устойчивость соединения:
    • Поведение при потере сети (reconnect).
    • Обработка таймаутов.
    • Отправка ping/pong фреймов для поддержания соединения.
  4. Безопасность: Тестирование защищенных соединений (WSS://) и валидация origin.
  5. Масштабируемость и нагрузка: Как сервер обрабатывает тысячи одновременных WebSocket-соединений.

Пример теста с использованием библиотеки WebSocket для JavaScript (Node.js):

const WebSocket = require('ws');
const assert = require('assert');

// Интеграционный тест WebSocket-эндпоинта
(async () => {
    const ws = new WebSocket('ws://localhost:8080/notifications');

    const messages = [];
    ws.on('message', (data) => {
        messages.push(JSON.parse(data));
    });

    // Ждем открытия соединения
    await new Promise(resolve => ws.on('open', resolve));

    // Отправляем тестовое сообщение от клиента
    ws.send(JSON.stringify({ type: 'subscribe', userId: 123 }));

    // Ждем ответа от сервера (например, подтверждения подписки)
    await new Promise(resolve => setTimeout(resolve, 500));

    // Проверяем, что сервер прислал ожидаемое подтверждение
    assert.strictEqual(messages[0].type, 'subscribed');
    assert.strictEqual(messages[0].status, 'ok');

    ws.close();
    console.log('WebSocket тест пройден!');
})();

Инструменты для тестирования: Postman (поддержка WebSocket), специализированные CLI-утилиты (wscat), написание собственных скриптов на Python (websockets библиотека) или JavaScript.