Проблема: тестирование
NAN — это проект, предназначенный для помощи в создании собственных (C ++) дополнений Node.js при сохранении совместимости с Node и V8 начиная с версии Node 0.8 и далее. V8 претерпевает серьезные внутренние изменения, что делает разработку дополнений очень сложной. Цель NAN — абстрагировать эту боль. Вместо того, чтобы поддерживать совместимость вашего кода с версиями Node / V8, NAN делает это за вас, и это непростая задача. Это означает, что мы должны быть уверены, что NAN протестирован и совместим со всеми версиями, которые он поддерживает. Это не тривиальное упражнение!
Трэвис CI может немного помочь с этим. Можно использовать nvm для тестирования разных версий Node.js даже за пределами официально поддерживаемых версий. Мы пробовали это с NAN, но без особого успеха. В идеале, у вас был бы лучший выбор версий Node, но Трэвису было трудно не отставать. Кроме того, исторические ошибки npm, которые поставляются со старыми версиями Node.js, имеют тенденцию вызывать высокую частоту отказов из-за проблем установки npm. По этой причине мы даже не публикуем значок Travis в NAN README, потому что он просто не работает.
Другая проблема с Travis состоит в том, что это решение CI , а не правильное решение для тестирования . Даже если это работает хорошо, это не очень полезно в процессе разработки, так как вам нужна быстрая обратная связь о том, что ваш код работает на ваших целевых платформах (это одна из причин, почему я люблю back-end-разработку больше, чем front-end-разработку!)
Решение: Докер
Введите Docker и DNT . Docker — это инструмент, который упрощает использование контейнеров Linux для создания легких, изолированных вычислительных «экземпляров». Solaris и его варианты годами обладали этой функциональностью в виде «зон», но это относительно новая концепция для Linux, и Docker делает весь процесс намного более дружественным. Относительная простота докеров в последние месяцы означала удивительную активность в контейнерном пространстве Linux, она превратилась в огромную экосистему почти за одну ночь.
DNT: Docker Node Tester
Docker Node Test, или DNT, это очень простая утилита, которая содержит два инструмента для работы с Docker и Node.js. Один инструмент помогает настроить контейнеры для тестирования, а другой запускает тесты вашего проекта в этих контейнерах.
DNT включает скрипт setup-dnt
Сначала он создает образ с именем dev_base
Затем он создает образ node_dev
исходного репозитория Node.js. Наконец, он создает серию изображений, необходимых для тестов, которые вы хотите запустить. Для каждой версии узла создается образ с установленным и готовым к использованию узлом.
Настройка проекта — это создание файла .dntrc
Этот файл конфигурации устанавливает переменную NODE_VERSIONS
Этот список может включать в себя «master» для проверки самого последнего кода из репозитория Node. Вы также устанавливаете переменную TEST_CMD
Команда setup-dnt
.dntrc
Затем команду dnt
Поскольку контейнеры Docker полностью изолированы, DNT может выполнять тесты параллельно, пока на машине есть ресурсы. По умолчанию используется количество ядер на компьютере в качестве уровня параллелизма, но это можно настроить, если это не подходит для тех типов тестов, которые вы хотите запустить.
Также можно настроить базовый тестовый образ для включения других внешних инструментов и библиотек, необходимых для вашего проекта, хотя это ручной шаг в процессе настройки.
В настоящее время DNT предназначен для анализа результатов теста TAP, считывая последнюю строку как «хорошо» или «не хорошо», чтобы сообщить о состоянии теста обратно в командной строке. Это настраивается, но вам нужно предоставить команду, которая преобразует результаты теста в «ок» или «не ок» ( sed
Нестандартный вывод репортера Mocha TAP также поддерживается из коробки.
Текущее использование
Мой основной вариант использования для тестирования NAN. Возможность тестировать все API-интерфейсы V8 и Node во время кодирования очень полезна, особенно когда тесты выполняются так быстро! Мой файл NAN .dntrc
На данный момент это всего 18 версий Node, и на моем компьютере тестовый набор занимает примерно 20 секунд для всех этих выпусков. Файл NAN .dntrc
показан ниже.
NODE_VERSIONS="\
master \
v0.11.10 \
v0.11.9 \
v0.11.8 \
v0.11.7 \
v0.11.6 \
v0.11.5 \
v0.11.4 \
v0.10.26 \
v0.10.25 \
v0.10.24 \
v0.10.23 \
v0.10.22 \
v0.8.26 \
v0.8.25 \
v0.8.24 \
v0.8.23 \
v0.8.22 \
"
OUTPUT_PREFIX="nan-"
TEST_CMD="\
cd /dnt/test/ && \
npm install && \
node_modules/.bin/node-gyp --nodedir /usr/src/node/ rebuild && \
node_modules/.bin/tap js/*-test.js; \
"
Далее я настроил LevelDOWN для DNT. LevelDOWN — это необработанная привязка C ++, которая выставляет LevelDB на Node.js. Его основное использование — бэкэнд для LevelUP . Потребности намного проще, так как тестам нужно только выполнить компиляцию и запустить множество тестов с проверкой узла. LevelDOWN .dntrc
показан в следующем примере кода.
NODE_VERSIONS="\
master \
v0.11.10 \
v0.11.9 \
v0.10.26 \
v0.10.25 \
v0.8.26 \
"
OUTPUT_PREFIX="leveldown-"
TEST_CMD="\
cd /dnt/ && \
npm install && \
node_modules/.bin/node-gyp --nodedir /usr/src/node/ rebuild && \
node_modules/.bin/tap test/*-test.js; \
"
Еще одна нативная надстройка Node, которую я настроил с помощью DNT, — это мои привязки libssh Node.js. Это немного сложнее, потому что перед компиляцией нужно установить несколько нестандартных библиотек. Мой .dntrc
apt-get
Это означает, что тесты занимают немного больше времени, но это не является препятствием. Альтернативой может быть настройка базового образа node_dev
Узел-libssh .dntrc
показан ниже.
NODE_VERSIONS="master v0.11.10 v0.10.26"
OUTPUT_PREFIX="libssh-"
TEST_CMD="\
apt-get install -y libkrb5-dev libssl-dev && \
cd /dnt/ && \
npm install && \
node_modules/.bin/node-gyp --nodedir /usr/src/node/ rebuild --debug && \
node_modules/.bin/tap test/*-test.js --stderr; \
"
LevelUP не является нативным дополнением, но использует LevelDOWN, который требует компиляции. Для конфигурации DNT я node_modules/leveldown/
npm install
LevelUP .dntrc
показан ниже:
NODE_VERSIONS="\
master \
v0.11.10 \
v0.11.9 \
v0.10.26 \
v0.10.25 \
v0.8.26 \
"
OUTPUT_PREFIX="levelup-"
TEST_CMD="\
cd /dnt/ && \
rm -rf node_modules/leveldown/ && \
npm install --nodedir=/usr/src/node && \
node_modules/.bin/tap test/*-test.js --stderr; \
#"
Будущая работа
Нетрудно представить, что это составляет основу локальной системы CI, а также общего инструмента тестирования. Скорость даже делает заманчивым запуск тестов при каждом коммите git или, возможно, даже при каждом сохранении. Уже сейчас команда агента New Relic Node.js использует внутреннюю ветвь DNT для очень сложной работы по тестированию своего агента на многих версиях Node.js в сочетании с тестами для различных общих серверных сред.
Я всегда хотел, чтобы у меня были участники, если у вас есть особые потребности и навыки для реализации новых функций, я бы хотел услышать ваше мнение. Я обычно очень открыт с моими проектами с открытым исходным кодом и рад добавить авторов, которые добавляют что-то ценное.
См. Репозиторий DNT GitHub для установки и подробных инструкций по использованию.
Род является одним из спикеров Кодекса веб-направлений этого года , который пройдет в Мельбурне 1 и 2 мая. Воспользуйтесь дисконтным кодом SITEPOINT, чтобы получить самую низкую цену на билеты с кодом Web Directions!