Установка
Убедитесь, что у вас есть все необходимые зависимости:
cargo add --dev litesvm litesvm-utils
Что такое litesvm-utils?
Крейт litesvm-utils предоставляет основные вспомогательные трейты и утилиты,
которые упрощают тестирование программ Solana. Он сокращает типичный шаблонный
код для тестирования с 30+ строк до минимального, читаемого кода благодаря
эргономичному API.
Трейт TestHelpers
- Создание пополненных аккаунтов одним вызовом метода
- Простая настройка token мints и token accounts
- Получение PDA без шаблонного кода
- Управление slot-ами для тестирования на основе времени
Трейт AssertionHelpers — Проверка состояний аккаунтов (существует, закрыт, владелец) — Верификация балансов token account и объёмов выпуска mint — Проверка балансов SOL — Валидация длин данных аккаунта
Трейт TransactionHelpers — Выполнение инструкций с расширенной обработкой результатов — Проверка успешности или сбоя транзакции — Проверка конкретных кодов ошибок — Просмотр логов транзакций и вычислительных единиц
LiteSVMBuilder - Паттерн fluent builder для настройки тестового окружения - Деплой программ с помощью цепочки методов - Удобные статические фабричные методы
Быстрый пример
Вот полный пример, демонстрирующий возможности litesvm-utils:
use litesvm_utils::{AssertionHelpers, LiteSVM, Signer, TestHelpers, TransactionHelpers};use solana_sdk::{native_token::LAMPORTS_PER_SOL, system_instruction};#[test]fn test_with_utils() {let mut svm = LiteSVM::new();// Create funded accounts in one linelet alice = svm.create_funded_account(10 * LAMPORTS_PER_SOL).unwrap();let bob = svm.create_funded_account(0).unwrap();// Create a token mint easilylet mint = svm.create_token_mint(&alice, 9).unwrap();// Create associated token accounts (returns Pubkey)let alice_ata = svm.create_associated_token_account(&mint.pubkey(), &alice).unwrap();let bob_ata = svm.create_associated_token_account(&mint.pubkey(), &bob).unwrap();// Mint tokenssvm.mint_to(&mint.pubkey(), &alice_ata, &alice, 1000).unwrap();// Assert balancessvm.assert_token_balance(&alice_ata, 1000);svm.assert_token_balance(&bob_ata, 0);// Execute a SOL transfer with rich result handlinglet transfer_ix = system_instruction::transfer(&alice.pubkey(),&bob.pubkey(),LAMPORTS_PER_SOL,);let result = svm.send_instruction(transfer_ix, &[&alice]).unwrap();result.assert_success();// Verify the transfersvm.assert_sol_balance(&bob.pubkey(), LAMPORTS_PER_SOL);}
Ключевые преимущества
До litesvm-utils
// Creating a funded account manuallylet keypair = Keypair::new();let airdrop_tx = Transaction::new_signed_with_payer(&[system_instruction::transfer(&payer.pubkey(),&keypair.pubkey(),lamports,)],Some(&payer.pubkey()),&[&payer],svm.latest_blockhash(),);svm.send_transaction(airdrop_tx).unwrap();
После litesvm-utils
// One line to create a funded accountlet keypair = svm.create_funded_account(lamports).unwrap();
Обзор трейтов
TestHelpers
| Метод | Возвращает | Описание |
|---|---|---|
create_funded_account(lamports) | Result<Keypair> | Создаёт keypair и пополняет его баланс |
create_funded_accounts(count, lamports) | Result<Vec<Keypair>> | Создаёт несколько пополненных keypairs |
create_token_mint(authority, decimals) | Result<Keypair> | Создаёт минт SPL-токена |
create_token_account(mint, owner) | Result<Keypair> | Создаёт обычный token account |
create_associated_token_account(mint, owner) | Result<Pubkey> | Создаёт ATA, возвращает его адрес |
mint_to(mint, account, authority, amount) | Result<()> | Минтит токены на аккаунт |
derive_pda(seeds, program_id) | (Pubkey, u8) | Выводит PDA с bump seed |
get_pda(seeds, program_id) | Pubkey | Возвращает только адрес PDA |
get_pda_with_bump(seeds, program_id) | (Pubkey, u8) | Псевдоним для derive_pda |
get_current_slot() | u64 | Возвращает текущий slot |
advance_slot(slots) | () | Продвигает время на N слотов |
AssertionHelpers
| Метод | Описание |
|---|---|
assert_account_exists(pubkey) | Вызывает панику, если аккаунт не существует |
assert_account_closed(pubkey) | Вызывает панику, если аккаунт существует и содержит данные/лампорты |
assert_token_balance(account, amount) | Проверяет баланс токенов |
assert_sol_balance(pubkey, lamports) | Проверяет баланс SOL |
assert_mint_supply(mint, supply) | Проверяет общее предложение минта |
assert_account_owner(pubkey, owner) | Проверяет владельца аккаунта |
assert_account_data_len(pubkey, len) | Проверяет длину данных |
TransactionHelpers
| Метод | Возвращает | Описание |
|---|---|---|
send_instruction(ix, signers) | Result<TransactionResult, TransactionError> | Отправляет одну инструкцию |
send_instructions(ixs, signers) | Result<TransactionResult, TransactionError> | Отправляет несколько инструкций в одной транзакции |
send_transaction_result(tx) | Result<TransactionResult, TransactionError> | Отправляет сырой Transaction |
Устранение неполадок
Распространённые ошибки
| Ошибка | Причина | Решение |
|---|---|---|
AccountNotFound | Попытка использовать аккаунт, который не существует | Сначала используйте create_funded_account |
InsufficientFunds | Недостаточно lamports для транзакции | Увеличьте начальную сумму финансирования |
OwnerMismatch | Аккаунт принадлежит неверной программе | Проверьте правильность идентификатора программы |
AssertionFailed | Баланс или состояние не соответствует ожидаемому | Проверьте логику вашего теста |
Is this page helpful?