Модульное и интеграционное тестирование приложений React в 2020 году


Содержание материала:

React (Unit & Integration): какую платформу использовать для модульного тестирования реагирования и интеграционного тестирования

Я только начал с разработки в Reactjs. Я ищу тестирование фреймворка (Javascript). Который может использоваться как для «модульного тестирования», так и для «тестирования интеграции» и «тестирования e2e».

Пожалуйста, помогите мне, если мы сможем провести необходимое тестирование с использованием Javascript.

Вы должны попробовать энзим для юнит-тестирования и кипарис для тестов e2e

Перейти на шутку.. Довольно удивительно..

Боюсь, нет ни одного ответа на ваш вопрос. Потому что существует очень много рамок тестирования, растущих изо дня в день, каждый день.

Чтобы ответить на ваш запрос в лучшем случае —

По определению

Модульное тестирование — Модульное тестирование помогает проверить, что отдельные модули кода (в основном функции) работают должным образом.

Интеграционные тесты. Интеграционные тесты — это тесты, в которых отдельные модули/функции приложения объединяются и тестируются как группа.

Сквозные тесты — этот тест помогает подтвердить, что все функции работают с точки зрения пользователей при использовании реального приложения.

В этом свете, в нашем корпоративном приложении, которое мы строили на ReactJS, чтобы упростить подход Test Driven Development (TDD), мы использовали Jest — который также поддерживается facebook (наряду с функцией тестирования снимков) и Enzyme. для различных форм тестирования интерфейса.

ITnan

Все публикации Хабрахабр и Гиктаймс в одном месте
Выбран стиль: blue

Архитектурная шизофрения Facebook Libra +2

  • 08.11.19 11:30 •
  • m1rko •
  • #475022 •
  • Хабрахабр •
  • Перевод
  • 118

Gartner Hype Cycle 2020: разбор полётов

  • 08.11.19 11:29 •
  • crayon-bunch •
  • #475032 •
  • Хабрахабр •
  • Из песочницы
  • 9

Сбербанк разработал самый мощный в РФ суперкомпьютер

  • 08.11.19 11:16 •
  • marks •
  • #475030 •
  • Хабрахабр •
  • 251

Переделка колонок Radiotehnika S-30

  • 08.11.19 10:37 •
  • BadMan02 •
  • #475018 •
  • Хабрахабр •
  • Из песочницы
  • 159

Как за 28 часов создать прототип сервиса сравнения документов и выиграть хакатон

  • 08.11.19 10:34 •
  • myoffice_ru •
  • #475006 •
  • Хабрахабр •
  • 49

Дайджест IT-событий ноября (часть вторая) +1

  • 08.11.19 10:25 •
  • DigitalEcosystems •
  • #474996 •
  • Хабрахабр •
  • 151

ФАС обвинила четыре банка в рассылке спама +5

  • 08.11.19 10:02 •
  • AnnieBronson •
  • #475014 •
  • Хабрахабр •
  • 8
  • 2000

Как Браузер для iOS А/Б-тестирование улучшал. Доклад Яндекса +9

  • 08.11.19 09:48 •
  • Leono •
  • #475012 •
  • Хабрахабр •
  • 202

VMworld 2020, Day II: управляемость, безопасность и парочка свежих анонсов +1

  • 08.11.19 09:42 •
  • it_man •
  • #474942 •
  • Хабрахабр •
  • 1
  • 98


Работа не волк, часть 2. Пройти босса и выжить на испытательном сроке +23

  • 08.11.19 09:30 •
  • ru_vds •
  • #475002 •
  • Хабрахабр •
  • 1
  • 1600

Поиск

Самые читаемые:

Самые обсуждаемые:

2015 ITnan.ru Design by Styleshout.

Права на текст статей, расположенные на сайте, принадлежат их авторам. Источники статей: Хабрахабр и Гиктаймс.

Интеграционное тестирование

Интеграционное тестирование позволяет произвести тестирование логики взаимосвязей между более крупными частями приложения и выявить дефекты, возникшие при объединении модулей.

Интеграционное тестирование позволяет убедиться в том, могут ли объединенные модули работать без ошибок. Как правило, интеграционное тестирование проводят после модульного тестирования.

Мы проверяем, как взаимодействуют между собой компоненты системы после проведенного модульного тестирования, используя следующие подходы:

  • восходящий (сперва собираются воедино и тестируются низкоуровневые модули, а затем постепенно добавляются модули более высокого уровня);
  • нисходящий (сперва тестируются высокоуровневые модули, а затем добавляются все низкоуровневые);
  • комплексный, называемый также “большой взрыв” (модули всех уровней собираются воедино и тестируются).

Для проведения интеграционного тестирования мы используем как ручные, так и автоматизированные тесты.

Для автоматизации тестирования мы применяем системы непрерывной интеграции (CIS), в частности Team City и Jenkins, который позволяет производить мониторинг системы контроля версий, проводить ряд модульных и других тестов, а также генерировать отчеты о проведенном тестировании.

Мы также используем HAR Storage для автоматизированного тестирования производительности клиентской части системы.

В процессе интеграционного тестирования мы выявляем ошибки взаимодействия между уже протестированными на предыдущем этапе тестирования модулями согласно тест-плану. Поэтому любые проблемы, возникающие в результате интеграции модулей могут быть связаны с особенностями взаимодействия этих модулей.

Интеграционное тестирование включает в себя следующие этапы: составление тест-плана, создание тест-кейсов и юз-кейсов, выполнение тестов после интеграции модулей, выявление ошибок и повторное тестирование после их исправления. Мы повторяем цикл тестирования до тех пор, пока все баги не будут исправлены.

После того, как интеграционное тестирование завершено успешно, мы переходим к системному тестированию.

Модульное и интеграционное тестирование приложений React в 2020 году

1805 просмотра

3 ответа

36 Репутация автора

Я новичок в тестировании, и передо мной была поставлена ​​задача настроить и написать автоматические интеграционные тесты для приложения React-Native для iOS и Android. У меня серьезные проблемы с настройкой интеграционных тестов. Какие рамки я должен использовать? Я нашел несколько уроков, но они были в основном устаревшими. Можно ли использовать Appium с Travis CI? Я нашел несколько примеров использования Mocha и Chai для написания тестов. ( http://tech.taskrabbit.com/blog/2015/11/08/react-native-integration-tests/ кажется лучшим). Я действительно ценю любую помощь, которую вы можете предложить.

Ответы (3)

1 плюс

880 Репутация автора

Я могу порекомендовать вам следующий тест интеграции инструмента реагировать родные: свинку

1 плюс

1188 Репутация автора

Недавно мы начали использовать Detox от Wix, который позволяет проводить сквозное тестирование приложений React Native в сером поле. Он также поддерживает платформы CI, такие как Travis.

плюса

110 Репутация автора

Это пример репозитория github для задачи POC, которую я выполнял для автоматизации приложения React Native e2e с помощью Detox из Wix. Надеюсь, это будет полезно: https://github.com/saifsms91/DetoxAutomationPoc .

Кроме того, вы можете обратиться к этому вопросу Stackoverflow для автоматизации приложения React Native:

Основы тестирования

Тестирование React-компонентов аналогично тестированию любого другого JavaScript-кода.

Есть несколько способов тестирования React-компонентов. В целом, можно выделить два основных:

  • Рендеринг деревьев компонентов в упрощенной тестовой среде и проверка их предполагаемого вывода.
  • Запуск всего приложения в реалистичной среде браузера (так называемые «сквозные» тесты).

Этот раздел документации посвящён стратегиям тестирования первым способом. Несмотря на то, что «сквозные» тесты могут быть очень полезны для предотвращения регрессии в важных потоках приложения, эти тесты не касаются React-компонентов напрямую и выходят за рамки этого раздела.

Выбирая инструменты тестирования, стоит рассмотреть несколько компромиссов:

  • Скорость итераций против реалистичной среды: Одни инструменты позволяют получить быстрый цикл «внёс изменения — увидел результат», но не моделируют поведение браузера в точности. Другие инструменты могут использовать реальную среду браузера, но снижают скорость итераций и могут вызывать проблемы при непрерывной интеграции.
  • Как много фиктивных объектов использовать: При работе с компонентами границы между «модульным» и «интеграционным» тестом выглядят размытыми. Тестируя форму, нужно ли тестировать кнопки внутри неё? Или компонент «кнопка» должен иметь свои собственные тесты? Должны ли изменения в коде кнопки ломать тест формы?

Одни варианты ответов подойдут одним командам и продуктам, другие другим.

Jest — исполнитель тестов на JavaScript, который позволяет взаимодействовать с DOM через jsdom . Несмотря на то, что jsdom только приблизительно реализует работу браузера, в большинстве случаев этого достаточно для тестирования React-компонентов. Jest предлагает отличную скорость итераций вместе с мощными возможностями, например фиктивные модули и таймеры, которые дают больше контроля над исполнением кода.

React Testing Library — это набор вспомогательных функций, позволяющий тестировать React-компоненты не полагаясь на их внутреннюю реализацию. Такой подход упрощает рефакторинг, а также подталкивает вас применять лучшие практики по улучшению доступности. Несмотря на то, что библиотека не позволяет делать «поверхностный» рендер компонента без дочерних компонентов, исполнители тестов, например, Jest позволяет это сделать через фиктивные модули.

Этот раздел состоит из двух страниц:

  • Рецепты: Общие принципы написания тестов React-компонентов.
  • Среды: Что следует учитывать при настройке среды тестирования React-компонентов.

Знакомство с фронтенд-тестированием. Часть четвертая. Интеграционное тестирование

Рассказывает Гил Тайяр, автор блога на Hackernoon

Мы рассмотрели два вида тестирования: юнит-тестирование различных модулей и E2E-тестирование всего приложения. Но между этими двумя этапами тестирования происходят и другие. Я, как и многие другие, называю такие тесты интеграционными.

Несколько слов о терминологии

Много общаясь с любителями разработки через тестирование, я пришёл к выводу, что они имеют другое определение для термина «интеграционные тесты». С их точки зрения, интеграционный тест проверяет «внешний» код, то есть тот, который взаимодействует с «внешним миром», миром приложения.

Поэтому, если их код использует Ajax или localStorage, или IndexedDB и, следовательно, не может быть протестирован с помощью юнит-тестов, они оборачивают этот функционал в интерфейс и мокают этот интерфейс для юнит-тестов, а тестирование реальной реализации интерфейса называют «интеграционным тестом». С этой точки зрения «интеграционный тест» просто тестирует код, который взаимодействует с «реальным миром» вне тех юнитов, которые работают без учета реального мира.

Я, как и многие другие, склонен использовать понятие «интеграционные тесты» для обозначения тестов, которые проверяют интеграцию двух или более юнитов (модулей, классов и т. д.). При этом неважно, скрываете ли вы реальный мир через замоканные интерфейсы.

«Бастион», Москва, от 80 000 до 200 000 ₽

Мое эмпирическое правило о том, следует ли использовать реальные реализации Ajax и других операций I/O (ввода-вывода) в интеграционных тестах, заключается в следующем: если вы можете это сделать и тесты все еще выполняются быстро и не ведут себя странно, то проверяйте I/O. Если операция I/O сложная, медленная или просто странная, то используйте в интеграционных тестах mock-объекты.

В нашем калькуляторе, к счастью, единственным реальным I/O является DOM. Нет вызовов Ajax и других причин писать «моки».

Фейковый DOM

Возникает вопрос: нужно ли писать фейковый DOM в интеграционных тестах? Применим моё правило. Использование реального DOM сделает тесты медленными? К сожалению, ответ — «да»: использование реального DOM означает использование реального браузера, что делает тесты медленными и непредсказуемыми.

Мы отделим большую часть кода от DOM или протестируем всё вместе в E2E-тестах? Оба варианта не оптимальны. К счастью, есть третье решение: jsdom. Этот замечательный и удивительный пакет делает именно то, чего от него ждёшь — реализует DOM в NodeJS.

Он работает, он быстр, он запускается в Node. Если вы используете этот инструмент, то можете перестать рассматривать DOM как «I/O». А это очень важно, ведь отделить DOM от фронтенд-кода сложно, если не невозможно. (Например, я не знаю, как сделать это.) Я предполагаю, что jsdom был написан именно для запуска фронтенд-тестов под Node.

Давайте посмотрим, как он работает. Как обычно, есть инициализирующий код и есть тестовый код, но на этот раз мы начнём с тестового. Но перед этим — отступление.

Отступление

Эта часть является единственной частью серии, которая ориентирована на конкретный фреймворк. И фреймворк, который я выбрал — это React. Не потому, что это лучший фреймворк. Я твердо верю, что нет такого понятия. Я даже не считаю, что существуют лучшие фреймворки для конкретных случаев использования. Единственное, во что я верю — люди должны использовать среду, в которой им наиболее комфортно работать.

И фреймворком, с которым мне наиболее комфортно работать, является React, поэтому следующий код написан на нём. Но, как мы увидим, интеграционные тесты фронтенда с использованием jsdom должны работать во всех современных фреймворках.

Вернемся к использованию jsdom.

Использование jsdom

Интересными являются строки с 10 по 14. В строке 10 мы визуализируем компонент CalculatorApp , который (если вы следите за кодом в репозитории) также отображает компоненты Display и Keypad .

Затем мы проверяем, что в строках 12 и 14 элемент в DOM показывает на дисплее калькулятора начальное значение, равное 0.

Топ-пост этого месяца:  Готовим с Webpack часть 2 – понятие и использование webpack загрузчиков

И этот код, который работает под Node, использует document ! Глобальная переменная document является переменной браузера, но вот она здесь, в NodeJS. Чтобы эти строки работали, требуется очень большой объем кода. Этот очень большой объем кода, который находится в jsdom, является, по сути, полной реализацией всего, что есть в браузере, за вычетом самого рендеринга!

Строка 10, которая вызывает ReactDom для визуализации компонента, также использует document (и window ), так как ReactDom часто использует их в своем коде.

Итак, кто создает эти глобальные переменные? Тест — давайте посмотрим на код:

В строке 3 мы создаём простой document , который содержит лишь div .

В строке 4 мы создаём глобальное window для объекта. Это нужно React.

Функция cleanup удалит эти глобальные переменные, и они не будут занимать память.

В идеале переменные document и window должны быть не глобальными. Иначе мы не сможем запустить тесты в параллельном режиме с другими интеграционными тестами, потому что все они будут переписывать глобальные переменные.

К сожалению, они должны быть глобальными — React и ReactDom нуждаются в том, чтобы document и window были именно такими, поскольку вы не можете им их передать.

Обработка событий

А как насчет остальной части теста? Давайте посмотрим:

Остальная часть теста проверяет сценарий, в котором пользователь нажимает «42 * 2 =» и должен получить «84».

И он делает это красивым способом — получает элементы, используя известную функцию querySelector , а затем использует click , чтобы щелкнуть по ним. Вы даже можете создать событие и иницировать его вручную, используя что-то вроде:

Но встроенный метод click работает, поэтому мы используем его.

Проницательный заметит, что этот тест проверяет точно то же самое, что и E2E-тест. Это правда, но обратите внимание, что этот тест примерно в 10 раз быстрее и является синхронным по своей природе. Его гораздо проще писать и гораздо легче читать.

А почему, если тесты одинаковы, нужен интеграционный? Ну, просто потому, что это учебный проект, а не настоящий. Два компонента составляют всё приложение, поэтому интеграционные и E2E-тесты делают одно и то же. Но в реальном приложении E2E-тест состоит из сотен модулей, тогда как интеграционные тесты включают в себя несколько, быть может, 10 модулей. Таким образом, в реальном приложении будет около 10 E2E-тестов, но сотни интеграционных тестов.

Интеграционное тестирование на примере реального проекта

Интеграционное тестирование редко попадает в заголовки статей из раздела «Информационные технологии». Масштаб ошибок интеграции не сравнится по степени критичности и по размеру понесенных убытков с ошибками безопасности.

Бизнес, который готовится выпустить продукт на рынок, также редко закладывает в план тестирование интеграции. Обычно проверяется функциональность решения (в рамках функционального тестирования), возможность ПО работать в различных браузерах и ОС (кроссбраузерное и кроссплатформенное тестирование соответственно) или локализация продукта (если речь идет о выпуске решения на международный рынок).

Однако важность интеграционного тестирования недооценивать нельзя. Грамотное интеграционное тестирование – один из основных шагов на пути к выпуску надежного продукта.


Что же это за тестирование и как оно проводится?

Первой на ум приходит интеграция продукта с платежными сервисами. Это, безусловно, важный аспект для проверки тестировщиками, но далеко не единственный.

Бизнес сегодня опирается на множество программных решений: вебсайт, системы ERP, CRM, CMS. От интеграции всех систем зависит качество обработки запросов пользователей, скорость предоставления услуг и успешность бизнеса в целом.

На примере реального проекта a1qa покажем, интеграция каких систем может тестироваться и что требуется от команды, чтобы получить релевантные результаты проверок.

Интеграционное тестирование: обзор проекта

Заказчик

В a1qa обратился представитель популярного англоязычного журнала. Издание доступно как в печатном виде, так и онлайн. На тестировании онлайн-портала и сфокусировалась команда a1qa.

Задача проекта

Помимо функциональности портала, команда должна была проверить модуль подписки, который состоял из нескольких компонентов. Данный модуль представлял особую важность, поскольку именно он отвечал за монетизацию онлайн-версии журнала.

Для реализации функции подписки и ее управления использовались:

  • CMS-решение, предоставляющее любые данные о подписках с применением различных фильтров: типа подписки, ее продолжительности и так далее.
  • Вебсайт, через который пользователь взаимодействует с системой.
  • CRM Salesforce. Функция – хранение данных о пользователях и приобретенных ими подписках. Дополнительная надстройка позволяет команде заказчика управлять приобретенными подписками, а также создавать новые и проверять старые подписки.
  • SaaS-решение для выставления счетов и обработки платежей.
  • Сервисная шина Mule ESB, с помощью которой осуществляется обмен данными между системами.
  • База данных как инструмент Business Intelligence.
  • Salesforce Marketing Cloud – инструмент рассылки корреспонденции и коммуникации с пользователями.
  • Еще одна система, хранящая данные о зарегистрированных пользователях с инструментом для публикации статей, видео- и аудио-контента.

Процесс оформления подписки был построен следующим образом:

  1. Подготовка набора данных, создание подписки.
  2. Предоставление пользователю возможности приобретения подписки после внесения персональных и платежных данных.
  3. Обработка заказа третьей стороной, предоставляющей свои услуги клиенту в данной сфере.

Цель клиента

Клиент хотел освободить процесс от третьих сторон. Для этого требовалось убедиться, что разработанная система подписки может бесперебойно решать все задачи без участия третьих сторон.

Задача тестирования

Команда a1qa должна была подтвердить, что продукт способен выполнять возложенные функции. В ходе проекта некоторые компоненты разрабатывались с нуля, некоторые настраивались на базе готовых.

Важно было проверить, как они взаимодействуют между собой, и ответить на вопрос: способна ли вся система решать требуемые задачи?

Стратегия проведения интеграционного тестирования a1qa

  1. Определены ключевые бизнес-процессы, которые должна выполнять система: создание, отмена, приостановка и возобновление подписки, изменение платежной информации для подписки и т.д.
  2. Разработана тестовая документация с учетом всех возможных вариаций. Вариации – различные альтернативные выполнения операций (например, отмена подписки может произойти по желанию заказчика, а может быть произведена автоматически, если платежные данные были отклонены банком), а также различные параметры (например, тип продукта). В документации требовалось учесть проверку того, например, что создание подписки пройдет успешно для всех продуктов в рамках каждого бизнес-процесса.
  3. Проведено тестирование, с помощью которого пошагово пройден каждый бизнес-процесс со стартового компонента (где он был инициирован) через все промежуточные и до финального (или финальных) с проверкой того, что все данные передаются правильно, а ожидаемые события на самом деле случаются.

Большинство процессов включало в себя передачу данных из одного модуля (чаще всего из Salesforce) во все остальные. Если начальной точкой был не SF, то информация из модуля поступала в MuleESB, а потом в SF, а оттуда во все остальные (опять же, через MuleESB).

На проведение тестирования интеграции было потрачено порядка 40% всех трудозатрат QA-команды.

Трудности

Большинство трудностей при проведении тестирования интеграции было вызвано недостаточной проработкой требований на начальном этапе проекта. Именно некачественные требования стали причиной множества дефектов и нестабильности системы в целом.

Поясним. Изначально требования выглядели как набор пользовательских историй (User Story) в JIRA и содержали только заголовки без какого-либо пояснения. Создавали их чаще всего разработчики.

Команда a1qa инициировала изменения в подходе написания требований: теперь для них обязательно добавляются описания и Acceptance Criteria, создаются промежуточные задачи с четким определением, кто и за что отвечает.

Автоматизация интеграционного тестирования

Автоматизация тестирования – непростой вопрос, который требует внимательного сопоставления всех «за» и «против».

Автоматизация интеграционного тестирования требует еще более внимательного подхода. С одной стороны, разработка автотестов сокращает время на выполнение тестов. С другой стороны, автотесты эффективны, когда работают с повторяющимися наборами данных или, как минимум, предсказуемыми.

А при оформлении подписки далеко не всегда так происходит: данные обновляются регулярно и хаотично. Поэтому тестирование проводилось преимущественно вручную.
Лишь на поздних стадиях проекта была внедрена автоматизация. Какие же тест-кейсы были автоматизированы? Были отобраны ключевые бизнес-процессы. Для каждого бизнес-процесса были прописаны вариации его прохождения. Автоматизированы были те тест-кейсы, которые покрывали регулярные и стабильные бизнес-процессы. Тем самым, автоматизация обеспечила максимальное покрытие при оптимальных затратах усилий.

Результаты

Работа над проектом продолжается, но уже можно сказать, что система функционирует надежно. Каждый компонент выполняет свою роль. А все вместе они помогают достичь поставленной цели – обеспечить бесперебойную работу важных для заказчика бизнес-процессов.

Подводя итоги

Тестирование интеграции обязательно, если на проекте задействованы процессы со сложной бизнес-логикой, которые задействуют различные системы.

Для проведения эффективного тестирования, обнаружения всех дефектов и недочетов команда по тестированию должна:

  1. Понимать структуру продукта, знать, как между собой взаимодействуют все модули;
  2. Владеть спецификой проекта. Это важно для написания хороших тест-кейсов, анализа результатов прогона тестов, выбора между ручным и автоматизированным тестированием.

Как заказать интеграционное тестирование?

Для получения бесплатной консультации по интеграционному тестированию, заполните данную форму.

22 тренда digital-маркетинга, которые нельзя игнорировать в 2020 году

Предлагаем вместе с нами прочитать перевод статьи Nidhi Dave.

Перевод – Айта Лузгина, агентство «Интериум».

За последние пять лет маркетинг изменился больше, чем за последние 50 лет, и быстрый прогресс не сдает темп.

Возможно, было время, когда вы могли бы не обращать внимание на искусственный интеллект или визуальный поиск как на уловки из последнего научно-фантастического фильма-блокбастера, но это время давно прошло. В настоящее время ИИ играет важную в digital-маркетинге и является неотъемлемой частью большинства тенденций в этом списке.

1) A/B Сплит-тестирование в SEO

Маркетинг – это все о тестировании, поэтому A/B-тестирование возглавляет наш список.

Тестирование при поисковой оптимизации, как и все сплит-тестирование, позволяет применять целенаправленный подход к изменениям контента.

Например, платформа Clickflow позволяет вам выбрать целевое увеличение CTR, затем отображает страницы вместе с отчетом по ключевым словам, в котором указано, по какой категории ваша страница ранжируется и какие ключевые слова помогут вам получить больше трафика. Внутри приложения вы вносите изменения в заголовок, мета-описание, тег заголовка и содержание тела, которые автоматически отражаются на вашем сайте:

2) Искусственный интеллект

Искусственный интеллект захватит мир! Или, по крайней мере, самые простые рабочие места.

Например, Microsoft и Uber – две компании, в дополнение к торговым центрам, спортивным аренам и кампусам, которые используют роботов Knightscope K5 для «патрулирования парковок и больших открытых площадок, для прогнозирования и предотвращения преступлений. Роботы могут считывать номерные знаки, сообщать о подозрительной деятельности и собирать данные, чтобы сообщать их владельцам». Эти роботы, похожие на R2-D2, можно арендовать за 7 долларов в час, что дешевле, чем зарплата охранника.

ИИ может анализировать поведение потребителей и шаблоны поиска, а также использовать данные с платформ социальных сетей и сообщений в блогах, чтобы помочь компаниям понять, как клиенты находят продукты и услуги.

Искусственный интеллект скоро станет движущей силой многих служб, и в настоящее время мы уже видим его применение в таких областях, как:

  • Чаты для обслуживания клиентов (25% клиентов будут использовать технологию виртуального помощника к 2020 году, по сравнению с 2% в 2020 году);
  • Рекомендации по продукту;
  • Создание контента;
  • Персонализация электронной почты;
  • Транзакции электронной торговли.

3) Алгоритмичная реклама

Алгоритмичная реклама означает использование искусственного интеллекта для автоматизации покупки рекламы, чтобы вы могли ориентироваться на более конкретную аудиторию. Например, ставки в реальном времени – это как раз тип алгоритмической рекламы. Эта автоматизация намного эффективнее и быстрее, что означает более высокую конверсию и более низкие затраты на привлечение клиентов.

Она настолько быстро меняет облик цифровой рекламы, что, по данным eMarketer, к 2020 году 86,2% цифровых рекламных объявлений в США будут алгоритмическими.

4) Чат-боты

Чат-боты по-прежнему будут важной частью цифрового маркетинга. Эта технология на основе ИИ использует обмен мгновенными сообщениями для общения в реальном времени, днем или ночью, с вашими клиентами или посетителями сайта.

Опросы показывают, что:

  • 63% респондентов предпочитают обмениваться сообщениями с чат-ботами, чтобы общаться с брендом;
  • Чат-боты обеспечат 85% обслуживания клиентов к 2020 году;
  • Главными преимуществами чат-ботов являются круглосуточное обслуживание (64%), мгновенные ответы на запросы (55%) и ответы на простые вопросы (55%);
  • К 2022 году чат-боты помогут предприятиям сэкономить более 8 миллиардов долларов в год;
  • 80% предприятий хотят внедрить чат-ботов к 2020 году.

Многие клиенты предпочитают общаться с чат-ботами, так как они круглосуточно активны, дают ответы быстро, помнят всю историю ваших покупок и никогда не теряют терпения. Эти виртуальные помощники предлагают превосходное обслуживание клиентов, удовлетворяя ожидания клиентов и автоматизируя повторяющиеся задачи.

Многие бренды уже используют технологию чат-ботов, в том числе Uber. Их чат-бот общается с клиентами, что облегчает возможность получить аренду автомобилей через мобильное приложение, Facebook Messenger, Slack или Google Maps:

Пассажиры могут использовать меню, чтобы выбрать тип поездки, сделать запрос, отследить местоположение автомобиля, отправить друзьям время своего прибытия и даже произвести оплату.

Другие бренды, которые успешно используют технологию чат-ботов: Whole Foods Market, Fandango, Sephora, Staples, The Wall Street Journal и Pizza Hut.

5) Персонализация

Если вы хотите выделиться в 2020 году, вам нужно персонализировать свой маркетинг –контент, продукты, электронную почту и многое другое.

Благодаря доступности таких данных, как история покупок, поведение потребителей и ссылки, а также специальное программное обеспечение для реализации кампаний, получить пользовательский контент стало проще.

Посмотрите на эти характеристики персонализации:

  • 63% потребителей очень раздражены общими рекламными объявлениями;
  • 80% говорят, что они более склонны общаться с компанией, если она предлагает персонализированный опыт;
  • 90% утверждают, что считают персонализацию привлекательной.

Согласно EmailMonks, «персонализированные, инициированные электронные письма, основанные на поведении, в 3 раза лучше, чем пакетные электронные письма».

6) Видеомаркетинг

Видеомаркетинг является одним из самых важных маркетинговых трендов на ближайшие 5-10 лет.

Вот некоторые тенденции видеомаркетинга, которые набирают все большую популярность:


  • Живое видео особенно популярно среди большого числа компаний, которые используют его для интервью, демонстраций продуктов и закулисных представлений о бренде, таких как жизнь в офисе, как производятся продукты, корпоративные мероприятия и т. д.
  • Видео 1:1 – когда компании или маркетологи создают персонализированные видеосообщения, а не делают телефонные звонки или отправляют электронные письма. С уменьшением стоимости оборудования и все более качественными камерами для смартфонов это стало проще, чем когда-либо.
  • Шопинг-видеоконтент стал очень простым способом сократить время покупок, позволяя людям приобретать товары напрямую из видео или изображения. Когда кто-то наводит курсор на картинку, появляется кнопка «Купить сейчас», и вы переходите на страницу продукта:
  • Видео SEO. YouTube и другие видео отображаются в поисковой выдаче, поэтому оптимизация видеоконтента становится гораздо более важной задачей.
  • Видео 360 градусов, которое расширяет возможности интерактивного общения, сейчас в топе – просто нажмите на круглый символ в верхнем левом углу, чтобы начать перемещать движущееся изображение влево или вправо во время воспроизведения:
Топ-пост этого месяца:  WP-Recall — плагин для организации продвинутого личного кабинета для посетителей блога (личка,

Рим: Экскурсия по городу с гидом — отличный пример 360-градусного видео:

7) Маркетинг влияния

Маркетинг влияния – это тип сарафанного радио, в котором основное внимание уделяется использованию ключевых лидеров мнений для продвижения вашего бренда на более широкую аудиторию. Влиятельными людьми могут быть знаменитости, но чаще всего это люди из Instagram или YouTube с большим количеством подписчиков, которые могут помочь распространить информацию о вашем бизнесе или продукте через свои аккаунты в социальных сетях.

Поскольку маркетинг рекомендаций обычно более достоверен, 92% людей доверяют другим потребителям по сравнению с корпоративной рекламой. По этой причине Iceland, популярная британская сеть супермаркетов, перешла от телевизионной рекламы к кампании, в которой участвовали настоящие мамы.

Совместно с сообществом YouTube, Channel Mum теперь работает с несколькими влогерами, чтобы продвигать свои продукты в более реалистичном формате. Это привело к увеличению рейтинга с 10% до 80%.

8) Мессенджеры

Если вы думаете, что мессенджеры предназначены только для отправки смайликов вашим друзьям, взгляните на эти цифры:

  • 1,3 миллиарда пользователей в месяц активны в Facebook Messenger:
  • 10 миллиардов сообщений отправляются между людьми и компаниями в Facebook Messenger каждый месяц.
  • WhatsApp насчитывает 1,6 миллиарда активных пользователей, и каждый день отправляется 55 миллиардов сообщений.
  • В трех лучших приложениях для обмена сообщениями в социальных сетях (WhatsApp, Facebook Messenger и WeChat) объединено больше пользователей, чем в Facebook или YouTube.

Эта статистика показывает популярность мессенджеров и, поскольку люди тратят больше времени на обмен сообщениями друг с другом, имеет смысл продавать продукты и услуги там, где постоянно находятся ваши потенциальные клиенты.

9) Визуальный поиск

Визуальный поиск может вывести пользовательский опыт на совершенно новый уровень: люди могут загружать изображение, чтобы выполнить поиск и получить более конкретные результаты.

Неудивительно, что компания Pinterest воспользовалась популярностью в этой области (они выпустили Lens – инструмент для визуального поиска, который позволяет пользователям делать фотографии объекта, чтобы узнать, где его можно купить в интернете, найти похожие продукты или просмотреть заметки по теме). Эта возможность фактически превращает камеру вашего телефона в строку поиска.

И Pinterest не единственная платформа с визуальным поиском.

10) Микромоменты

Микромоменты – это «моменты, когда мы обращаемся к устройству, чаще всего к смартфону, чтобы заострить внимание на том, что нам нужно или на том, что мы хотим прямо сейчас».

Люди обычно принимают мгновенные решения о том, что есть, какой ресторан выбрать, что купить или куда пойти, поэтому ниже представлены микромоменты, о которых должен знать каждый маркетолог:

11) Голосовой поиск и умные динамики

Расширение использования голосового поиска сделало важным переосмысление своих стратегий цифрового маркетинга в 2020 году. Рассмотрим следующие цифры:

    К 2020 году 50% всех поисковых запросов будет осуществляться через голос;

13% всех американских домов имели умные колонки в 2020 году, и ожидается, что к 2022 году их количество увеличится до 55%;

  • По состоянию на январь 2020 года в месяц проводилось около одного миллиарда голосовых поисков;
  • 25% покупателей использовали голосовые помощники во время праздничных покупок в 2020 году;
  • 72% людей, которые имеют голосовые помощники, говорят, что их устройства используются как часть их повседневной жизни;
  • В 2022 году покупки с помощью голоса вырастут до 40 миллиардов долларов по сравнению с 2 миллиардами сегодня.
  • Многие бренды включили голосовой поиск в свои стратегии цифрового маркетинга для эффективной доставки контента своим клиентам.

    12) Истории в социальных сетях

    Сначала Snapchat выпустил концепцию «Моя история», затем были представлены истории из Instagram и Facebook, а затем YouTube обнародовал свой собственный формат истории: «Reels».

    Поскольку истории исчезают через определенный промежуток времени, это отличная возможность для маркетологов эффективно использовать FOMO («страх пропустить»).

    Преимущества использования социальных сетей включают в себя:

    • Повышение узнаваемости бренда;
    • Постоянное взаимодействие с подписчиками;
    • Экономическая эффективность;
    • Увеличение трафика на вашу веб-страницу;
    • Возможность охватить молодую аудиторию.

    13) Push-уведомления браузера

    Поскольку электронная почта сталкивается со всевозможными проблемами и контролем, включая GDPR и более строгие фильтры, и с тем, что более молодая аудитория предпочитает другие методы связи, push-уведомления растут.

    Статистика показывает, что 33% людей в возрасте от 18 до 34 лет всегда выбирают push-уведомления в интернете.

    Фактически использование персонализированных push-уведомлений увеличивает конверсию:

    • Скорость открытия для сегментированных push-сообщений — 7% по сравнению с 3% для общих сообщений (в 2 раза больше);
    • 54% пользователей переходят из сегментированных push-уведомлений по сравнению только с 15% для широковещательных сообщений (улучшение в 3 раза).

    Push-уведомления используются для повторного привлечения пользователей, которые проявили интерес, но не конвертировались, а также для напоминания об оставленных покупках в корзине.

    14) Контент-маркетинг

    Контент-маркетинг настолько важен, что 88% маркетологов b2b-сегмента соглашаются, что создание контента заставляет их аудиторию рассматривать свою организацию как заслуживающий доверия и надежный ресурс.

    • Контент-маркетинг стоит на 62% меньше, чем традиционный маркетинг, и генерирует в 3 раза больше потенциальных клиентов;
    • Контент-маркетинг имеет более низкие первоначальные затраты и более глубокие долгосрочные выгоды;
    • 615 миллионов устройств теперь используют блокировку рекламы, а это означает, что часть пользователей не видят вашу рекламу;
    • Малый бизнес, который ведет блог, получает на 126% больше роста, чем те, у кого его нет;
    • Контент-маркетинг повышает уровень конверсии в 6 раз по сравнению с другими методами.

    15) Социальная коммерция

    Электронная коммерция и социальные сети растут с пугающими темпами, поэтому неудивительно, что компании прилагают усилия для максимального увеличения возможности продаж.

    В прошлом году Instagram ввел функцию Shoppable Posts, позволяющую брендам связывать интернет-магазин со своим постом в Instagram с помощью кнопки «Купить сейчас».

    В марте этого года Instagram представил Instagram Checkout, который позволяет пользователям совершать покупки в Instagram:

    Бренды надеются, что это снизит риск того, что клиенты откажутся от покупки, поскольку им приходится переключать приложения или входить в неизвестный магазин.

    В настоящее время эта функция ограничена небольшим количеством известных брендов, но наверняка скоро будет представлена всем остальным.

    16) Омниканальный маркетинг

    Если многоканальный маркетинг был модным словом 2020 года, то омниканальный маркетинг канал вошел в моду во второй половине 2020 года.

    Омниканальный маркетинг – это процесс использования нескольких платформ, таких как социальные сети, приложения или контент блога, для взаимодействия с аудиторией.

    Чтобы оставаться впереди, бренды должны представлять цельную, последовательную коммуникацию во всех доступных каналах, включая физические витрины, платформы социальных сетей, в каталогах и в любом другом месте. Все каналы должны быть связаны в одну всеобъемлющую стратегию для достижения наилучших результатов.

    Статистика показывает, что бренды, использующие три или более каналов в рабочем процессе автоматизации, могут наблюдать такие результаты:

    • Уровень вовлеченности: 18,96% по многоканальному каналу против 5,4% по одноканальному;
    • Частота покупки: 250% выше по многоканальному по сравнению с одноканальным;
    • Средняя стоимость заказа: на 13% больше за заказ по многоканальному, чем одноканальному;
    • Уровень удержания клиентов: на 90% выше для многоканального по сравнению с одноканальным.

    17) Дополненная реальность (AR) и иммерсивные технологии

    Gartner прогнозирует, что к 2022 году 70% предприятий будут экспериментировать с иммерсивными технологиями, а 25% будут внедрены в производство.

    В то время, как виртуальная реальность (VR) создает много шума и воодушевляет всех грандиозными научными идеями, AR гораздо более осуществим с точки зрения маркетинга. Эксперты прогнозируют, что AR будет продолжать опережать VR по доле рынка.

    Бренды все чаще используют эту технологию, чтобы улучшить потребительский опыт и увеличить продажи.

    ModiFace, которая недавно была приобретена L’Oreal, производит приложения AR для брендов. Sephora Virtual Artist — впечатляющий пример технологии ModiFace, позволяющий вам увидеть, как различные цвета и виды макияжа будут выглядеть на вашем лице:

    А у IKEA есть свое собственное AR-приложение под названием IKEA Place, которое позволяет вам делать снимки комнаты в вашем доме с помощью камеры смартфона, чтобы «протестировать» мебель IKEA в ней. Вы можете передвинуть мебель и посмотреть, как она будет выглядеть под разными углами:

    С быстрым развитием AR-технологий мы увидим огромный интерес брендов, которые в будущем создадут полезные приложения с дополненной реальностью.

    18) Прогнозная и расширенная аналитика

    Прогнозная аналитика – это практика использования интеллектуального анализа данных, прогнозного моделирования и машинного обучения для определения закономерностей и попыток предсказать будущее. Она становится все более популярной и широко распространенной во многих отраслях.

    В цифровом маркетинге прогнозная аналитика используется в расширенном скоринге потенциальных клиентов, сегментации, а также индивидуальной персонализации, чтобы уменьшить отток клиентов и повысить их лояльность.

    Примером, с которым мы все знакомы, являются рекомендации продуктов Amazon, которые, по оценкам, составляют до 30% от общего объема продаж. И теперь с Amazon Assistant, расширением Chrome, рекомендации этого розничного гиганта распространяются не только на их собственный веб-сайт, но и на весь интернет:

    Gartner прогнозирует, что к 2020 году более 40% задач по обработке данных будут автоматизированы, а это означает, что понимание огромных объемов данных, собираемых компаниями, позволит лучше персонализировать процесс принятия решений и, следовательно, повысить производительность.

    19) Рост геомаркетинга

    Хотя идея маркетинга для людей в зависимости от их местоположения не нова, мы ожидаем увеличения использования геотаргетинга – к 2023 году этот рынок вырастет до $2,2 млрд – наряду с ростом использования мобильных устройств:

    Геотаргетинг позволяет в реальном времени ориентироваться на местоположение пользователя. Целевая область определяется, скажем, в миле от ресторана, и когда пользователь входит или выходит из этой области, он получает push-уведомление, текстовое сообщение или другую форму маркетинговой коммуникации.

    Для отраслей, которым необходимо преобразовать цифровых пользователей в обычных клиентов, геотаргетинг будет становиться все более и более важным направлением в их маркетинговой стратегии.

    20) Прогрессивные веб-приложения (PWA)

    Прогрессивные веб-приложения – это веб-сайты, которые работают как мобильные приложения. Они предлагают функциональные возможности собственного мобильного приложения – быстрое время загрузки, push-уведомления, работа в автономном режиме и т. д. – без ограничения одной платформой.

    Ожидается, что к 2020 году число пользователей смартфонов достигнет 2,87 млрд, поэтому с учетом того, что общее количество просмотров страниц по мобильным телефонам в годовом исчислении увеличивается почти на 50%, мобильность становится как никогда важной для цифровой стратегии:

    21) Пользовательский контент

    Маркетологи все чаще используют пользовательский контент, чтобы привлечь миллениалов и поколение Z. Поощряя вашу аудиторию создавать собственный контент и предлагая стимулы, вы можете увеличить уровень вовлеченности и повысить конверсию.

    Люди доверяют другим больше, чем брендам. Фактически опрос показал: 90% покупателей сообщили, что UGC повлияли на их решение о покупке, больше, чем любая другая форма рекламы, причем колоссальные 97% подростков в возрасте от 18 до 29 лет сказали, что это оказало чрезвычайное влияние.

    UGC может быть таким же базовым, как комментарии и отзывы в блоге или принимать форму сообщений в блоге, изображений и видео, созданных пользователями.

    GoPro посвящает весь канал YouTube UGC, показывая высококачественные видеоролики, снятые клиентами с использованием портативных камер. На канал в настоящее время подписано 7 миллионов человек.

    22) Технология блокчейна

    Как определено в Blockgeeks, «блокчейн – это, в простейшем смысле, серия неизменяемых записей данных с метками времени, управляемая кластером компьютеров, не принадлежащих какой-либо одной организации. Каждый из этих блоков данных защищен и связан друг с другом с использованием криптографических принципов (то есть цепочки)».

    Однако использование блокчейна гораздо шире, чем просто финансовый мир; эта технология также затрагивает мир цифрового маркетинга. Блокчейн устраняет посредника в цифровом маркетинге, укрепляет доверие с помощью прозрачности и предлагает преимущества для брендинга.

    Будущее digital-маркетинга

    Будущее цифрового маркетинга определенно преобразуется технологиями. Биг дата, автоматизация искусственного интеллекта, иммерсивные и интеллектуальные технологии меняют способ, которым бренды анализируют данные клиентов и взаимодействуют со своей аудиторией. Клиенты в свою очередь становятся более опытными и ожидают действительно персонализированного контента.

    Чтобы не отставать от курса и увеличить конверсию в ближайшие годы, вам нужно будет улучшать пользовательский контент, в частности аудио и видео, чтобы делиться им с целевой аудиторией.

    И, забегая вперед, вам, возможно, придется инвестировать в какие-то безумно футуристические технологии, чтобы оставаться впереди конкурентов!

    Материал опубликован пользователем.
    Нажмите кнопку «Написать», чтобы поделиться мнением или рассказать о своём проекте.

    МОДУЛЬНОЕ ТЕСТИРОВАНИЕ (Node.js unit testing tutorial)

    В этой главе вы узнаете, что такое модульное тестирование (или юнит-тестирование) в Node.js, и как правильно тестировать ваши приложения.

    This article was translated to Russian by Andrey Melikhov, a front-end developer from Yandex.Money and editor of the collective blog about front-end, devSchacht. Find Andrey on: Twitter, GitHub, Medium & SoundCloud

    Read the original article in English: Node.js unit testing tutorial.

    Перевод этой статьи сделан Андреем Мелиховым, фронтенд-разработчиком из компании Яндекс.Деньги, редактором коллективного блога о фронтенде, devSchacht. Twitter | GitHub | Medium | SoundCloud

    Тестирование Node.js-приложений

    Вы можете думать о тестах как о гарантиях надёжности для приложений, которые вы пишите. Они будут запускаться не только на вашей локальной машине, но также и на CI-сервисах, чтобы сбойные сборки не попадали в продакшен.

    «Тесты — это больше, чем просто гарантии, они обеспечивают живую документацию для вашей кодовой базы».

    Вы можете спросить: что я должен протестировать в своём приложении? Сколько тестов у меня должно быть?

    Ответ варьируется в разных случаях, но, как правило, вы можете следовать рекомендациям, установленным пирамидой тестирования.

    По сути, тестовая пирамида описывает, что вы должны писать модульные тесты, интеграционные тесты и e2e тесты. У вас должно быть больше интеграционных тестов, чем e2e и ещё больше модульных тестов.

    Давайте посмотрим, как вы можете добавить модульные тесты для своих приложений!

    Обратите внимание, что здесь мы не собираемся говорить об интеграционных и e2e тестах, поскольку они выходят далеко за рамки этого учебника.

    Модульное тестирование Node.js приложений

    Мы пишем модульные тесты для того, чтобы увидеть, работает ли данный модуль (юнит). Все зависимости обрезаны, что означает, что мы предоставляем поддельные зависимости (фейки) для модуля.

    Топ-пост этого месяца:  Новые возможности, представленные в WebStorm Angular примеры использования функций

    Вы должны написать тесты для публичных методов, а не для внутренней реализации данного модуля.

    Анатомия модульного теста

    Каждый модульный тест имеет следующую структуру:

    1. Настройка теста
    2. Вызов тестируемого метода
    3. Утверждение

    В каждом модульном тесте должны проверяться только одна проблема. (Конечно, это не означает, что вы можете добавить только одно утверждение).

    Библиотеки, используемые для тестирования в Node.js

    Для модульного тестирования мы собираемся использовать следующие библиотеки:
    запуск тестов: mocha, альтернативно tape
    библиотека утверждений: chai, альтернативно assert
    шпионы, стабы и моки: sinon (для настройки тестов).

    Шпионы, стабы и моки — что использовать и когда?

    Прежде чем приступить к практике модульного тестирования, давайте разберёмся, что такое шпионы, заглушки и моки!

    Шпионы

    Вы можете использовать шпионов для получения информации о вызовах функций, например, сколько раз они были вызваны или какие аргументы были им переданы.

    Стабы

    Стабы (или заглушки) похожи на шпионов, но они заменяют целевую функцию. Вы можете использовать заглушки для управления поведением метода, чтобы форсировать какие-то события в коде (например, выброс ошибки) или предотвратить вызовы внешних ресурсов (таких как HTTP API).

    Моки — это поддельные методы с заранее запрограммированным поведением и соглашениями.

    Как вы можете видеть, для моков вы должны заранее определить соглашения.

    Представьте, что вы хотите протестировать следующий модуль:

    Этот модуль делает одну вещь: он сохраняет веб-страницу (основываясь на переданном URL) в файл на локальном компьютере. Чтобы протестировать этот модуль, мы должны «застабить» как модуль fs , так и модуль request .

    Прежде чем начинать писать модульные тесты, в RisingStack обычно мы добавляем файл test-setup.spec.js для создания базовой настройки тестов, например создания песочниц Sinon. Это избавит вас от написания sinon.sandbox.create() и sinon.sandbox.restore() после каждого теста.

    Кроме того, обратите внимание, что мы всегда ставим файлы тестов рядом с реализацией и даём им имя вида .spec.js . В нашем package.json вы можете найти следующие строки:

    Как только у нас появились эти настройки, пришло время написать сами тесты!

    Полные исходники примера вы можете найти здесь:

    Покрытие кода

    Чтобы лучше понять, насколько хорошо ваша кодовая база покрыта тестами, вы можете сгенерировать отчёт о покрытии.

    Этот отчёт будет включать следующие метрики:

    • покрытие строк кода,
    • покрытие инструкций,
    • покрытие ветвлений,
    • и покрытие функций.

    В RisingStack мы используем istanbul для анализа покрытия кода. Вы должны добавить следующий скрипт к вашему package.json , чтобы использовать istanbul с mocha :

    Как только вы это сделаете, вы получите что-то вроде этого:

    Вы можете кликнуть мышью, и на самом деле увидеть, что ваш исходный код аннотирован: какая часть протестирована, а какая — нет.

    Pivotal Engineering Journal

    Technical articles from Pivotal engineers.

    React integration testing with Enzyme

    We used Enzyme, a popular React unit testing library, for full-on frontend integration tests. Find out how our setup greatly improves feedback and avo > Posted on Sun, Nov 5, 2020 by

    • Jacek Rzeniewicz
    • Ben Grohbiel

    Categories: ReactEnzymeJavascriptTesting
    Edit this post on GitHub.

    The beginning

    Earlier this year while setting up a React-Redux project, we realised that various React seeds were missing integration tests. The seeds usually shipped configuration for unit tests and acceptance tests.

    We found the lack of integration tests in a React Redux application was particularly painful because of the following two reasons:

    • The decoupled design of Redux: The Redux building blocks like reducers, components, middleware don’t know of each others existence. Testing individual bits in isolation gives absolutely no confidence that they work together.
    • JavaScript is a dynamically typed language: when the app’s state structure changes, the compiler cannot help find unit tests that need adjusting

    We were interested to test how any subset or even all the loosely coupled parts together — with a tight feedback loop, hence no browser or Selenium involved.

    Enzyme to the rescue?

    Enzyme is a test utility which allows you to take a React component, render it in memory and inspect the output with a jQuery-like API. Primarily it is used as a unit test library: you typically render one component with its nested components and verify that the output is as expected. Enzyme implements React components’ lifecycle methods and is suitable for testing of things like prop updates, state changes, event handlers or unmount hooks.

    Fortunately for us everything in React is a component, in particular the router and the store provider. Technically, nothing stops Enzyme from rendering the entire app in memory and acting as an integration test engine.

    Enzyme can be run in node using jsdom to simulate a browser.

    The example app

    React tutorials usually use a ToDo list app for demonstration purposes but that idea is a bit worn out now. All code examples below come from something else entirely: a shopping list app.

    If the code snippets on their own don’t make much sense to you, you can find the full source code in this Github repo.

    The main app component is simple: we have a list of items rendered by the ShoppingList component and either a link to a new item form or the form itself below it. Everything is wrapped by a Router and Redux store Provider .

    There also is a Redux middleware that fetches shopping list items from a server whenever the app navigates to the root URL. When a new item is submitted, the middleware makes a local optimistic update (appends the new item to the local state) and navigates to the root URL that causes a refresh of the list.

    Basic integration test

    One very basic integration test that we may want is to check that the app displays shopping list items. Let’s begin by mounting the app with Enzyme!

    We set up a mock server response with two items on the list, mount the app, wait for it to fetch the items from the server (more on that below) and assert the app renders those items. It’s a very simple test, but it touches the router, middleware, reducers and components, so it adds a lot of confidence in different parts of the app working together.

    Waiting for asynchronous events

    When we call mount for the first time in AppTestHelper constructor, only the initial app render happens. It synchronously starts the HTTP request to get the shopping list from the API items but response callback will be called asynchronously. The purpose of the asyncFlush call is to wait for all async callbacks to run.

    By chaining code on asyncFlush() we cause a context switch and effectively wait for the server response to update the UI. With the new async await syntax in ECMAScript 2020 the test code reads very similar to synchronous code although stack traces are not as clear as with synchronous code.

    On the project we experimented with our own Promise implementation that offered a synchronous flush function. It was certainly fun to write it, but it required a lot of bespoke code that needed to be maintained and wasn’t worth the effort just for the benefit of clean stack traces.

    Testing user interactions

    Let’s move on to testing a more complex scenario — adding an item to the list. The beforeEach block a bit earlier initialises the list with apples and bananas. In the test below, we add carrots and simulate that someone else simultaneously deleted apples and added dill.

    The first expect checks the state before, while the other one after the server response has been handled.

    click and setValue call Enzyme’s simulate . It is fairly simple: simulate(‘someEvent’) looks for a prop called onSomeEvent and invokes it if there is one.

    Testing url states

    As opposed to testing user interactions, you probably also want to test url states. Continuing with the shopping list example, there are two ways to get to the new item form: — By interaction: user going to the root address and navigating to /new-item with an internal link (we named this warm start); — By url state: user going to /new-item straight away (we named this cold start).

    They should see exactly the same page regardless of how they arrived at that URL however each of these cases executes slightly different code. Integration tests will look slightly different depending on whether we do warm start or cold start:

    It is worth noting that testing states by interactions can become cumbersome in larger applications. The more interations a test requires, the more likely it is that one of the interactions fails. If this is the case, it is hard to figure out what exactly went wrong. In particularly keeping oversight on the stubs as the number of interactions increase is difficult and makes debugging hard. With cold start tests some of that red noise goes away.

    In the beginning of the project we wrote mainly interaction-based integration tests in Enzyme. As the application grew, we switched more and more to setting state through the url state, and then kept the interactions focused on the test at hand. Complicated interactions we ran as acceptance tests.

    What if we use non-React libraries?

    One of key features of the app we built was a map. We ended up using leaflet.js which did not at the time have a React adapter suitable for us. It took some figuring out but in the end it turned out that testing non-React libraries is not too difficult with Enzyme.

    For the purpose of this section let’s say our Shopping List app uses an old school Calendar (?!) library that manipulates the DOM directly. It dynamically populates a parent div with some text and a span element containing date:

    React component wrapping this library may look like this:

    And this is how an output HTML can look like in a browser:

    If we query Enzyme for an element with attribute [data-qa=»today»] it won’t return anything because the span with date is not managed by React. It is created directly at the DOM level, so we need to be inspecting the DOM in order to find it.

    Fortunately, Enzyme’s mount provides us with a way to pass an element where our React component will be attached. We can introduce a dom to our test:

    It was only a bit more difficult than this with Leaflet where we had to monkeypatch a few functions that Leaflet was calling internally.

    Do we need acceptance tests?

    Our integration tests became so rich, they were quite similar to our acceptance tests in terms of interactions. Yet, we decided that in the case of our application there was value in keeping both:

    • The acceptance tests exercised both frontend and backend — no stubs, real interactions.
    • The acceptance tests run in a browser and allowed to test a particular version of IE.
    • The acceptance tests were checking the app in warm start view, and JavaScript integration tests were exercising cold start more often.

    Interesting further research could have been to integrate a Contract Testing framework such as Pact or Spring Cloud Contract). With such a tool, it would be possible to verify the correctness of every stub, and orchestrate the stubs better. Perhaps that would have helped to increase the confidence in the integration tests further.

    Looking back on integration tests with Enzyme

    Enzyme integration testing is a bit unusual and we weren’t really sure where it was going to get us. Here are some good and bad sides we found:

    The yeahs

    • Tests can run in Node, so they are *insanely* fast. Hundreds of tests involving UI interactions and visiting multiple pages run in a matter of a few seconds. Feedback is fast, coverage is vast.
    • There was less need to run full-blown end-to-end tests, which saves time.
    • No context switch for developers between unit and integration tests. It’s React, Javascript and Enzyme (almost) all the time.
    • You can test how non-React libraries integrate with the React app.
    • It is easier to test various edge cases then in traditional Selenium tests — e.g. asserting on UI state both before and after it updated as a result of a server response.

    The mehs

    • Sometimes when tests fail it is hard to tell what actually went wrong as there is no graphical UI to look at. It may take a few console.log(screen.debug()) to find out what’s broken. Cold-start approach can help in some cases.
    • In some scenarios it is not too easy to set up a test. Usually because of limitations of mocking the API responses.
    • Testing non-react libraries requires a bit of fiddling (see example above).
    • Enzyme does not clean the state between tests, you will need to manage test pollution yourself by cleaning state after each test.
    • Running in Node environment, Enzyme tests cannot fully replace browser testing that guarantees we are not missing some polyfill or lacking a hack required by IE.

    Summary

    We took an experimental path and used Enzyme for writing integration tests that mounted an entire React-Redux application. There were a few things that we had to figure out in order to make it work for a large application such as mocking server responses, testing the UI around asynchronous callbacks and testing integrations with non-React code. As a result, we had roughly 500 tests running within seconds and providing us with important confidence before kicking off the few notoriously slow acceptance tests.

    Thanks to Callum, Daniela and Gagan for reading early versions of this post!

    Добавить комментарий