Bankrun (TS)
Bankrun fornece testes VM Solana in-process rápidos a partir de TypeScript sem executar solana-test-validator. Use quando sua equipe vive em testes Anchor TS mas precisa de velocidade estilo LiteSVM.
Receita
Cartão de receita de referência rápida - pronto para copiar e colar.
import { startAnchor, BankrunProvider } from "anchor-bankrun";
import { Program } from "@coral-xyz/anchor";
const context = await startAnchor("", [], []);
const provider = new BankrunProvider(context);
const program = new Program(idl, provider);Quando usar:
- Testes Anchor TS lentos no spin-up de validador.
- Testar múltiplas instruções em um arquivo TypeScript rapidamente.
- Equipes preferindo Mocha/
chaiem vez de#[test]Rust. - Pipelines CI evitando portas de validador instáveis.
Exemplo prático
import { startAnchor, BankrunProvider } from "anchor-bankrun";
import { Program, BN } from "@coral-xyz/anchor";
import { Keypair, PublicKey } from "@solana/web3.js";
import { describe, it } from "node:test";
import assert from "node:assert/strict";
describe("vault bankrun", async () => {
const context = await startAnchor(".", [], []);
const provider = new BankrunProvider(context);
const program = new Program(idl as any, provider);
it("deposits tokens", async () => {
const user = Keypair.generate();
context.setAccount(user.publicKey, {
lamports: 1_000_000_000,
data: Buffer.alloc(0),
owner: PublicKey.default,
executable: false,
});
const [vaultPda] = PublicKey.findProgramAddressSync(
[Buffer.from("vault"), user.publicKey.toBuffer()],
program.programId
);
await program.methods
.deposit(new BN(500_000))
.accounts({ user: user.publicKey, vault: vaultPda })
.signers([user])
.rpc();
const vault = await program.account.vault.fetch(vaultPda);
assert.equal(vault.balance.toNumber(), 500_000);
});
});O que isso demonstra:
startAnchorcarrega programas do workspace na VM in-process.BankrunProviderconecta cliente Anchor sem RPC localhost.context.setAccountsemeia estado de conta antes das instruções.
Mergulho profundo
Como funciona
- Bankrun embute SVM similar ao LiteSVM mas expõe API amigável ao Node.
- Program IDs Anchor e artefatos
.socarregam de caminhos do workspace. - Transações submetem pelo provider como testes Anchor normais.
- Sem porta 8899 - elimina condições de corrida de validador no CI.
Bankrun vs anchor test
| Aspecto | Bankrun | anchor test (validador) |
|---|---|---|
| Startup | ~ms | segundos |
| Fidelidade RPC | Alta para programas | Completa |
| SPL Token | Suportado | Nativo |
| Fork DeFi | Limitado | Surfpool / clone |
Notas TypeScript
// Avance clock para ix dependentes de tempo
context.warpToSlot(100n);Erros comuns
- IDL fora de sync - IDL obsoleta causa erros de resolução de conta. Correção:
anchor buildantes dos testes. - Programas SPL ausentes - CPIs Token precisam contas de programa explícitas na config do workspace. Correção: Inclua
spl_token.sona lista de programasstartAnchor. - Rent de conta - Contas subfinanciadas falham silenciosamente. Correção: Defina lamports acima do mínimo rent-exempt em
setAccount. - Não é estado mainnet - Sem fork por padrão. Correção: Use Surfpool para camada de integração DeFi.
- Deriva de versão - Bankrun deve combinar com Solana SDK usado pelo Anchor 0.32.1. Correção: Fixe versões no
package.json. - signers em rpc() - Esquecer
.signers([user])em ix mutante. Correção: Espelhe padrões de teste de validador.
Alternativas
| Alternativa | Use quando | Não use quando |
|---|---|---|
| LiteSVM (Rust) | Equipe Rust-first | Devs só TypeScript |
| anchor test | RPC completo necessário | Velocidade crítica inner-loop |
| Surfpool | Fork mainnet DeFi | Lógica de programa simples |
FAQs
Bankrun substitui anchor test inteiramente?
Não - mantenha E2E validador para caminhos específicos de RPC; Bankrun cobre a maior parte dos testes de lógica Anchor.
Compatível com Anchor 0.32.1?
Use versão anchor-bankrun alinhada ao seu release Anchor - verifique README do pacote.
Posso testar transações versionadas?
Suporte evolui - verifique ALT/tx versionada para sua versão bankrun; fallback para validador se não suportado.
Como depurar logs?
Habilite logs verbosos do provider ou capture erros de transação e imprima campo simulation logs.
CI sem serviço validador?
Sim - npm test só com bankrun; mais rápido e sem conflitos de porta.
Múltiplos programas?
Passe array de caminhos de programa para startAnchor para dependências CPI.
Testes PDA?
Igual testes de validador - findProgramAddressSync + program.methods...accounts.
Testes negativos?
assert.rejects em rpc() esperando códigos de erro Anchor.
Funciona com @solana/kit?
Bankrun usa modelo provider web3.js - testes kit podem mirar RPC bankrun se exposto; caminho Anchor usa web3.js.
Quando usar Surfpool?
Quando instrução precisa de contas reais de pool/oracle mainnet não facilmente mockadas.
Relacionados
- Testes Anchor TS - testes Anchor baseados em validador
- LiteSVM - equivalente Rust
- Noções básicas de testes - pirâmide
- Melhores práticas de testes - política CI
Versões da stack: 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.