#node.js #code-coverage
#node.js #покрытие кода
Вопрос:
Я хотел бы отследить путь выполнения произвольного Node.js программа.
В частности, я хотел бы запустить программу (сервер или скрипт) и иметь какую-то трассировку выполнения на уровне блока (вызов функции, цикл, оператор if).
Ограничения
- Выходные данные должны содержать файлы / строки / количество попаданий для всех строк во время выполнения
- Нет минимизации кода. Стамбул великолепен, но я хочу, чтобы код, который выполняется в конце, был как можно более читаемым.
- Для длительно работающих процессов (например, серверов) я хочу иметь возможность видеть «текущее» покрытие строки (или как можно более актуальное)
- Я не хочу терять какие-либо данные покрытия, поэтому, хотя профилирование дало бы мне некоторые подсказки относительно попадания строк, на самом деле это не покрытие кода.
Вещи, которые меня не волнуют
- Как именно считывается покрытие. Например, это может быть выведено в файл, это может быть прочитано через код и т.д.
- Формат покрытия
То, что я исследовал до сих пор:
Использование NODE_V8_COVERAGE:
Я обнаружил, что если я установлю NODE_V8_COVERAGE
переменную среды в каталог, данные покрытия будут выводиться в этот каталог при завершении работы программы (вот сообщение в блоге о создании этой функции).
Проблема, с которой я сталкиваюсь здесь, заключается в том, что я не уверен, что есть способ запустить генерацию этих отчетов до завершения работы программы.
Использование инспектора
Я также экспериментировал с Node.js инспектор. Здесь я нашел полезный профилировщик процессора. В конечном итоге это может оказаться полезным, но этот профилировщик работает путем выборки, а не как привязка к языку. В результате я получаю только номера строк / количество для частей кода, которые были медленными.
Я также попытался использовать Profiler.startPreciseCoverage
, думая, что каким-то образом это может дать мне каждую выполненную строку (не нашел документации, в которой было бы ясно, что это делает на самом деле). Это не казалось более полезным
Использование Istanbul
Я хотел бы избежать инструментирования кода, если это возможно.
Вопрос
Кажется, что мои возможности ограничены, но в то же время это всего лишь результат моего поиска в Google в течение часа или двух.
Есть ли лучший способ захватить покрытие строки с учетом ограничений, перечисленных выше?
Комментарии:
1. Я не уверен, что полностью понимаю ваши требования, но вы пробовали запускать свой скрипт / сервер с ndb ( github.com/GoogleChromeLabs/ndb ) ? Вы можете добавить точки останова, чтобы остановить выполнение в определенной точке и проверить область. Но что более важно для вас: вы можете записывать производительность, и это дает вам своего рода FlameGraph. Вы также можете профилировать использование памяти с его помощью. Это Chrome devtools, но для nodejs
2. Разница между точным покрытием (
startPreciseCoverage
) и максимальным покрытием описана в версии 8.dev/blog/javascript-code-coverage . IIUC, точное покрытие сохраняет количество функций, которые выходят за рамки, в то время как при максимальном покрытии эта информация теряется.3. Если бы вам пришлось добавить строку кода в ваше приложение, чтобы записать текущее покрытие, соответствовало бы это вашим потребностям?
4. @Trott это было бы нормально! Добавление нескольких строк не является препятствием
Ответ №1:
Ожидается запрос на извлечение для Node.js чтобы добавить функциональность для программного запуска / остановки / записи информации о покрытии V8. Если вы предприимчивы, вы могли бы использовать git
для получения версии Node.js вы хотите использовать, применить коммиты из исправления и скомпилировать Node.js двоичный файл.
Если вы клонируете Node.js репозиторий, различные версии Node.js помечены. Таким образом, вы можете получить код для Node.js 12.19.0 путем проверки v12.19.0
тега.
Вы можете выбрать коммиты из запроса на извлечение обычным способом, или вы могли бы использовать curl -L https://github.com/nodejs/node/pull/33807.patch | git am
для применения коммитов в качестве исправлений.
Инструкции по компиляции / созданию Node.js двоичный файл можно найти по адресуhttps://github.com/nodejs/node/blob/master/BUILDING.md#building-nodejs-on-supported-platforms.
В более долгосрочной перспективе вы могли бы запросить запрос на извлечение о том, соответствует ли он вашим потребностям или нет, и, надеюсь, снова запустить его. Похоже, что это застопорилось.