Sei Network
  • Введение
    • Обзор
    • Разработка концепции Sei
    • Оптимизация DEX
    • Децентрализованный NASDAQ
    • Экосистема Sei
  • Смарт контракты и разработка
    • Обзор инструментов Sei
    • Установка локальной версии ноды
    • Скрипт локального развертывания Sei
    • Sei.go
    • Тестирование контрактов CosmWasm
    • Развертывание универсального контракта
    • Развертывание обменного контракта
    • Развертывание и разработка без использования полной ноды
    • Инструкция по модулю Dex
    • Руководство по модулю Tokenfactory
    • IBC трансферы
  • Сопоставление ордеров
    • Параллелизм
    • Параметры допуска контракта
    • Зависимости внутри контрактов
    • Хранилище с белым списком
  • Ноды и валидаторы
    • Присоединиться к тестнету
    • Обновления
    • Стимулирующий тестнет Seiнами
      • Присоединиться к стимулирующему тестнету
      • Все миссии тестнета
      • Код чести
      • Распределение наград
    • Основные эндпоинты API
    • Эндпоинты модулей
    • Синхронизация состояния
    • Операции восстановления
  • Управление
    • Создание предложений
    • Управление стейкингом
    • Голосование по предложению
  • Оракул
    • Участие в работе Оракула
  • Фронтенд разработка
    • Руководство по JavaScript
    • Пакеты NPM
  • Кошельки
    • Интеграция кошельков
    • Переводы
Powered by GitBook
On this page
  • Тестирование модуля
  • Интеграционный тест
  • Сквозное тестирование в блокчейне Sei
  1. Смарт контракты и разработка

Тестирование контрактов CosmWasm

PreviousSei.goNextРазвертывание универсального контракта

Last updated 2 years ago

Тестирование модуля

Для проведения теста добавьте строчку:

#[cfg(test)]
mod tests { ...
}

Для запуска теста необходимо набрать команду:

cargo test 

Справочник по Cosmwasm

Пример простого контракта и его тестирования

Интеграционный тест

Пакет cw-multi-test позволяет проводить интеграционные тесты ()

Необходимо выполнить следующие шаги:

1) Инициировать тестовую установку пакета. Ниже мы приводим пример с использованием instantiate_contract()и дальнейшей работой с execute_contract() соответственно:

fn setup_test(
    app: &mut App<
        BankKeeper,
        MockApi,
        MockStorage,
        SeiModule,
        WasmKeeper<SeiMsg, SeiQueryWrapper>,
        FailingStaking,
        FailingDistribution,
    >,
) -> (Addr, Addr) {
    let example_contract_code = app.store_code(Box::new(
        ContractWrapper::new(
            example_crate::contract::execute,
            example_crate::contract::instantiate,
            example_crate::contract::query,
        )
        .with_reply(example_crate::contract::reply),
    ));

    let example_contract_addr = app
        .instantiate_contract(
            example_contract_code,
            Addr::unchecked(ADMIN),
            &example_crate::msg::InstantiateMsg {
                example_param: Uint64::new(100),
            },
            &[],
            "example",
            Some(ADMIN.to_string()),
        )
        .unwrap();

    app.execute_contract(
        Addr::unchecked(ADMIN),
        example_contract_addr.clone(),
        &ExampleExecuteMsg::ExampleCall {
            asset_denom: "usei".to_string(),
        },
        &[],
    )
    .unwrap();

    example_contract_addr
}

2) Провести интеграционный тест:

#[test]
fn test_example_contract() {
    let mut app = mock_app(init_default_balances);
    let example_contract_addr = setup_test(&mut app);
    
    app.execute_contract(
        Addr::unchecked("admin"),
        example_contract_addr.clone(),
        &ExampleExecuteMsg::ExampleCall {
            underlying_asset: "usei".to_string(),
            param_1: Decimal::new(Uint128::new(10_000))
        },
        &[Coin {
            denom: "usei".to_string(),
            amount: Uint128::new(10_000),
        }],
    )
    .unwrap();
    
    ... // Do other logic 
    
 
    // Assert that correct amount is refunded to `bob`
    let res: BalanceResponse = get_balance(&app, "bob".to_string(), "usei".to_string());
    assert_eq!(res.amount.amount, Uint128::new(10_000_000));
    assert_eq!(res.amount.denom, "usei");
    
    ... // Other checks include calling query_wasm_smart() on a given contract  

    // Query some object no longer exists
    let example_obj: Result<ExampleObj, StdError> = app.wrap().query_wasm_smart(
        example_contract_addr.clone(),
        &QueryMsg::GetExampleObj { obj_id: 0 },
    );

    let error = example_obj.err().unwrap();
    assert_eq!(
        error.to_string(),
        StdError::generic_err("Querier contract error: object not found")
            .to_string()
    );
}

Сквозное тестирование в блокчейне Sei

Для проведения сквозного тестирования вам необходимо вновь выполнить следующие шаги:

Для получения отладочной информации, такой как ошибочный ордер, вы можете использовать набор инструментов на стороне ПО по созданию контракта. Компилятор Rust может выводить ошибки во время компиляции. Также для любой структуры, для которой реализована функция отладки, можно использовать println! Наконец, вы можете добавить логи в deps.api.debug(err).

Ссылка на документацию Cosmwasm

1) запустите блокчейн на локальной машине или в сети разработчиков (devnet)

2) задеплойте свой контракт

Пример контракта, который может быть использован для локального тестирования можно посмотреть здесь

https://docs.cosmwasm.com/tutorials/simple-option/testing/
https://github.com/InterWasm/cw-contracts/blob/main/contracts/simple-option/src/contract.rs
https://docs.rs/cw-multi-test/latest/cw_multi_test/
https://docs.cosmwasm.com/docs/1.0/smart-contracts/testing/
https://docs.seinetwork.io/smart-contracts-and-local-development/set-up-a-local-network
https://docs.seinetwork.io/smart-contracts-and-local-development/deploy-a-generic-contract
https://github.com/sei-protocol/sei-cosmwasm