التثبيت
تأكد من توفر جميع التبعيات اللازمة:
cargo add --dev litesvm litesvm-utils
ما هي litesvm-utils؟
توفر حزمة litesvm-utils سمات مساعدة أساسية وأدوات مساعدة تُبسّط اختبار برامج
سولانا. إذ تُقلّص الكود النمطي الشائع في الاختبارات من أكثر من 30 سطرًا إلى كود
موجز وسهل القراءة عبر واجهات برمجية سلسة.
سمة TestHelpers
- إنشاء حسابات ممولة باستدعاء طريقة واحدة
- إعداد token mints وtoken account بسهولة
- اشتقاق PDAs دون كود نمطي
- إدارة slot للاختبارات المبنية على الوقت
سمة AssertionHelpers - التحقق من حالات الحسابات (موجود، مغلق، مالك) - التحقق من أرصدة token account وإمدادات token mints - فحص أرصدة 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();
نظرة عامة على الـ Trait
TestHelpers
| الطريقة | القيمة المُعادة | الوصف |
|---|---|---|
create_funded_account(lamports) | Result<Keypair> | ينشئ keypair ويموّله |
create_funded_accounts(count, lamports) | Result<Vec<Keypair>> | ينشئ عدة keypairs مموّلة |
create_token_mint(authority, decimals) | Result<Keypair> | ينشئ عملة SPL token mint |
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) | يشتق PDA مع bump seed |
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 من الـ slots |
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 | لا يوجد عدد كافٍ من lamports لإتمام المعاملة | زِد مبلغ التمويل الأولي |
OwnerMismatch | الحساب مملوك من قِبل برنامج خاطئ | تحقق من معرّف البرنامج الصحيح |
AssertionFailed | الرصيد أو الحالة لا تتطابق مع المتوقع | راجع منطق الاختبار لديك |
Is this page helpful?