설치
필요한 모든 종속성이 있는지 확인하세요:
cargo add --dev litesvm litesvm-utils
litesvm-utils란?
litesvm-utils 크레이트는 Solana 프로그램 테스트를 간소화하는 핵심 헬퍼
트레이트와 유틸리티를 제공합니다. 인체공학적인 API를 통해 30줄 이상의 반복적인
테스트 코드를 간결하고 읽기 쉬운 코드로 줄여줍니다.
TestHelpers 트레이트
- 단일 메서드 호출로 자금이 충전된 계정 생성
- 토큰 민트 및 token account 간편 설정
- 보일러플레이트 없이 PDA 도출
- 시간 기반 테스트를 위한 slot 관리
AssertionHelpers 트레이트 - 계정 상태 검증 (존재 여부, 닫힘 여부, 소유자)
- 토큰 잔액 및 민트 공급량 확인 - SOL 잔액 확인 - 계정 데이터 길이 유효성 검사
TransactionHelpers 트레이트 - 풍부한 결과 처리로 명령어 실행 - 트랜잭션 성공 또는 실패 검증 - 특정 오류 코드 확인 - 트랜잭션 로그 및 컴퓨트 유닛 검사
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) | 계정이 존재하고 데이터/lamports가 있으면 패닉이 발생합니다 |
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?