Как подходить к тестированию событий (events) в приложении?

Ответ

Тестирование событий направлено на проверку корректности их генерации и передачи в аналитические или внутренние системы.

Что проверяется:

  • Триггер: событие срабатывает в нужный момент (клик, отправка формы, навигация).
  • Данные (payload): структура и значения передаваемых параметров (например, {event: "purchase", value: 100, currency: "USD"}).
  • Консистентность: отсутствие дублей, порядок следования событий.
  • Доставка: успешная отправка во внешнюю систему (Google Analytics, Amplitude, внутренний бэкенд).

Пример проверки в автотесте (JavaScript):

// Мокаем функцию отправки события
const mockedTrack = jest.fn();
window.analytics = { track: mockedTrack };

// Выполняем действие
document.querySelector('[data-test="checkout-button"]').click();

// Проверяем, что событие было отправлено с правильными данными
expect(mockedTrack).toHaveBeenCalledWith(
  'checkout_started',
  expect.objectContaining({
    cart_total: 99.99,
    items_count: 2
  })
);

Инструменты и методы:

  • DevTools (Вкладка Network для просмотра отправляемых запросов).
  • Прокси (Charles, Fiddler) для перехвата трафика.
  • Логи бэкенда.
  • Дашборды аналитических систем (GA, Mixpanel) для финальной валидации.

Ответ 18+ 🔞

А, ну и зачем нам это всё, спросишь ты? А вот зачем, сука! Чтобы не получилось как в том анекдоте: "нажал кнопку — ничего не произошло, а в консоли уже три ивента улетело в никуда, и один из них — 'user_died', блядь". Вот чтобы такого не было, мы и тестируем события, ёпта!

Короче, ловим за яйца вот эту всю хуйню:

  • Триггер: Чтобы событие выстреливало именно тогда, когда надо, а не когда пользователь чихнул или кошка по клаве прошлась. Кликнул на "Купить" — событие "покупка", а не "пользователь_передумал_и_ушел_нахуй".
  • Данные (этот самый payload): Чтобы в нём лежало то, что надо, и в правильном виде. Не {price: "сто рублей, наверное"}, а {value: 100, currency: "RUB"}. А то потом аналитики такие: "почему у нас 90% покупок за ноль долларов?", а это просто строка "0" улетела вместо числа 0, пиздец.
  • Консистентность: Чтобы одно и то же событие не слалось десять раз подряд, как спам от какого-нибудь еблана. И чтобы порядок был: сначала "добавил_в_корзину", потом "начал_оформление", а не наоборот — "оформил_заказ", а потом "выбрал_товар", ядрёна вошь!
  • Доставка: Чтобы это послание долетело до адресата (Google Analytics, Amplitude, наш внутренний сервак), а не потерялось где-то в дебрях интернета, как носки в стиральной машине.

Вот, смотри, как в коде это выглядит, когда мы ловим эту собаку сука за хвост:

// Подставляем свою муляжную функцию, чтобы не спамить в прод
const mockedTrack = jest.fn();
window.analytics = { track: mockedTrack };

// Симулируем действие юзера — тыкаем в кнопку
document.querySelector('[data-test="checkout-button"]').click();

// А теперь проверяем, не обосрался ли наш код
expect(mockedTrack).toHaveBeenCalledWith(
  'checkout_started', // Событие должно называться именно так
  expect.objectContaining({ // А внутри должны быть вот эти поля
    cart_total: 99.99, // И чтоб число, блядь, а не строка!
    items_count: 2
  })
);

Чем вооружаемся для этой охоты:

  • DevTools (Вкладка Network): Тупо смотрим, какие запросы улетают, когда мы что-то делаем. Прямо как подслушивать, охуенно.
  • Прокси (Charles, Fiddler): Для параноиков. Перехватываем весь трафик туда-сюда, видим каждую мелочь.
  • Логи бэкенда: Заглядываем в рот серверу — а получил ли он наше грязное сообщение?
  • Дашборды аналитики (GA, Mixpanel): Финальный акт. Заходим и смотрим своими глазами — появилось ли событие в системе, или мы всё это время тестировали свою жефоную фантазию.

Вот и вся магия, блядь. Кажется, ерунда, а без этого — один сплошной "trust me, bro", а потом оказывается, что полгода считали не те метрики. Пиздец и срамословие!