litesvm, mollusk & solana-bankrun
Testes rápidos de programas Solana evitam viagens de ida e volta completas do solana-test-validator. LiteSVM 0.6.x executa um SVM in-process para testes Rust. Mollusk executa instruções únicas contra o ELF do programa com fixtures. solana-bankrun (Bankrun) incorpora um ambiente semelhante a um validador para testes de integração TypeScript. Escolha com base na linguagem e nas necessidades de fidelidade da semântica do Agave 4.1.1.
Receita
Cartão de receita de referência rápida - pronto para copiar e colar.
[dev-dependencies]
litesvm = "0.6"
mollusk-svm = "0.1"npm install -D solana-bankrun @solana/kit@7.0.0use litesvm::LiteSVM;
let mut svm = LiteSVM::new();
// svm.add_program(...) e envia txs em testesQuando usar isso:
- Testes unitários para programas Anchor/nativos em CI sem validadores Docker.
- Benchmarking de uso de CU em variantes de instrução.
- Testes de integração TS que carregam seu
.soe verificam deltas de conta. - Loops rápidos de vermelho/verde durante correções de segurança.
Exemplo de Trabalho
use litesvm::LiteSVM;
use solana_sdk::{
instruction::{AccountMeta, Instruction},
pubkey::Pubkey,
signature::{Keypair, Signer},
system_program,
transaction::Transaction,
};
#[test]
fn transfer_in_litesvm() {
let mut svm = LiteSVM::new();
let payer = Keypair::new();
let recipient = Keypair::new();
svm.airdrop(&payer.pubkey(), 1_000_000_000).unwrap();
let ix = Instruction {
program_id: system_program::ID,
accounts: vec![
AccountMeta::new(payer.pubkey(), true),
AccountMeta::new(recipient.pubkey(), false),
],
data: solana_sdk::system_instruction::transfer(&payer.pubkey(), &recipient.pubkey(), 10_000).data,
};
let bh = svm.latest_blockhash();
let tx = Transaction::new_signed_with_payer(&[ix], Some(&payer.pubkey()), &[&payer], bh);
svm.send_transaction(tx).unwrap();
let bal = svm.get_balance(&recipient.pubkey()).unwrap();
assert_eq!(bal, 10_000);
}O que isso demonstra:
- LiteSVM airdrops lamports sem faucet CLI.
- Instrução real do programa do sistema executa in-process.
- Blockhash vem do estado svm, não de RPC externo.
- Asserções leem saldos diretamente do svm.
Mergulho Profundo
Como Funciona
- LiteSVM incorpora execução compatível com Agave para binários de programa carregados.
- Mollusk foca em um harness de instrução única com lista de contas simuladas.
- Bankrun inicia o estado do banco para testes TS com hooks de implantação de programa.
- Nenhum substitui completamente os testes de validador para casos de borda de RPC/rede.
Tabela de Crates Rust
| Crate | Linguagem | Fidelidade | Velocidade |
|---|---|---|---|
litesvm | Rust | Transações multi-instrução | Muito rápido |
mollusk-svm | Rust | Instrução única | Micro-benchmarks mais rápidos |
solana-program-test | Rust | Validador assíncrono mais antigo | Mais lento |
CLI surfpool | Qualquer (RPC) | Simulação de fork Mainnet | Médio |
Tabela TypeScript / NPM
| Pacote | Função | Pin |
|---|---|---|
solana-bankrun | Banco embutido para testes TS | Corresponder à era Agave |
@solana/kit | Construir/enviar em testes | 7.0.0 |
Runner de teste anchor | Testes TS Anchor legados | 0.32.1 |
Notas Rust
// Carrega seu programa .so em testes LiteSVM
// svm.add_program(program_id, "target/deploy/my_program.so");
// Compara logs de CU com `mollusk` para ajuste de instrução quenteArmadilhas
- Testar sem artefato BPF implantado - falhas de ID de programa vazio. Correção:
anchor buildantes dos testes; conecte o caminho em CI. - Deriva de recursos da mainnet - a disponibilidade de syscall difere por versão. Correção: fixe LiteSVM 0.6.x com a toolchain Agave 4.1.1.
- Caminho do programa Bankrun incorreto em monorepos -
.soobsoleto. Correção: copie o artefato no script de configuração de teste. - Simular contas em excesso no Mollusk - passa nos testes, falha na mainnet. Correção: adicione casos de integração LiteSVM.
- Pular completamente os testes do validador - perca bugs de serialização RPC. Correção: mantenha uma suíte
solana-test-validatorfina.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
solana-test-validator | Integração precisa de RPC | Loops unitários sub-segundo |
| Fork do Surfpool 0.12.0 | Estado de conta Mainnet | Matemática unitária pura |
| Testes de implantação Devnet | Testes de fumaça pré-lançamento | Cada commit de PR |
| Verificação formal | Invariantes críticos | Toda a lógica de negócios |
FAQs
LiteSVM vs program-test?
LiteSVM é mais rápido e simples para a maioria dos testes unitários Anchor/nativos.
Mollusk quando?
Micro-benchmarks e casos de segurança focados em instruções.
Bankrun com kit?
Sim - construa transações com kit, execute no contexto Bankrun.
Harness de teste Anchor?
anchor test pode orquestrar o validador; adicione LiteSVM para camadas de velocidade.
Medição de CU?
Leia o consumo dos logs nas saídas LiteSVM/Mollusk.
Cache de CI?
Cache os artefatos target/deploy/*.so entre os jobs.
Testes do programa Token?
Carregue programas SPL no svm ou use imagens pré-carregadas conforme a documentação do harness.
Bankrun instável?
Fixe a versão do Node e a ordem de implantação do programa; evite corridas em testes paralelos.
Fuzz + Mollusk?
Combine entradas cargo-fuzz com execução Mollusk para pesquisa de segurança.
Complemento Surfpool?
Use Surfpool para estado forkado; LiteSVM para casos unitários determinísticos.
Relacionado
- LiteSVM - guia detalhado
- Mollusk - harness de instrução
- Bankrun (TS) - testes TS
- Noções Básicas de Teste - pirâmide
Versões da Pilha: Esta página foi escrita para Agave 4.1.1, Solana CLI 3.0.10, Anchor 0.32.1, anchor-lang 0.32.1, Rust 1.91.1, @solana/kit 7.0.0, Surfpool 0.12.0, e LiteSVM 0.6.x.