Facebook Jest, инструмент тестирования JS для людей, которые ненавидят написание тестов

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

Обновление: пример кода для вашего удобства! Я только что опубликовал сокращенную версию настоящего проекта JEST, на котором основана эта статья. Вот репо на GitHub.

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

Ну может два шага.

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

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

Итак, когда мне пришлось столкнуться с задачей найти хороший набор для тестирования Javascript, я не только искал надежный инструмент. Я также хотел что-то, что могло бы вывести нас на крейсерскую скорость за короткое время и с небольшой болью. Настройка, изучение фреймворка, получение результатов, понимание загадочных сообщений об ошибках… все это потенциальные болевые точки, которых я хотел избежать. Проверив несколько альтернатив, я решил попробовать Jest. И я избавил себя от множества стрессов.

Наш вариант использования

Я работал над SIASAR, проектом по сбору и анализу данных, финансируемым Всемирным банком, и посвященным системам водоснабжения и канализации в сельской местности. Многие программы разрабатывались одновременно, но все они основывались на одном ключевом компоненте: API-интерфейсе Drupal 7 для хранения и извлечения данных. В случае сбоя API ничего не могло бы работать. Если это не удастся в то же утро, сто геодезистов отправятся в поле для сбора данных, это будет катастрофой.

Поэтому нашим приоритетом был мониторинг работоспособности нашего API. Вход в систему, получение данных, проверка структуры данных, сохранение фиктивных данных, очистка, выход из системы. Все это нужно было делать с помощью асинхронных вызовов, отправки и чтения текста JSON. Тесты должны были выполняться как на сервере, так и локально без изменений конфигурации. Любой локальный: Windows, Linux, Mac.

Настройка однострочная

Jest - это инструмент тестирования по сути для React, но его можно легко использовать с любыми другими проектами, такими как наш. Единственное, что вам нужно для его использования, - это установленный на вашем компьютере Node.JS. На момент написания этой статьи Jest использует Jasmine2 в качестве механизма тестирования по умолчанию, но не думайте, что Facebook просто взял его и дал ему имя. Напротив, над этим предстоит огромная работа с единственной целью: упростить весь процесс.

Например, давайте добавим Jest в ваш проект, управляемый Node NPM.

npm install --save-dev jest

Вот и все. Никаких зависимостей, никаких «вам также нужно установить blablabla и отредактировать blablabla». Если у вас есть Node.JS (а у кого его нет?), Все готово.

Если вам нужна интеграция с Babel, инструкции по интеграции включены в Документацию Jest. И вы также можете использовать Jest с Typescript, используя дополнительный компонент ts-jest.

Jest автоматически находит ваши тесты

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

Поместите свои тесты в папку __tests__ или назовите файлы тестов с расширением .spec.js или .test.js. Что бы вы ни предпочли, Jest найдет и проведет ваши тесты.

Просто поместите свои тесты в любую нужную папку или группу папок, и Jest их найдет.

Шутка идет параллельно

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

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

Шутка выглядит простой, как простой английский

Jest сохраняет хорошие части синтаксиса Jasmine и старается сделать его «дружественным к человеку» для всего, что построено на нем. Пример моего реального теста:

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

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

Я люблю async / await, кстати, все становится намного проще. Для его использования вам потребуется Node 7.6 или выше.

Jest можно отлаживать так же, как и любой другой модуль Node.JS

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

Шутка смотрит

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

Настоятельно рекомендуется Jest

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

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

Бонус

Доступен пример кода: вы можете найти сокращенную, упрощенную копию нашего настоящего проекта JEST для SIASAR на GitHub.