Пару слов, думаю, стоит сказать о том, как работать с отчетами по газу и покрытия тестами. Начнем со второго.
Что мне нравилось в Hardhat, так это то, что отчеты там можно было генерировать в формате html сразу, без дополнительных "плясок с баяном". В Foundry дело обстоит несколько сложнее, особенно для пользователей Windows.
Вообще, для того, чтобы посмотреть отчет о покрытии кода тестами, нужно выполнить простую команду:
forge coverage
В терминале прогонятся все созданные тесты и по итогу появится небольшая таблица, где будет показано покрытие кода в процентном соотношении. Сама таблица состоит из 4 колонок: lines, statements, branches, funcs: которые отвечают за покрытие тестами строк, условий, утверждений и функций.
Да, как вы можете понять, что покрытие 100% функций вовсе не означает, что покрытие всего контракта будет равняется 100%. В самих функция бывает еще много чего для проверки.
Также есть команда:
forge coverage --report debug
которая выведет списком в терминале протестированные и нет пункты.
Ну, и последняя команда:
forge coverage --report lcov
которая сформирует отчет в формате файла .info, и вот тут начинаются "танцы".
С помощью этого файла можно было бы сформировать удобный отчет в формате html (простой веб страницы), как это делается в Hardhat, но есть некоторые проблемы...
В сети я нашел рекомендации формировать такой отчет с помощью программы genhtml. Делается это также в терминале командой:
https://linux.die.net/man/1/lcov
genhtml -o report --branch-coverage
или другими, которые можно посмотреть тут:
https://manpages.ubuntu.com/manpages/xenial/man1/genhtml.1.html
Однако эта прога работает только с системами Linux и на Windows не ставится. По крайней мере, сделать у меня это без напряга не получилось.
Другие программы или даже плаггины в самом VScode работают крайне криво, и я не могу порекомендовать какую-либо из них.
P.S. Если вы знаете что-то, что поможет конвертировать файлы из lcov в html без потери данных, прошу написать в комментариях.
Тем не менее, хочу рассказать о другом плагине, который помогает просматривать покрытие тестами прямо в контракте - Coverage Gutters (у меня от ryanluker).
После его установки и генерации lcov.info с forge, вы можете зайти в Command Palette (ctrl+shift+p), не уверен, как это переводится на русский, и выбрать Display Coverage (ctrl+shift+7). Код в контракте выделится красными, желтыми и зелеными полосками, которые как раз и обозначают места, требующие вашего внимания.
В принципе, достаточно удобно просматривать код и понимать, что еще нужно протестировать.
Единственный момент, о котором редко говорят в теме тестов, это то, что покрытие кода на 100% не значит, что он безопасный на 100% и функции выполняют задумку разработчиков.
Есть еще логические баги и уязвимости, которые необходимо проверять отдельными тестами - сценариями использования протокола. Об этом мы будем говорить чуть позже.
Так же существует отчет по газу, который можно получить командой:
forge test --gas-report
Он показывает расход газа на ту или иную функцию, а также количество вызовов этой функции в контракте.
С помощью этого отчеты вы можете отслеживать свои модификации кода и применение различных паттерном снижения использования газа в своем случае.
Вместе с этим вы можете скачать для себя популярный анализатор кода - 4naly3er.
С помощью него можно быстро сканировать код на предмет популярных недочетов в коде, исправив которые вы сэкономите немного газа и даже сможете найти мелкие недочеты в своем коде.
В общем, полезная штука, которая используется на конкурсной площадке code4rena и на основе которой создаются более мощные программы для анализа кода.
#foundry #lesson17