发送交易
TransactionHelpers trait 提供了便捷的方法,用于发送指令并分析结果。
发送单条指令
use litesvm_utils::{LiteSVM, Signer, TestHelpers, TransactionHelpers};use solana_sdk::{native_token::LAMPORTS_PER_SOL, system_instruction};#[test]fn test_send_instruction() {let mut svm = LiteSVM::new();let alice = svm.create_funded_account(10 * LAMPORTS_PER_SOL).unwrap();let bob = svm.create_funded_account(0).unwrap();// Create a transfer instructionlet transfer_ix = system_instruction::transfer(&alice.pubkey(),&bob.pubkey(),LAMPORTS_PER_SOL,);// Send and get result (returns Result<TransactionResult, TransactionError>)let result = svm.send_instruction(transfer_ix, &[&alice]).unwrap();// Assert it succeededresult.assert_success();}
发送多条指令
use litesvm_utils::{LiteSVM, Signer, TestHelpers, TransactionHelpers};use solana_sdk::{native_token::LAMPORTS_PER_SOL, system_instruction};#[test]fn test_send_multiple_instructions() {let mut svm = LiteSVM::new();let alice = svm.create_funded_account(10 * LAMPORTS_PER_SOL).unwrap();let bob = svm.create_funded_account(0).unwrap();let carol = svm.create_funded_account(0).unwrap();// Create multiple transfer instructionslet instructions = vec![system_instruction::transfer(&alice.pubkey(), &bob.pubkey(), LAMPORTS_PER_SOL),system_instruction::transfer(&alice.pubkey(), &carol.pubkey(), LAMPORTS_PER_SOL),];// Send all in one transactionlet result = svm.send_instructions(&instructions, &[&alice]).unwrap();result.assert_success();}
TransactionResult
send_instruction 和 send_instructions 方法返回一个
TransactionResult,它将交易元数据与实用的测试工具封装在一起。
断言成功
use litesvm_utils::{LiteSVM, Signer, TestHelpers, TransactionHelpers};use solana_sdk::{native_token::LAMPORTS_PER_SOL, system_instruction};#[test]fn test_assert_success() {let mut svm = LiteSVM::new();let alice = svm.create_funded_account(10 * LAMPORTS_PER_SOL).unwrap();let bob = svm.create_funded_account(0).unwrap();let ix = system_instruction::transfer(&alice.pubkey(), &bob.pubkey(), LAMPORTS_PER_SOL);let result = svm.send_instruction(ix, &[&alice]).unwrap();// Panics with detailed logs if the transaction failedresult.assert_success();}
如果交易失败,assert_success() 将会连同完整的交易日志一起
panic,从而大大简化调试过程。
断言失败
use litesvm_utils::{LiteSVM, Signer, TestHelpers, TransactionHelpers};use solana_sdk::{native_token::LAMPORTS_PER_SOL, system_instruction};#[test]fn test_assert_failure() {let mut svm = LiteSVM::new();let alice = svm.create_funded_account(1 * LAMPORTS_PER_SOL).unwrap();let bob = svm.create_funded_account(0).unwrap();// Try to transfer more than Alice haslet ix = system_instruction::transfer(&alice.pubkey(),&bob.pubkey(),100 * LAMPORTS_PER_SOL, // Alice only has 1 SOL);let result = svm.send_instruction(ix, &[&alice]).unwrap();// This should failresult.assert_failure();}
断言特定错误
use litesvm_utils::{LiteSVM, Signer, TestHelpers, TransactionHelpers};use solana_sdk::{native_token::LAMPORTS_PER_SOL, system_instruction};#[test]fn test_assert_error() {let mut svm = LiteSVM::new();let alice = svm.create_funded_account(1 * LAMPORTS_PER_SOL).unwrap();let bob = svm.create_funded_account(0).unwrap();let ix = system_instruction::transfer(&alice.pubkey(),&bob.pubkey(),100 * LAMPORTS_PER_SOL,);let result = svm.send_instruction(ix, &[&alice]).unwrap();// Assert a specific error message is presentresult.assert_error("insufficient lamports");}
断言错误代码
对于自定义程序错误,您可以对错误代码进行断言:
// Assert a specific custom error coderesult.assert_error_code(6000); // Custom error code from your program
断言 Anchor 错误
对于 Anchor 程序,可通过错误名称进行断言:
// Assert an Anchor-specific errorresult.assert_anchor_error("InsufficientFunds");
检查交易
查看交易日志
use litesvm_utils::{LiteSVM, Signer, TestHelpers, TransactionHelpers};use solana_sdk::{native_token::LAMPORTS_PER_SOL, system_instruction};#[test]fn test_check_logs() {let mut svm = LiteSVM::new();let alice = svm.create_funded_account(10 * LAMPORTS_PER_SOL).unwrap();let bob = svm.create_funded_account(0).unwrap();let ix = system_instruction::transfer(&alice.pubkey(), &bob.pubkey(), LAMPORTS_PER_SOL);let result = svm.send_instruction(ix, &[&alice]).unwrap();// Check if a specific message is in the logsif result.has_log("Transfer") {println!("Found transfer log!");}// Find a log matching a patternif let Some(log) = result.find_log("Program") {println!("Found log: {}", log);}// Get all logslet logs = result.logs();for log in logs {println!("{}", log);}}
打印日志以进行调试
use litesvm_utils::{LiteSVM, Signer, TestHelpers, TransactionHelpers};use solana_sdk::{native_token::LAMPORTS_PER_SOL, system_instruction};#[test]fn test_print_logs() {let mut svm = LiteSVM::new();let alice = svm.create_funded_account(10 * LAMPORTS_PER_SOL).unwrap();let bob = svm.create_funded_account(0).unwrap();let ix = system_instruction::transfer(&alice.pubkey(), &bob.pubkey(), LAMPORTS_PER_SOL);let result = svm.send_instruction(ix, &[&alice]).unwrap();// Print formatted logs for debuggingresult.print_logs();}
检查计算单元
use litesvm_utils::{LiteSVM, Signer, TestHelpers, TransactionHelpers};use solana_sdk::{native_token::LAMPORTS_PER_SOL, system_instruction};#[test]fn test_compute_units() {let mut svm = LiteSVM::new();let alice = svm.create_funded_account(10 * LAMPORTS_PER_SOL).unwrap();let bob = svm.create_funded_account(0).unwrap();let ix = system_instruction::transfer(&alice.pubkey(), &bob.pubkey(), LAMPORTS_PER_SOL);let result = svm.send_instruction(ix, &[&alice]).unwrap();let compute_units = result.compute_units();println!("Compute units consumed: {}", compute_units);// Assert compute usage is within expected boundsassert!(compute_units < 10_000, "Transaction used too many compute units");}
监控计算单元有助于优化。Solana 将交易限制在 140 万个计算单元以内,使用量越高,费用越高。
完整示例
以下是演示交易辅助函数的综合示例:
use litesvm_utils::{AssertionHelpers, LiteSVM, Signer, TestHelpers, TransactionHelpers};use solana_sdk::{native_token::LAMPORTS_PER_SOL, system_instruction};#[test]fn test_transaction_workflow() {let mut svm = LiteSVM::new();// Setup accountslet alice = svm.create_funded_account(10 * LAMPORTS_PER_SOL).unwrap();let bob = svm.create_funded_account(0).unwrap();// Test successful transferlet transfer_ix = system_instruction::transfer(&alice.pubkey(),&bob.pubkey(),2 * LAMPORTS_PER_SOL,);let result = svm.send_instruction(transfer_ix, &[&alice]).unwrap();// Verify successresult.assert_success();// Check compute usagelet cu = result.compute_units();println!("Transfer used {} compute units", cu);// Verify balancessvm.assert_sol_balance(&bob.pubkey(), 2 * LAMPORTS_PER_SOL);// Test expected failurelet bad_transfer = system_instruction::transfer(&alice.pubkey(),&bob.pubkey(),100 * LAMPORTS_PER_SOL, // More than Alice has);let fail_result = svm.send_instruction(bad_transfer, &[&alice]).unwrap();fail_result.assert_failure();// Print logs for debuggingfail_result.print_logs();println!("Transaction workflow test passed!");}
错误类型
TransactionError 枚举提供结构化的错误信息:
| 变体 | 描述 |
|---|---|
ExecutionFailed(String) | 交易执行失败并附有错误信息 |
BuildError(String) | 构建交易失败 |
AssertionFailed(String) | 对结果的断言失败 |
Is this page helpful?