インストール
必要な依存関係がすべて揃っていることを確認してください:
cargo add --dev litesvm litesvm-utils
litesvm-utilsとは?
litesvm-utils
クレートは、Solanaプログラムのテストを簡素化するための重要なヘルパートレイトとユーティリティを提供します。人間工学に基づいたAPIにより、30行以上にわたる一般的なテストの定型コードを最小限の読みやすいコードに削減します。
TestHelpers トレイト
- 1回のメソッド呼び出しで資金付きアカウントを作成
- token mintとtoken accountを簡単にセットアップ
- 定型コードなしでPDAを導出
- 時間ベースのテスト用にslotを管理
AssertionHelpers トレイト - アカウントの状態を検証(存在確認、クローズ確認、オーナー確認) - token残高とmint供給量を検証 - SOL残高を確認 - アカウントデータ長を検証
TransactionHelpers トレイト - 豊富な結果ハンドリングでinstructionsを実行 - トランザクションの成功または失敗をアサート - 特定のエラーコードを確認 - トランザクションログとコンピュートユニットを検査
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>> | 複数の資金付き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) | アカウントが存在しない場合にパニックする |
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> | 単一のinstructionsを送信する |
send_instructions(ixs, signers) | Result<TransactionResult, TransactionError> | 1つのトランザクションで複数のinstructionsを送信する |
send_transaction_result(tx) | Result<TransactionResult, TransactionError> | 生のTransactionを送信する |
トラブルシューティング
よくあるエラー
| エラー | 原因 | 解決策 |
|---|---|---|
AccountNotFound | 存在しないアカウントを使用しようとしている | まずcreate_funded_accountを使用してください |
InsufficientFunds | トランザクションのlamportが不足している | 初期資金額を増やしてください |
OwnerMismatch | アカウントが間違ったプログラムによって所有されている | 正しいプログラムIDを確認してください |
AssertionFailed | 残高または状態が期待値と一致しない | テストロジックを確認してください |
Is this page helpful?