Das Testen eines benutzerdefinierten Solana-Programms bedeutet, seine kompilierte .so-Datei in die
SVM zu laden, die erwarteten Konten einzurichten und Anweisungen dagegen zu senden.
LiteSVM erledigt all dies prozessintern – kein validator erforderlich. Wir empfehlen,
Programm-Clients mit dem
Codama JS Renderer zu generieren, damit Sie
Zugang zu einem kompatiblen Kit-Plugin haben.
Ein Programm laden
import { createClient, address, generateKeyPairSigner } from "@solana/kit";import { litesvm } from "@solana/kit-plugin-litesvm";import { signer } from "@solana/kit-plugin-signer";import { myProgramPlugin } from "@my-program/sdk";import * as fs from "node:fs";const mySigner = await generateKeyPairSigner();const client = createClient().use(signer(mySigner)).use(litesvm()).use(myProgramPlugin());// Configure for program testingclient.svm.withSigverify(false).withBlockhashCheck(false).withSysvars().withBuiltins();// Load program from .so fileconst programId = address("YourProgramId111111111111111111111111111");const soPath = "/path/to/target/deploy/my_program.so";if (fs.existsSync(soPath)) {client.svm.addProgramFromFile(programId, soPath);console.log("Program loaded:", programId);// Verify program accountconst programAccount = client.svm.getAccount(programId);if (programAccount.exists) {console.log(" Executable:", programAccount.executable);console.log(" Data size:", programAccount.data.length, "bytes");}} else {console.log("Program file not found:", soPath);console.log("Build with: cargo build-sbf");}
Vollständiges Programm-Test-Setup
import { createClient, address, generateKeyPairSigner, lamports } from '@solana/kit';import { litesvm } from '@solana/kit-plugin-litesvm';import { signer } from '@solana/kit-plugin-signer';import { myProgramPlugin } from '@my-program/sdk';import * as fs from 'node:fs';const mySigner = await generateKeyPairSigner();const client = createClient().use(signer(mySigner)).use(litesvm()).use(myProgramPlugin());client.svm.withSigverify(false).withBlockhashCheck(false).withSysvars().withBuiltins().withPrecompiles().withTransactionHistory(100n);// Load programconst programId = address('YourProgramId111111111111111111111111111');const soPath = '/path/to/target/deploy/my_program.so';if (fs.existsSync(soPath)) {client.svm.addProgramFromFile(programId, soPath);}// Set up any required data accountsconst dataAccountAddress = address('DataAccount111111111111111111111111111');const minBalance = client.svm.minimumBalanceForRentExemption(100n);client.svm.setAccount({address: dataAccountAddress,data: new Uint8Array(100),executable: false,lamports: lamports(minBalance),programAddress: programId,space: 100n,});// Send the transactionawait client.myProgram.testInstruction({..}).sendTransaction();// Verify state changesconst updatedAccount = client.myProgram.myAccount.fetch(dataAccountAddress);// assert on decoded account
Standard-Programme verwenden
Für Tests, die Standard-Programme erfordern:
const mySigner = await generateKeyPairSigner();const client = createClient().use(signer(mySigner)).use(litesvm());// Add all default programs (System, BPF Loader, etc.)client.svm.withDefaultPrograms();// Or add specific programs you need// The Token program, Associated Token program, etc. would need// to be added manually via addProgramFromFile if needed
Erstellen Sie Ihr Solana-Programm mit cargo build-sbf, um die .so-Datei zu generieren.
Das Muster ist immer dasselbe:
- Programm laden: Verwenden Sie
addProgramFromFile, um kompilierte Programme zu laden, und importieren Sie myProgramPlugin() aus Ihrem Client - Konfiguration: Aktivieren Sie Sysvars, Builtins und Precompiles nach Bedarf
- Konten einrichten: Füllen Sie Daten-Konten vorab mit
setAccount - Senden: Verwenden Sie
client.myProgram.testInstruction({..}).sendTransaction()– kein manuelles Erstellen von Transaktionen - Überprüfung: Prüfen Sie den Konten-Zustand nach der Ausführung
(
client.myProgram.myAccount.fetch)
Sobald dieses Grundgerüst funktioniert, können Sie eine vollständige Testsuite aufbauen, indem Sie weitere Anweisungen und Assertions hinzufügen.
Is this page helpful?