Anchor
Anchor для початківців

Anchor для початківців

Тестування вашої програми

Ретельне тестування запобігає фінансовим втратам, будує довіру користувачів і гарантує, що ваша програма працює правильно за будь-яких умов.

Тестуйте ретельно перед розгортанням у головній мережі.

TypeScript Tests

Тестування TypeScript є найпоширенішим підходом, оскільки вам все одно знадобиться TypeScript для клієнтської частини dApp. Це дозволяє розробляти тести та клієнтський код одночасно.

Ми детально розглянули налаштування клієнтської частини тут.

Кожен проєкт Anchor CLI містить тестову папку з файлом TypeScript, готовим для тестування.

Тести TypeScript пропонують ключові переваги:

  • Відображають реальні взаємодії клієнта
  • Тестують складні робочі процеси та граничні випадки
  • Надають миттєвий зворотний зв'язок щодо змін API
  • Перевіряють сценарії успіху та помилок

Запустіть тести за допомогою:

bash
anchor test

Запускайте в локальній мережі, встановивши кластер на localnet у вашій конфігурації. Це запускає локальний валідатор і додає 1000 SOL до гаманця провайдера. Якщо вам потрібні додаткові облікові записи з даними, розгляньте запуск Локального валідатора

Mollusk Tests

Коли вам потрібен детальний контроль над середовищами тестування або налаштування складного стану програми, Mollusk надає рішення.

Mollusk — це фреймворк тестування на Rust, створений спеціально для програм Solana. Він дозволяє:

  • Тестувати логіку програми ізольовано без мережевих накладних витрат
  • Легко налаштовувати складні стани облікових записів
  • Запускати тести швидше, ніж повні інтеграційні тести
  • Імітувати специфічні умови блокчейну та граничні випадки

Ми детально розглянули тестування з Mollusk тут.

Створіть нову програму Anchor з Mollusk:

bash
anchor init <name-of-the-project> --test-template mollusk

Запустіть тести за допомогою:

bash
anchor test

Тести LiteSVM

Коли вам потрібен такий самий детальний контроль над станом вашої програми, як у Mollusk, але в TypeScript, LiteSVM надає оптимальне рішення.

LiteSVM — це легка тестова платформа, яка запускає віртуальну машину Solana безпосередньо у вашому тестовому процесі. Вона дозволяє вам:

  • Виконувати тести значно швидше, ніж традиційні фреймворки, такі як solana-program-test
  • Маніпулювати станами облікових записів і системними змінними з точністю
  • Тестувати на кількох мовах: TypeScript, Rust і Python
  • Легко імітувати складні умови блокчейну та граничні випадки

LiteSVM усуває накладні витрати валідатора, вбудовуючи віртуальну машину у ваші тести, забезпечуючи швидкість, необхідну для швидких циклів розробки, без шкоди для точності тестування.

Ми детально розглянули тестування з LiteSVM тут.

Ви можете налаштувати свій провайдер Anchor і використовувати клієнтську конфігурацію, яку ми бачили раніше з пакетом anchor-litesvm.

Встановіть пакет anchor-litesvm.

bash
npm install git:https://github.com/LiteSVM/anchor-litesvm

Потім змініть провайдер Anchor за замовчуванням на LiteSVMProvider таким чином:

ts
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..
})

Запуск локального валідатора

Відтворюйте поведінку основної мережі локально за допомогою валідатора, який діє як ваша особиста пісочниця блокчейну. Це відбувається автоматично, коли ви встановлюєте свій кластер на localnet.

Локальний валідатор працює зі спрощеним реєстром Solana з попередньо встановленими нативними програмами. За замовчуванням він зберігає лише тестові дані та не має доступу до існуючих облікових записів основної мережі, що обмежує тестування з встановленими протоколами.

Налаштування локального валідатора

Налаштуйте свій валідатор у Anchor.toml у розділі [test]:

 
[test]
startup_wait = 10000

Прапорець startup_wait затримує запуск валідатора, що корисно при клонуванні кількох облікових записів, які збільшують час завантаження.

Клонування облікових записів основної мережі

Клонуйте існуючі облікові записи та програми основної мережі за допомогою конфігурації [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"

Розділ clone копіює облікові записи з вказаного кластера. Коли обліковий запис пов'язаний з програмою, якою керує "BPF upgradeable loader", Anchor автоматично клонує пов'язаний обліковий запис даних програми.

Завантаження даних локального облікового запису

Завантажуйте локальні облікові записи з JSON-файлів за допомогою прапорця account:

 
[[test.validator.account]]
address = "Ev8WSPQsGb4wfjybqff5eZNcS3n6HaMsBkMk9suAiuM"
filename = "some_account.json"

Цей підхід добре працює для тестування з попередньо налаштованими станами облікових записів або певними конфігураціями, яких немає в основній мережі.

Running Surfnet

Тестування програм Solana, які покладаються на міжпрограмні виклики (CPI), традиційно вимагає від розробників вивантаження облікових записів і програм з основної мережі, як ми бачили в розділі про локальний валідатор.

Цей процес працює для кількох облікових записів, але стає абсолютно неможливим при тестуванні CPI у складних програмах, таких як Jupiter, які можуть залежати від понад 40 облікових записів і понад 8 програм.

Surfnet служить заміною solana-test-validator, яка дозволяє розробникам локально симулювати програми, використовуючи облікові записи основної мережі, що завантажуються за потреби

Щоб використовувати його, просто встановіть surfpool за допомогою офіційної сторінки встановлення, а потім запустіть:

bash
surfpool start

Тепер ви можете підключитися до Surfnet, націлившись на локальний валідатор:

ts
import { Connection } from "@solana/web3.js";
 
const connection = new Connection("http://localhost:8899", "confirmed");

Ми детально розглянули налаштування та використання Surfnet тут.

Blueshift © 2025Commit: 6d01265