測試你的程式
徹底測試可以防止財務損失、建立用戶信任,並確保你的程式在所有情況下都能正確運行。
TypeScript Tests
TypeScript 測試是最常見的方法,因為無論如何你都需要為你的 dApp 客戶端使用 TypeScript。這讓你可以同時開發測試和客戶端代碼。
我們在這裡詳細介紹了客戶端設置。
TypeScript 測試提供了以下主要優勢:
模擬真實的客戶端互動
測試複雜的工作流程和邊界情況
對 API 更改提供即時反饋
驗證成功和錯誤場景
運行測試指令:
anchor testMollusk Tests
當你需要對測試環境或複雜的程式狀態設置進行精細控制時,Mollusk 提供了解決方案。
Mollusk 是一個專為 Solana 程式構建的 Rust 測試框架。它使你能夠:
在沒有網絡負擔的情況下隔離測試程式邏輯
輕鬆設置複雜的帳戶狀態
測試速度比完整的集成測試更快
模擬特定的區塊鏈條件和邊界情況
我們在這裡詳細介紹了 Mollusk 測試。
使用 Mollusk 創建一個新的 Anchor 程式:
anchor init <name-of-the-project> --test-template mollusk運行測試指令:
anchor testLiteSVM 測試
當你需要像 Mollusk 一樣對程式狀態進行細緻控制,但使用 TypeScript 時,LiteSVM 提供了最佳解決方案。
LiteSVM 是一個輕量級測試框架,直接在你的測試過程中運行 Solana 虛擬機。它使你能夠:
比傳統框架(如
solana-program-test)更快地執行測試精確操作帳戶狀態和系統變數
支援多種語言測試:TypeScript、Rust 和 Python
輕鬆模擬複雜的區塊鏈條件和邊界情況
LiteSVM 通過將虛擬機嵌入到你的測試中,消除了驗證器的負擔,提供了快速開發週期所需的速度,同時不犧牲測試的準確性。
我們在這裡全面介紹了 LiteSVM 測試。
你可以設置你的 Anchor 提供者,並使用我們之前看到的客戶端設置與 anchor-litesvm 套件一起使用。
安裝 anchor-litesvm 套件。
npm install git:https://github.com/LiteSVM/anchor-litesvm然後將默認的 Anchor 提供者更改為 LiteSVMProvider,如下所示:
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 = 10000startup_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 可升級加載器" 管理的程式,Anchor 會自動克隆相關的程式數據帳戶。
加載本地帳戶數據
使用 account 標誌從 JSON 文件加載本地帳戶:
[[test.validator.account]]
address = "Ev8WSPQsGb4wfjybqff5eZNcS3n6HaMsBkMk9suAiuM"
filename = "some_account.json"此方法非常適合用於測試預配置的帳戶狀態或主網中不存在的特定配置。
Running Surfnet
測試依賴於跨程式調用(CPI)的 Solana 程式,傳統上需要開發者從主網導出帳戶和程式,就像我們在本地驗證器部分看到的那樣。
此過程適用於少量帳戶,但當測試複雜程式(如 Jupiter)中的 CPI 時,這些程式可能依賴於超過 40 個帳戶和 8 個以上的程式,這就完全不可行了。
Surfnet 是 solana-test-validator 的替代方案,允許開發者使用按需獲取的主網帳戶在本地模擬程式。
要使用它,只需通過官方的安裝頁面安裝 surfpool,然後運行:
surfpool start現在,您可以通過定位本地驗證器連接到 Surfnet:
import { Connection } from "@solana/web3.js";
const connection = new Connection("http://localhost:8899", "confirmed");我們在這裡詳細介紹了 Surfnet 的設置和使用。