安装
请确保已安装所有必要的依赖项:
cargo add --dev litesvm litesvm-utils
什么是 litesvm-utils?
litesvm-utils
crate 提供了必要的辅助 trait 和工具,可简化 Solana 程序测试。它通过符合人体工学的 API,将常见的测试样板代码从 30 余行精简为简洁易读的代码。
TestHelpers Trait
- 通过单个方法调用创建已注资账户
- 轻松设置代币铸造账户和 token account
- 无需样板代码即可派生 PDA
- 管理 slot 以支持基于时间的测试
AssertionHelpers Trait - 断言账户状态(存在、已关闭、所有者)- 验证代币余额和铸造供应量 - 检查 SOL 余额 - 验证 账户数据长度
TransactionHelpers Trait - 执行指令并获取丰富的结果处理 - 断言交易成功或失败 - 检查特定错误码 - 查看交易日志和计算单元
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();
Trait 概览
TestHelpers
| 方法 | 返回值 | 描述 |
|---|---|---|
create_funded_account(lamports) | Result<Keypair> | 创建一个 keypair 并为其充值 |
create_funded_accounts(count, lamports) | Result<Vec<Keypair>> | 创建多个已充值的 keypair |
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) | 使用 bump seed 派生 PDA |
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) | 若账户不存在则触发 panic |
assert_account_closed(pubkey) | 若账户存在且含有数据/lamports 则触发 panic |
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 | 交易所需的 lamport 不足 | 增加初始资金金额 |
OwnerMismatch | 账户归属于错误的程序 | 验证正确的程序 ID |
AssertionFailed | 余额或状态与预期不符 | 检查您的测试逻辑 |
Is this page helpful?