Foundry с 0. Часть 9
На следующей неделе мы понемногу начнем разбирать уже практическую часть написания тестов на Foundry. А перед этим нужно рассказать, какие тесты вообще можно делать для своего проекта.
1. Unit тест
Самый простой вид тестирования. По сути, мы проверяем, что функция выполняет свою роль и выдает результат, который должен считаться валидным.
2. Fuzz тест
Немного сложно перевести основную идею этого вида тестирования, поэтому его чаще всего и называют фаззинг. Это такой вид тестов, когда сам Foundry подставляет аргументы в тестируемую функцию и пытается найти такие, которые могут сломать ее.
Грубый пример, у нас есть функция перевода, которая допускает значения меньше uint112. И вот мы, как бы говорим, Foundry найди такие значения, чтобы функция откатилась. Он в аргументы подставляет разные значения от uint4 до uint256 и выдает результат.
Если сейчас не понятно, то с практикой вы лучше осознаете всю ее пользу.
3. Invariant тесты
Сравнительно недавнее веяние в мире тестов. Активно его стали развивать только в последние полгода.
Инварианты - это такие значение, которые всегда должны быть "правильными"... Я сам долго пытался понять это, но объяснить лучше на примере.
Вот вы запустили свой токен. И вот его totalSupply никогда не должен быть больше общего количества токенов у пользователей. Или, что количество токенов на вывод не должно превышать количество токенов при депозите.
Такие параметры сложно проверить из-за того, что при первых двух видах тестов состояния блокчейна обнуляется каждый раз, а в данном случае оно должно "запоминаться" на изменения. Подробнее об этом в постах с соответствующей темой.
4. Differential тесты
Более сложные по своей основе тесты, которые иногда еще называют differential fuzzing.
Это такой метод тестирования, который включает в себя исполнение различных реализаций одной и той же функции или логики, с последующим сравнение их результатов.
Я сам не писал еще такие тесты, поэтому будем позже разбираться с ними вместе.
5. Fork тесты
Это тесты ваших контрактов на "скопированном" участке реальной сети блокчейна. Такое тестирование бывает полезно, когда вы хотите узнать, будет ли ваш код работать на различных версиях EVM.
6. Дебаггинг
Возможно, не совсем тестирование, но это мощный инструмент для работы со смарт контрактами и отслеживании путей работы ваших функций. Уверен, что каждый хороший разработчик на одном из этапов своего обучения задавался целью как можно лучше освоить эту тему.
В рамках каждого вида тестов мы можем проверять различные условия в коде (if/else, require), математические операции, порождение событий и вообще практически все, что захотим.
В помощь этому был создан прекрасный инструмент forge coverage, который показывает участки кода требующие проведения тестирования и само покрытие тестами всего контракта.
Со следующей неделе мы начнем разбирать практическую часть написание тестов. А впереди у нас еще много работы!
#foundry #lesson9
Post #916
746
- 👍 7