Testando Seu Programa
Testes rigorosos previnem perdas financeiras, constroem confiança dos usuários e garantem que seu programa se comporte corretamente em todas as condições.
TypeScript Tests
Testes em TypeScript são a abordagem mais comum, já que você precisará de TypeScript para o cliente da sua dApp de qualquer forma. Isso permite desenvolver testes e código do cliente simultaneamente.
Cobrimos a configuração do lado do cliente em detalhes aqui.
Testes em TypeScript oferecem vantagens importantes:
Espelham interações reais do cliente
Testam fluxos de trabalho complexos e casos extremos
Fornecem feedback imediato sobre mudanças na API
Validam cenários de sucesso e erro
Execute os testes com:
anchor testMollusk Tests
Quando você precisa de controle granular sobre ambientes de teste ou configuração complexa de estado do programa, o Mollusk fornece a solução.
Mollusk é um framework de testes em Rust construído especificamente para programas Solana. Ele permite:
Testar lógica do programa em isolamento sem overhead de rede
Configurar estados complexos de accounts facilmente
Executar testes mais rápido do que testes de integração completos
Simular condições específicas da blockchain e casos extremos
Cobrimos testes com Mollusk em detalhes aqui.
Crie um novo programa Anchor com Mollusk:
anchor init <name-of-the-project> --test-template molluskExecute os testes usando:
anchor testLiteSVM Tests
Quando você precisa do mesmo controle granular sobre o estado do seu programa, como o Mollusk, mas em TypeScript, o LiteSVM fornece a solução ideal.
LiteSVM é um framework de testes leve que executa a Solana Virtual Machine diretamente no seu processo de teste. Ele permite:
Executar testes significativamente mais rápido do que frameworks tradicionais como
solana-program-testManipular estados de accounts e sysvars com precisão
Testar em múltiplas linguagens: TypeScript, Rust e Python
Simular condições complexas da blockchain e casos extremos sem esforço
O LiteSVM elimina o overhead do validador ao incorporar a VM dentro dos seus testes, entregando a velocidade necessária para ciclos rápidos de desenvolvimento sem sacrificar a precisão dos testes.
Cobrimos testes com LiteSVM em detalhes aqui.
Você pode configurar seu provider do Anchor e usar a configuração do lado do cliente que vimos anteriormente com o pacote anchor-litesvm.
Instale o pacote anchor-litesvm.
npm install git:https://github.com/LiteSVM/anchor-litesvmEntão altere o provider padrão do Anchor para LiteSVMProvider assim:
import { fromWorkspace, LiteSVMProvider } from "anchor-litesvm";
test("anchor", async () => {
const client = fromWorkspace("target/types/<program-name>.ts");
const provider = new LiteSVMProvider(client);
const program = new Program<Puppet>(IDL, provider);
// program.methods..
})Running a Local Validator
Espelhe o comportamento da mainnet localmente usando um validador que atua como sua blockchain sandbox pessoal. Isso acontece automaticamente quando você configura seu cluster para localnet.
O validador local opera um ledger simplificado da Solana com programas nativos pré-instalados. Por padrão, ele armazena apenas dados de teste e não tem acesso a accounts existentes na mainnet — limitando os testes com protocolos estabelecidos.
Configurando Seu Validador Local
Personalize seu validador no Anchor.toml na seção [test]:
[test]
startup_wait = 10000A flag startup_wait atrasa a inicialização do validador, útil ao clonar múltiplas accounts que aumentam o tempo de carregamento.
Clonando Accounts da Mainnet
Clone accounts e programas existentes da mainnet usando a configuração [test.validator]:
[test.validator]
url = "https://api.mainnet-beta.solana.com"
[[test.validator.clone]]
address = "7NL2qWArf2BbEBBH1vTRZCsoNqFATTddH6h8GkVvrLpG"
[[test.validator.clone]]
address = "2RaN5auQwMdg5efgCaVqpETBV8sacWGR8tkK4m9kjo5r"
[[test.validator.clone]]
address = "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s"A seção clone copia accounts do cluster especificado. Quando uma account está vinculada a um programa gerenciado pelo "BPF upgradeable loader", o Anchor clona automaticamente a account de dados do programa associada.
Carregando Dados Locais de Accounts
Carregue accounts locais a partir de arquivos JSON usando a flag account:
[[test.validator.account]]
address = "Ev8WSPQsGb4wfjybqff5eZNcS3n6HaMsBkMk9suAiuM"
filename = "some_account.json"Essa abordagem funciona bem para testar com estados de account pré-configurados ou configurações específicas que não existem na mainnet.
Running Surfnet
Testar programas Solana que dependem de Cross-Program Invocations (CPIs) tradicionalmente exige que desenvolvedores façam dump de accounts e programas da mainnet, como vimos na seção do Local Validator.
Esse processo funciona para algumas accounts, mas torna-se completamente inviável ao testar CPIs em programas complexos como o Jupiter, que pode depender de mais de 40 accounts e mais de 8 programas.
O Surfnet serve como um substituto direto para o solana-test-validator que permite aos desenvolvedores simular programas localmente usando accounts da mainnet buscadas sob demanda.
Para usá-lo, basta instalar o surfpool usando a Página de Instalação oficial e então executar:
surfpool startAgora você pode se conectar ao Surfnet direcionando o validador local:
import { Connection } from "@solana/web3.js";
const connection = new Connection("http://localhost:8899", "confirmed");Cobrimos a configuração e uso do Surfnet em detalhes aqui.