Pruebas TS de Anchor
anchor test es la ruta de integración predeterminada para los proyectos de Anchor 0.32.1: compila programas, implementa en un validador local y ejecuta pruebas de TypeScript contra el IDL. Úsalo para flujos de extremo a extremo con semántica RPC real.
Receta
Tarjeta de receta de referencia rápida, lista para copiar y pegar.
anchor test
# o con un 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>;Cuándo usar esto:
- Pruebas de integración completas con CPIs de SPL Token.
- Pruebas de resolución de cuentas de Anchor y tipos de IDL.
- Validación de CI antes de la implementación en devnet/mainnet.
- Pruebas de contrato del SDK del cliente junto con el programa.
Ejemplo de trabajo
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("inicializa la bóveda", 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));
});
});Lo que esto demuestra:
- El proveedor lee el clúster de
Anchor.toml. - Las utilidades de SPL crean la menta y la ATA en el validador local.
.rpc()envía la transacción firmada y espera la confirmación.
Inmersión Profunda
Cómo funciona
anchor testejecutaanchor build, inicia el validador (a menos que se omita), implementa programas y ejecutatests/**/*.ts.- Mocha es el ejecutor predeterminado; las aserciones de
chaison comunes. - El IDL se genera en
target/idly los tipos entarget/types. - La billetera en
Anchor.tomlpaga las tarifas de implementación y prueba.
Configuración de prueba de Anchor.toml
| Campo | Propósito |
|---|---|
[provider] cluster | URL de localnet / devnet |
[scripts] test | Comando de prueba personalizado |
[test] startup_wait | Retraso de preparación del validador |
Notas de TypeScript
// Coincide con los códigos de error de 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);
}Trampas
- Desajuste de clúster -
Anchor.tomlen devnet pero validador en localnet. Solución: Alinea la URL del proveedor con el clúster en ejecución. - Fallos de Airdrop - Límites del grifo local. Solución: Financia al pagador en la génesis del validador o un solo airdrop por prueba.
- IDL no regenerado - Errores de nombre de cuenta después de renombrar Rust. Solución:
anchor buildantes de la prueba. - Puerto 8899 ocupado - Validador huérfano. Solución:
pkill solana-test-validatoren el paso previo de CI. - CI lenta - Implementación completa en cada ejecución. Solución: Agrega la capa LiteSVM/Bankrun; reserva
anchor testpara el trabajo de integración. - Falta
--skip-local-validator- Doble inicio de validador falla. Solución: Documenta el ciclo de vida del validador de CI.
Alternativas
| Alternativa | Usar cuando | No usar cuando |
|---|---|---|
| Bankrun | Pruebas TS más rápidas | Necesitas funciones RPC completas |
| LiteSVM | Pruebas unitarias de Rust | Equipo solo de TS |
| Bifurcación de Surfpool | Estado DeFi de Mainnet | Programa CRUD simple |
Preguntas Frecuentes
¿Ejecutor de pruebas predeterminado?
Mocha a través de ts-mocha en la plantilla de Anchor; se puede cambiar a node:test con un script personalizado.
¿Cómo pruebo en devnet?
Establece el clúster del proveedor en devnet y ejecuta anchor test --skip-local-validator con una billetera financiada.
¿Múltiples programas?
Los miembros del Cargo.toml del espacio de trabajo se implementan todos en anchor test cuando se configuran en Anchor.toml.
¿Cómo compartir fixtures de prueba?
Los hooks before crean mentas/usuarios; confirma solo keypairs JSON para localnet, nunca claves de mainnet.
¿Presupuesto de cómputo en pruebas?
Agrega instrucciones de presupuesto de cómputo en el constructor de transacciones cuando la instrucción se acerca al límite de CU.
¿Transacciones versionadas?
Soportado a través de patrones de web3.js v2; asegúrate de que el cliente construya tx v0 al probar ALTs.
¿`anchor test` vs `cargo test`?
cargo test ejecuta solo pruebas de Rust; anchor test incluye implementación + integración de TS.
¿Pruebas inestables?
Generalmente fuga de estado del validador; usa --reset o keypairs únicos por prueba.
¿Caché de CI?
Caché de target/ y módulos npm; aún reconstruye programas en cada ejecución para mayor corrección.
¿Alineación con Agave 4.1.1?
Instala la CLI de Solana coincidente en CI para que el validador local coincida con el tiempo de ejecución de producción.
Relacionado
- Bankrun (TS) - VM de TS más rápida
- Pruebas contra un Validador - operaciones del validador
- Pruebas de CPIs y PDAs - configuración de cuentas
- Conceptos básicos de pruebas - pirámide
Versiones de Stack: Esta página se escribió 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, y LiteSVM 0.6.x.