Cài Đặt
Hãy đảm bảo bạn đã có đầy đủ các dependency cần thiết:
cargo add --dev litesvm litesvm-utils
litesvm-utils là gì?
Crate litesvm-utils cung cấp các trait trợ giúp và tiện ích thiết yếu giúp đơn
giản hóa việc kiểm thử chương trình Solana. Nó giảm thiểu boilerplate kiểm thử
phổ biến từ hơn 30 dòng xuống còn mã tối giản, dễ đọc thông qua các API tiện
dụng.
Trait TestHelpers
- Tạo tài khoản được nạp tiền chỉ với một lần gọi phương thức
- Thiết lập token mint và token account dễ dàng
- Derive PDA mà không cần boilerplate
- Quản lý slot cho kiểm thử dựa trên thời gian
Trait AssertionHelpers - Kiểm tra trạng thái tài khoản (tồn tại, đã đóng, chủ sở hữu) - Xác minh số dư token và nguồn cung mint - Kiểm tra số dư SOL - Xác thực độ dài dữ liệu tài khoản
Trait TransactionHelpers - Thực thi các lệnh với xử lý kết quả phong phú - Kiểm tra thành công hoặc thất bại của giao dịch - Kiểm tra mã lỗi cụ thể - Kiểm tra log giao dịch và đơn vị tính toán
LiteSVMBuilder
- Mẫu builder linh hoạt để thiết lập môi trường kiểm thử
- Triển khai chương trình bằng method chaining
- Các phương thức factory tĩnh tiện lợi
Ví Dụ Nhanh
Đây là một ví dụ hoàn chỉnh thể hiện sức mạnh của 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);}
Lợi Ích Chính
Trước khi dùng 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();
Sau khi dùng litesvm-utils
// One line to create a funded accountlet keypair = svm.create_funded_account(lamports).unwrap();
Tổng Quan về Trait
TestHelpers
| Phương thức | Trả về | Mô tả |
|---|---|---|
create_funded_account(lamports) | Result<Keypair> | Tạo một keypair và nạp tiền vào |
create_funded_accounts(count, lamports) | Result<Vec<Keypair>> | Tạo nhiều keypair đã được nạp tiền |
create_token_mint(authority, decimals) | Result<Keypair> | Tạo một SPL token mint |
create_token_account(mint, owner) | Result<Keypair> | Tạo một token account thông thường |
create_associated_token_account(mint, owner) | Result<Pubkey> | Tạo một ATA, trả về địa chỉ của nó |
mint_to(mint, account, authority, amount) | Result<()> | Mint token vào một tài khoản |
derive_pda(seeds, program_id) | (Pubkey, u8) | Dẫn xuất một PDA với bump seed |
get_pda(seeds, program_id) | Pubkey | Chỉ lấy địa chỉ PDA |
get_pda_with_bump(seeds, program_id) | (Pubkey, u8) | Bí danh cho derive_pda |
get_current_slot() | u64 | Trả về slot hiện tại |
advance_slot(slots) | () | Tiến thêm N slot |
AssertionHelpers
| Phương thức | Mô tả |
|---|---|
assert_account_exists(pubkey) | Báo lỗi nếu tài khoản không tồn tại |
assert_account_closed(pubkey) | Báo lỗi nếu tài khoản tồn tại và có dữ liệu/lamports |
assert_token_balance(account, amount) | Xác minh số dư token |
assert_sol_balance(pubkey, lamports) | Xác minh số dư SOL |
assert_mint_supply(mint, supply) | Xác minh tổng cung của mint |
assert_account_owner(pubkey, owner) | Xác minh chủ sở hữu tài khoản |
assert_account_data_len(pubkey, len) | Xác minh độ dài dữ liệu |
TransactionHelpers
| Phương thức | Trả về | Mô tả |
|---|---|---|
send_instruction(ix, signers) | Result<TransactionResult, TransactionError> | Gửi một lệnh đơn lẻ |
send_instructions(ixs, signers) | Result<TransactionResult, TransactionError> | Gửi nhiều lệnh trong một giao dịch |
send_transaction_result(tx) | Result<TransactionResult, TransactionError> | Gửi một Transaction thô |
Khắc phục sự cố
Các lỗi thường gặp
| Lỗi | Nguyên nhân | Giải pháp |
|---|---|---|
AccountNotFound | Cố sử dụng tài khoản không tồn tại | Dùng create_funded_account trước |
InsufficientFunds | Không đủ lamports cho giao dịch | Tăng số tiền nạp ban đầu |
OwnerMismatch | Tài khoản thuộc sở hữu của chương trình sai | Xác minh đúng program ID |
AssertionFailed | Số dư hoặc trạng thái không khớp với kỳ vọng | Kiểm tra logic kiểm thử của bạn |
Is this page helpful?