Тестирование на основе свойств — это мощный метод, который помогает разработчикам находить ошибки в коде, создавая и тестируя большое количество тестовых случаев на основе свойств, которым должен удовлетворять код. В этом посте мы рассмотрим, как использовать тестирование на основе свойств в Solidity, как определить свойства и некоторые рекомендации по его реализации.

Что такое тестирование на основе свойств?

Тестирование на основе свойств — это методология тестирования, при которой тесты генерируются автоматически на основе набора свойств, которым должен удовлетворять код. Эти свойства определяются как логические утверждения о том, что код всегда должен быть истинным. Проверяя эти свойства на большом количестве случайно сгенерированных входных данных, разработчики могут выявлять потенциальные пограничные случаи и ошибки, которые они, возможно, не учитывали в своих традиционных модульных тестах.

Как использовать тестирование на основе свойств в Solidity

Чтобы использовать тестирование на основе свойств в Solidity, разработчики могут использовать среду тестирования, такую ​​как Solidity QuickCheck или Hypothesis Solidity. Эти платформы позволяют разработчикам определять свойства, которым должен удовлетворять код, а затем генерировать и тестировать множество входных данных на соответствие этим свойствам.

Давайте посмотрим на пример. Предположим, у нас есть простой контракт, который принимает массив целых чисел и возвращает сумму этих целых чисел. Наш договор может выглядеть примерно так:

contract MyContract {
    function sum(uint[] memory nums) public returns (uint) {
        uint total = 0;
        for (uint i = 0; i < nums.length; i++) {
            total += nums[i];
        }
        return total;
    }
}

Чтобы использовать тестирование на основе свойств, мы могли бы определить такое свойство, как «сумма входного массива должна быть равна сумме первой половины массива плюс сумма второй половины массива». Затем мы можем использовать тестовую среду для генерации и проверки многих входных данных для этого свойства:

import "solidity_quickcheck/contracts/QuickCheck.sol";
contract MyContractTest {
    using QuickCheck for uint[];
    function testSum() public {
        uint[] memory nums = new uint[](4);
        nums.quickfill(100);
        uint total = MyContract.sum(nums);
        assert(total == nums.quicktake(nums.length/2).quicksum() + nums.quickdrop(nums.length/2).quicksum());
    }
}

В этом примере мы используем Solidity QuickCheck для создания массива из 4 целых чисел, заполняем его значением 100, а затем проверяем, что сумма массива равна сумме первой половины массива плюс сумма вторая половина массива.

Платформы тестирования для тестирования на основе свойств в Solidity

Существует две основные среды тестирования, которые разработчики могут использовать для тестирования на основе свойств в Solidity: Solidity QuickCheck и Hypothesis Solidity.

1- Быстрая проверка прочности

Solidity QuickCheck — это библиотека для тестирования свойств в Solidity. Это позволяет разработчикам определять свойства и генерировать случайные тестовые входные данные для проверки этих свойств. Solidity QuickCheck предоставляет набор вспомогательных функций для генерации случайных значений Solidity, таких как целые числа, байты и адреса. Вот пример того, как использовать Solidity QuickCheck для тестирования простого контракта, который проверяет, является ли целое число четным:

import "solidity_quickcheck/contracts/QuickCheck.sol";
contract EvenTest {
    using QuickCheck for uint;
    function testIsEven() public {
        bool result = MyContract.isEven(42);
        assert(result == true);
        result = MyContract.isEven(43);
        assert(result == false);
        QuickCheck.forAllUint(function(uint num) {
            bool r = MyContract.isEven(num);
            assert(r == (num % 2 == 0));
        });
    }
}

2- Надежность гипотезы

Hypothesis Solidity — еще одна библиотека для тестирования на основе свойств в Solidity. Он основан на популярной библиотеке Hypothesis для Python и предоставляет простой интерфейс для определения свойств и создания тестовых входных данных. Гипотеза Solidity предоставляет набор стратегий для генерации случайных значений Solidity, таких как целые числа, адреса и байты.

Вот пример того, как использовать Hypothesis Solidity для тестирования простого контракта, который проверяет, действителен ли адрес:

import "hypothesis-solidity/contracts/Hypothesis.sol";
contract AddressTest {
    function testIsValidAddress() public {
        bool result = MyContract.isValidAddress(0x123);
        assert(result == false);
        result = MyContract.isValidAddress(0x0000000000000000000000000000000000000000);
        assert(result == false);
        Hypothesis.given(Hypothesis.addresses())
            .then(function(address addr) {
                bool r = MyContract.isValidAddress(addr);
                assert(r == (addr != address(0)));
            })
            .validate();
    }
}

В этом примере мы используем Hypothesis Solidity для генерации случайных адресов и проверки того, что контракт правильно идентифицирует их как действительные или недействительные.

Заключительные слова

Тестирование на основе свойств — это мощный метод, который может помочь разработчикам найти ошибки в коде Solidity. Создавая и тестируя большое количество тестовых входных данных на основе свойств, которым должен удовлетворять код, разработчики могут выявлять потенциальные пограничные случаи и ошибки, которые они, возможно, не учитывали в своих традиционных модульных тестах. Solidity QuickCheck и Hypothesis Solidity — отличные варианты для разработчиков, которые хотят приступить к тестированию на основе свойств, а соблюдение рекомендаций поможет обеспечить эффективность и надежность ваших тестов.

Если вы нашли эту статью информативной и полезной, подпишитесь на меня, чтобы получать больше материалов, связанных с блокчейном и криптовалютой. Вы также можете подписаться на мою рассылку, чтобы получать новости о моих последних статьях и проектах.

Новичок в трейдинге? Попробуйте криптотрейдинговые боты или копи-трейдинг на лучших криптобиржах

Присоединяйтесь к Coinmonks Telegram Channel и Youtube Channel и получайте ежедневные Крипто новости

Также читайте