Думал тему из этого поста постепенно поднимать в нескольких других, но понял, что лучше основную идею изложить сейчас, а потом уже дополнять при необходимости.
А поговорим мы о работе с консолью: вызовом тестов и логированием из них.
Из предыдущих постов мы узнали, для того чтобы вызвать процесс тестирования нашего контракта, достаточно в консоли прописать:
forge test
или
forge test -vv
и других "-v..." для более подробной информации.
Тем не менее, порой, когда тестовых контрактов и самих тестов очень много, нам нужно вызвать что-то конкретное, и ждать выполнения всех тестов из всех контрактов может стоит нам времени.
Для этого существуют удобные дополнения к команде test:
1. forge test --match-test testName
Выполним конкретный тест из контрактов.
2. forge test --match-contract contractName
Выполним все тесты из конкретного контракта.
3. forge test --match-path Path
Выполнить тесты по указанному пути.
Так же мы может исключить какой-нибудь контракт или тест из процесса тестирования с помощью опций:
--no-match-test
--no-match-contract
--no-match-path
Более того, с помощью таких опций-хелперов мы можем подключать optimizer и указывать количество проходов:
--optimize
--optimizer-runs
--via-ir
Или указать EVM версию для наших тестов:
--evm-version
Как вы, надеюсь, поняли, перед опцией должно быть forge test, а после указание на файл / тест / версию и так далее.
Но, что самое интересное, эти команды можно комбинировать для точечных тестов, например:
forge test --match-contract myContract --match-test myTest --evm-version london
Также есть еще другие опции для тестов на форках, отслеживание газа и дебаггинг, но о них мы будем говорить уже в своих постах.
Все опции для тестов можно посмотреть тут:
https://book.getfoundry.sh/reference/forge/forge-test
Теперь пара слов о логировании в тестах.
Порой нам нужно будет выводить значения из наших тестов, чтобы узнать, кто был вызывающим функции, изменение баланса или результат деления. Для этого мы можем просто написать:
console.log(param);
Однако, если таких вызовов много в ходе выполнения теста, то можно очень просто потеряться в них. Поэтому предлагаю вам пару способов для удобного вывода информации.
1. Подписывать логи:
console.log("This is owner: ", contract.owner());Будет так:
Logs:
This is owner: 0x00c7bF7d9E7D071Df3B53dEec96cD4bf0f6c0220
2. Разделять по строкам:
console.log("This is owner");
console.log(contract.owner());Будет так:
Logs:
This is owner
0x00c7bF7d9E7D071Df3B53dEec96cD4bf0f6c0220
3. Выделять дефисами:
console.log("This is owner ----------- ", contract.owner());Будет так:
Logs:
This is owner ---------- 0x00c7bF7d9E7D071Df3B53dEec96cD4bf0f6c0220
4. Оставлять пробелы, используя пустые логи:
console.log(" ");
5. Выделять разным цветом.
Для этого потребуется в импорте тестов добавить библиотеку StdStyle:
import {Test, console, StdStyle} from "forge-std/Test.sol";
После этого можно применять цвета к логам:
console.log("Owner: ", StdStyle.yellow(counter.owner()));Стилей достаточно много: красный, зеленый, желтый, синий, мажента, голубой, жирный, приглушенный, курсив, зачеркнутый и обычный.
Попробуйте сами, так наглядность логов в ваших тестах станет еще лучше!
#foundry #lesson16