Что такое WebSocket и в каких сценариях его использовать
Что проверяют
Понимаете ли вы, чем постоянное соединение отличается от пары «запрос и ответ», и умеете ли его тестировать. Следом спросят, как вы посмотрите сообщения, что проверите при обрыве сети и чем будете нагружать.
Как отвечать
WebSocket это протокол из RFC 6455 для двусторонней связи поверх одного TCP-соединения. Оно начинается как HTTP-запрос с заголовками Upgrade: websocket и Sec-WebSocket-Key, сервер отвечает 101 Switching Protocols, и дальше стороны обмениваются кадрами: текстовыми, бинарными, служебными ping и pong и кадром закрытия с кодом. Схемы адреса ws:// и wss://, вторая идёт поверх TLS.
Где он оправдан: чаты, совместное редактирование, многопользовательские игры, биржевые котировки: данные идут в обе стороны. Если сервер только сообщает новости клиенту, хватает Server-Sent Events: обычный HTTP и встроенное переподключение. Для обновлений раз в минуту достаточно опроса.
Что тестировать:
- сообщения: DevTools, вкладка Network, фильтр WS, вкладка Messages у соединения. Вручную слать сообщения удобно из Postman;
- обрыв: выключить сеть, усыпить ноутбук, сменить Wi-Fi. Восстанавливается ли соединение, не теряются и не дублируются ли сообщения за время обрыва;
- закрытие: код 1000 при нормальном закрытии и 1006 при аварийном, поведение клиента в обоих случаях;
- авторизация: браузерный
WebSocketне ставит свои заголовки, токен передают в cookie, в параметре адреса или первым сообщением. Проверьте истечение токена на живом соединении; - нагрузка: число одновременных соединений и сообщений в секунду, подойдут k6 или JMeter с плагином.
В автотестах на Playwright ответы сервера подменяет page.routeWebSocket().
Где спотыкаются
Проверяют только «сообщение пришло», не проверяя порядок, дубли и поведение после переподключения. Реальные баги живут именно там.
Забывают про прокси. Nginx по умолчанию закрывает соединение без трафика через 60 секунд, и без heartbeat на проде соединения рвутся, а на локальном стенде нет.
Думают, что CORS защищает WebSocket. На него CORS не распространяется, сервер сам обязан проверять Origin, иначе чужой сайт откроет соединение от имени пользователя.