Тесты с Foundry. Часть 5
Еще одна классная штука, которая есть в Foundry и нет в hardhat или remix, это проведение fuzz тестов.
Fuzz тесты - это такие операции с функциями, когда в ее параметры подставляют разные случайные значения и пытаются сломать выполнение.
Ранее для подобных тестов использовались сторонние сервисы, типа Echidna от Trail of Bits. Это, конечно, очень крутая программа, но если вам нужно сделать простые тесты, то Foundry подойдет, как нельзя кстати.
Возьмем к примеру такую функцию:
function testWithdraw() public {
payable(address(safe)).transfer(1 ether);
uint256 preBalance = address(this).balance;
safe.withdraw();
uint256 postBalance = address(this).balance;
assertEq(preBalance + 1 ether, postBalance);
}
Если мы переводим 1-2 Эфира, то все ок. А если кто-то захочет сломать функцию и перевести другие суммы?
И вот как она будет выглядеть в fuzz тестах:
function testWithdraw(uint256 amount) public {
payable(address(safe)).transfer(amount);
uint256 preBalance = address(this).balance;
safe.withdraw();
uint256 postBalance = address(this).balance;
assertEq(preBalance + amount, postBalance);
}
Т.е. мы разрешаем Foundry вставлять в параметры функции свои значения под uint amount и проверять исполнение.
Если прогнать этот тест, то мы увидим, что он провалится, так как на одном из шагов будет предложено значение 2**96 wei, что вызовет overflow.
В документации сказано, что так можно проверять и другие типы данных: строки и булево значения. Но чаще всего используют именно для чисел.
Также в тестах можно определять границы подставляемых значений с помощью команды vm.assume(), например, для нашего случая:
vm.assume(amount > 0.1 ether);
Сами тесты прогоняются 256 раз по умолчанию. Другими словами, программа попробует подставить 256 различных значений и проверить их.
Мы можем изменить этот параметр в файле конфигурации, добавив строку:
fuzz_runs = 10000 (количество тестов)
Подобные тесты очень помогают для проверки расчетов и транзакций в наших функциях, так как мы никогда не сможем предугадать, кто и как будет использовать наш контракт.
В общем, Foundry сильно облегчает нам работу!
#foundry
Post #575
249
- 👍 3