Solana 文档LiteSVMRust附加模块litesvm-utils

快速入门

安装

请确保已安装所有必要的依赖项:

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 line
let alice = svm.create_funded_account(10 * LAMPORTS_PER_SOL).unwrap();
let bob = svm.create_funded_account(0).unwrap();
// Create a token mint easily
let 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 tokens
svm.mint_to(&mint.pubkey(), &alice_ata, &alice, 1000).unwrap();
// Assert balances
svm.assert_token_balance(&alice_ata, 1000);
svm.assert_token_balance(&bob_ata, 0);
// Execute a SOL transfer with rich result handling
let 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 transfer
svm.assert_sol_balance(&bob.pubkey(), LAMPORTS_PER_SOL);
}

主要优势

使用 litesvm-utils 之前

// Creating a funded account manually
let 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 account
let 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?

Table of Contents

Edit Page
©️ 2026 Solana 基金会版权所有