Встановлення
Переконайтеся, що у вас є всі необхідні залежності:
cargo add --dev litesvm litesvm-utils
Що таке litesvm-utils?
Крейт litesvm-utils надає основні допоміжні трейти та утиліти, які спрощують
тестування програм Solana. Він скорочує типовий шаблонний код тестування з 30+
рядків до мінімального, зручного для читання коду завдяки ергономічному API.
Трейт TestHelpers
- Створення фінансованих акаунтів одним викликом методу
- Легке налаштування token mints та token account
- Отримання PDA без шаблонного коду
- Керування slot для тестування, залежного від часу
Трейт AssertionHelpers — Перевірка стану акаунтів (існує, закрито, власник) — Верифікація балансів token account та запасів mint — Перевірка балансів SOL — Валідація довжин даних акаунтів
Трейт TransactionHelpers — Виконання інструкцій із розширеною обробкою результатів — Підтвердження успіху або невдачі транзакції — Перевірка конкретних кодів помилок — Перегляд логів транзакцій та обчислювальних одиниць
LiteSVMBuilder
- Гнучкий патерн будівника для налаштування тестового середовища
- Розгортання програм із ланцюжком методів
- Зручні статичні фабричні методи
Швидкий приклад
Ось повний приклад, що демонструє можливості 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 токен mint |
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 slot |
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) | Перевіряє загальну емісію mint |
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> | Надсилає кілька інструкцій в одній tx |
send_transaction_result(tx) | Result<TransactionResult, TransactionError> | Надсилає сирий Transaction |
Усунення несправностей
Поширені помилки
| Помилка | Причина | Рішення |
|---|---|---|
AccountNotFound | Спроба використати акаунт, який не існує | Спочатку використайте create_funded_account |
InsufficientFunds | Недостатньо lamports для транзакції | Збільшіть початкову суму поповнення |
OwnerMismatch | Акаунт належить неправильній програмі | Перевірте правильність ID програми |
AssertionFailed | Баланс або стан не відповідає очікуваному | Перевірте логіку вашого тесту |
Is this page helpful?