Присоединяйтесь к нам в путешествии и узнайте, как выполняются модульные тесты в Truffle и как мы используем тестовую среду Jest для улучшения взаимодействия с такими IDE, как JetBrain WebStorm и Visual Studio Code

Фреймворк Truffle поставляется с удобным инструментом cli, который имеет множество полезных команд для компиляции, тестирования и развертывания ваших смарт-контрактов.

Например, трюфельный тест запускает все ваши модульные тесты и использует среду тестирования Mocha для их выполнения. Многие IDE, такие как JetBrain WebStorm и Visual Studio Code, имеют расширенные функции для поддержки запуска тестов Mocha изнутри вашей IDE, включая улучшенную навигацию по результатам тестов, запуск / отладку определенных тестов и повторное выполнение тестов после изменения файлов.

IDE обычно поддерживают все эти функции с помощью средства запуска тестов Test framework и соответствующих им параметров командной строки. Теперь проблема заключается в том, что t тест ruffle не использует средство запуска теста mocha по умолчанию (mocha cli) и не поддерживает стандартные параметры командной строки, а вместо этого реализует настраиваемое средство запуска теста Mocha с собственными параметрами командной строки. .

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

Другой особенностью IDE является то, что они отображают значки рядом с вашими тестовыми функциями, которые вы можете использовать для запуска / отладки ваших тестов. IDE ищет функции тестовой среды, которые представляют собой тестовые примеры (например, description, context и it), и соответственно отображает значки. Truffle представляет свою пользовательскую функцию contract, которая является оболочкой для стандартной функции describe и добавляет значения по умолчанию before, beforeEach и afterEach перехватчики жизненного цикла. В результате IDE больше не распознает ваши тесты, потому что теперь она видит функцию contract вместо функции describe и больше не будет отображать соответствующие значки.

Внутренности теста Truffle

На самом деле команда tuffle test делает гораздо больше, чем просто запускает ваши модульные тесты с помощью Mocha. Перед запуском тестов он

  • запускается и подключается к ганашу или к вашей настроенной сети, если она доступна;
  • предварительно выбирает все доступные учетные записи с подключенного узла;
  • компилирует все файлы solidity (включая модульные тесты, написанные на Solidity);
  • развертывает все артефакты на подключенном узле;
  • предоставляет глобальные переменные для легкого доступа в ваших тестах (артефакты, web3, assert, expect, contract).

Как было сказано ранее, функция c ontract добавляет по умолчанию хуки жизненного цикла before, beforeEach и afterEach. Хук before сбрасывает все смарт-контракты либо с помощью функции моментальных снимков Ganache, либо путем повторного развертывания всех смарт-контрактов. Перехватчики beforeEach и afterEach используются для распечатки журнала событий в случае сбоя теста.

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

Использование стандартного интерфейса командной строки Mocha

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

  • передать опцию -delay. Mocha не выполнит ваши модульные тесты до того, как ваш код вызовет внедренную функцию run.
  • используйте глобальную функцию before и верните обещание, которое разрешает те, которые ваша инициализация выполнена.

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

Таким образом, по умолчанию Mocha не предоставляет подходящего решения этой проблемы инициализации. Есть проблема. Также существует команда mocha-prepare, которая немного похожа на команду truffle test - сначала выполните инициализацию, а затем запустите Mocha с небольшим преимуществом, заключающимся в том, что она по-прежнему поддерживает все стандартные параметры командной строки mocha.

Использование тестовой среды Jest

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

Кроме того, вы указываете собственный класс testEnvironment, который может указывать функцию setup / teardown для каждого тестового файла. Это позволяет нам сбрасывать смарт-контракт один раз для каждого тестового файла. Это отличается от поведения трюфельного теста, поскольку трюфельный тест сбрасывает смарт-контракты всегда перед выполнением тестов в функции контракта, а не один раз для каждого тестового файла.

С другой стороны, у Jest есть и недостатки:

  • По умолчанию Jest выполняет тесты параллельно. Это принесет больше вреда, чем пользы в трюфельных проектах, поскольку мы подключены к одному узлу. Мы можем запустить все тесты линейно, указав параметр командной строки -runInBand или предоставив наш собственный тестовый runner через файл конфигурации.
  • В отличие от ловушки жизненного цикла afterEach Mocha, в Jest невозможно вычислить результат выполненного теста, и поэтому Jest не может динамически распечатывать журнал событий всякий раз, когда тест не удался.
  • Вы не можете передавать дополнительные параметры командной строки в Jest cli. Дополнительные параметры, такие как используемая сеть, должны быть переданы через переменные среды.

Пакет truffle-jest npm

В целом с Jest нам было комфортнее, поэтому мы создали пакет truffle-jest npm. Он извлекает функциональные возможности команды truffle test в новый пакет и адаптирует его к среде тестирования Jest.

Чтобы использовать Jest в своем трюфельном проекте, запустите

установка npm - save-dev jest @ types / jest truffle-jest

и создайте в своем проекте соответствующие jest.config.js и jest.setup.js. Для получения более подробной информации о том, как настроить трюфель-шутку, загляните в README.

Примечание: тесты должны быть независимыми друг от друга, если вы хотите выполнять отдельные модульные тесты из среды IDE или из командной строки. Вы можете добавить в свой jest.setup.js функцию beforeEach, которая сбрасывает смарт-контракты перед каждым тестом, а не перед каждым тестовым файлом (см. Снимок экрана выше).

Теперь у вас должна быть возможность настраивать Jest в своей среде IDE или использовать его из командной строки.

В настоящее время truffle-jest поддерживает только тесты, написанные на JavaScript. Тесты, написанные на Solidity, пока не поддерживаются. Ожидайте, что у трюфельной шутки будут некоторые шероховатости, так как это очень новый пакет npm. Мы продолжим улучшать его в течение следующих нескольких недель.

Вывод

Truffle предлагает отличную поддержку разработки смарт-контрактов Ethereum из коробки.

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

Пожалуйста, попробуйте трюфель-шутку, если он вам нравится, и поделитесь с нами своим мнением. Кроме того, мы будем участвовать в хакатоне ETHBerlin и будем рады пообщаться с вами там!

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

Есть вопросы?

Есть вопросы?

Присоединяйтесь к нашему Telegram: https://t.me/AsureNetwork
Следите за нами в твиттере: https://twitter.com/AsureNetwork
Посетите наш сайт: https: // www .asure.network

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