Testes Anchor TS
anchor test é o caminho de integração padrão para projetos Anchor 0.32.1: compila programas, faz deploy em validador local e executa testes TypeScript contra a IDL. Use para fluxos end-to-end com semântica RPC real.
Receita
Cartão de receita de referência rápida - pronto para copiar e colar.
anchor test
# ou com validador existente:
anchor test --skip-local-validatorimport * as anchor from "@coral-xyz/anchor";
const provider = anchor.AnchorProvider.env();
anchor.setProvider(provider);
const program = anchor.workspace.MyProgram as Program<MyProgram>;Quando usar:
- Testes de integração completos com CPIs SPL Token.
- Testar resolução de contas Anchor e tipos IDL.
- Validação CI antes de deploy devnet/mainnet.
- Testes de contrato SDK cliente junto ao programa.
Exemplo prático
import * as anchor from "@coral-xyz/anchor";
import { Program } from "@coral-xyz/anchor";
import { MyProgram } from "../target/types/my_program";
import { Keypair, PublicKey, SystemProgram } from "@solana/web3.js";
import { TOKEN_PROGRAM_ID, createMint, getOrCreateAssociatedTokenAccount } from "@solana/spl-token";
import { assert } from "chai";
describe("my_program", () => {
const provider = anchor.AnchorProvider.env();
anchor.setProvider(provider);
const program = anchor.workspace.MyProgram as Program<MyProgram>;
const payer = (provider.wallet as anchor.Wallet).payer;
it("initializes vault", async () => {
const user = Keypair.generate();
await provider.connection.confirmTransaction(
await provider.connection.requestAirdrop(user.publicKey, 2e9)
);
const mint = await createMint(provider.connection, payer, payer.publicKey, null, 6);
const ata = await getOrCreateAssociatedTokenAccount(
provider.connection, payer, mint, user.publicKey
);
const [vaultPda] = PublicKey.findProgramAddressSync(
[Buffer.from("vault"), user.publicKey.toBuffer()],
program.programId
);
await program.methods
.initVault()
.accounts({
user: user.publicKey,
vault: vaultPda,
mint: mint,
userToken: ata.address,
tokenProgram: TOKEN_PROGRAM_ID,
systemProgram: SystemProgram.programId,
})
.signers([user])
.rpc();
const vault = await program.account.vault.fetch(vaultPda);
assert.ok(vault.authority.equals(user.publicKey));
});
});O que isso demonstra:
- Provider lê cluster de
Anchor.toml. - Helpers SPL criam mint e ATA no validador local.
.rpc()envia transação assinada e aguarda confirmação.
Mergulho profundo
Como funciona
anchor testexecutaanchor build, inicia validador (a menos que pulado), faz deploy de programas, executatests/**/*.ts.- Mocha é runner padrão; assertions
chaicomuns. - IDL gerada em
target/idle tipos emtarget/types. - Carteira em
Anchor.tomlpaga taxas de deploy e teste.
Config de teste Anchor.toml
| Campo | Propósito |
|---|---|
[provider] cluster | URL localnet / devnet |
[scripts] test | Comando de teste customizado |
[test] startup_wait | Atraso de prontidão do validador |
Notas TypeScript
// Combine códigos de erro do Rust #[error_code]
import { AnchorError } from "@coral-xyz/anchor";
try {
await program.methods.badIx().rpc();
} catch (e) {
const err = e as AnchorError;
console.log(err.error.errorCode.code);
}Erros comuns
- Mismatch de cluster -
Anchor.tomldevnet mas validador localnet. Correção: Alinhe URL do provider com cluster em execução. - Falhas de airdrop - Limites de faucet local. Correção: Financie payer no genesis do validador ou um airdrop por teste.
- IDL não regenerada - Erros de nome de conta após rename Rust. Correção:
anchor buildantes do teste. - Porta 8899 ocupada - Validador órfão. Correção:
pkill solana-test-validatorno pre-step CI. - CI lento - Deploy completo a cada execução. Correção: Adicione camada LiteSVM/Bankrun; reserve anchor test para job de integração.
--skip-local-validatorausente - Duplo start de validador falha. Correção: Documente ciclo de vida do validador no CI.
Alternativas
| Alternativa | Use quando | Não use quando |
|---|---|---|
| Bankrun | Testes TS mais rápidos | Precisa recursos RPC completos |
| LiteSVM | Testes unitários Rust | Equipe só TypeScript |
| Fork Surfpool | Estado DeFi mainnet | Programa CRUD simples |
FAQs
Runner de teste padrão?
Mocha via ts-mocha no template Anchor - pode trocar para node:test com script customizado.
Como testar na devnet?
Defina cluster do provider para devnet e execute anchor test --skip-local-validator com carteira financiada.
Múltiplos programas?
Membros do workspace Cargo.toml todos fazem deploy em anchor test quando configurados em Anchor.toml.
Como compartilhar fixtures de teste?
Hooks before criam mints/usuários; commite keypairs JSON apenas para localnet, nunca chaves mainnet.
Compute budget nos testes?
Adicione instruções compute budget no builder de transação quando ix se aproxima do limite CU.
Transações versionadas?
Suportadas via padrões web3.js v2 - garanta que cliente construa tx v0 ao testar ALTs.
anchor test vs cargo test?
cargo test executa apenas testes Rust; anchor test inclui deploy + integração TS.
Testes instáveis?
Geralmente vazamento de estado do validador - use --reset ou keypairs únicos por teste.
Cache CI?
Cache target/ e módulos npm; ainda recompile programas a cada execução para correção.
Alinhamento Agave 4.1.1?
Instale solana CLI correspondente no CI para validador local combinar com runtime de produção.
Relacionados
- Bankrun (TS) - VM TS mais rápida
- Testando contra validador - ops de validador
- Testando CPIs e PDAs - setup de contas
- Noções básicas de testes - pirâmide
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.