Real-time функционал подразумевает мгновенное обновление данных на клиентской стороне без перезагрузки страницы. В веб-приложениях это часто реализуется через WebSocket, Server-Sent Events (SSE) или библиотеки, такие как Socket.IO. Тестирование таких сценариев требует специфического подхода, так как необходимо учитывать асинхронность, задержки сети и реакцию UI на события.
Для корректного тестирования real-time приложений необходимо убедиться, что тестовая среда поддерживает:
Cypress по умолчанию работает с HTTP(S) запросами и DOM, но для
real-time сценариев важно использовать API cy.intercept() и
кастомные команды для симуляции событий сервера.
Cypress не имеет встроенной поддержки WebSocket, поэтому для тестирования реального времени применяются следующие подходы:
Mock WebSocket на стороне клиента. Можно
перехватывать объект WebSocket и заменять его на stub,
который будет программно отправлять события:
cy.visit('/', {
onBeforeLoad(win) {
const OriginalWebSocket = win.WebSocket;
win.WebSocket = function(url) {
const socket = new OriginalWebSocket(url);
socket.sendEvent = (data) => socket.onmessage({ data: JSON.stringify(data) });
return socket;
};
}
});
Такой подход позволяет контролировать поток данных без изменения серверной логики.
Использование mock сервера. Легко реализуется
через Node.js сервер, который отправляет события с заданной
периодичностью. Cypress может взаимодействовать с таким сервером через
cy.request() или напрямую через WebSocket клиент.
После того как события реального времени поступают на клиент, важно проверить корректное обновление интерфейса. Для этого применяются стандартные Cypress команды:
cy.get('.message-list').should('contain', 'Новое сообщение');
cy.get('.notification-count').should('have.text', '1');
Ключевой момент — убедиться, что ожидание учитывает асинхронность:
cy.wait() используется для задержек в тесте, но
предпочтительнее работать с cy.get().should() и
cy.contains(), так как они автоматически повторяются до
успешного результата.Cypress.Commands.add('waitForMessage', (text) => {
cy.get('.message-list').should('contain', text);
});
Server-Sent Events передают данные через обычный HTTP стрим. Для тестирования SSE можно замокировать источник событий:
cy.intercept('/events', (req) => {
req.reply((res) => {
res.send('dat a: {"type":"update","content":"Новое уведомление"}\n\n');
});
});
После этого проверяется реакция приложения на входящие события так же, как и в случае WebSocket.
Real-time приложения часто сталкиваются с гонками данных. В Cypress рекомендуется:
cy.should() и cy.then() для последовательной
проверки.cy.clock() и cy.tick() для
контроля таймеров и временных интервалов.Пример:
cy.clock();
cy.get('#start-timer').click();
cy.tick(5000);
cy.get('#timer-value').should('have.text', '5');
Для приложений с большим потоком событий стоит структурировать тесты так:
beforeEach,
afterEach) для сброса состояния между тестами.Для анализа real-time сценариев полезно:
cy.log().cy.task() для вывода на Node.js
консоль.cy.intercept().При автоматизации real-time тестов важно учитывать нестабильность сети и таймингов. Рекомендуется:
defaultCommandTimeout).Тщательная организация тестов и контроль всех асинхронных событий позволяют достичь стабильного тестирования real-time функционала с использованием Cypress.