Solana程序测试:必备工具与技巧

本文介绍了Solana链上程序测试的重要性,并详细阐述了单元测试、集成测试的不同方法和工具。

今天,我们将重点关注 Solana 开发的一个重要方面:测试你的链上程序。测试是开发过程中至关重要的一部分,它可以确保你的程序在 Solana 提供的快节奏和高性能环境中平稳、安全和高效地运行。对于本文,我们将重点介绍两种基本类型的测试:单元测试、集成测试和 E2E 测试。我们将把更多面向安全的测试(如fuzzing和 invariants)留到另一篇文章中。

单元测试

Solana 中的单元测试非常简单,主要涉及执行 Rust 单元测试。这种方法非常适合验证程序的各个组件,例如数学公式。有效单元测试的一个关键策略是以隔离这些操作的方式设计或重构你的程序。通过将数学运算封装在单独的函数中,你可以轻松地独立于程序的主要逻辑来测试它们,从而确保准确性并简化调试。

例如,考虑 Orca Whirlpools 存储库,它演示了如何有效地单元测试数学运算。通过将 swap 数学逻辑分离到其自己的函数中,测试仅侧重于这些计算的正确性,而不受其他程序元素的干扰。你可以在 swap_math.rs 文件中看到他们是如何实现这一点的。

集成测试

Solana 中的集成测试主要有两种类型:

  1. 使用本地测试验证器的测试:这些测试涉及设置本地测试验证器并针对其 RPC 端点执行测试。这种方法模拟了真实的 Solana 环境,使其成为对你的程序与区块链交互进行端到端测试的理想选择。诸如 Anchor 的 TypeScript 测试框架和 Trident 之类的工具都属于此类别。它们使你能够验证你的程序是否在受控的、真实的环境中正确处理各种场景。

  2. 与 Solana Bank / SVM 的直接交互:第二种类型的集成测试允许你直接与 Solana 的 bank 层或 SVM(Solana 虚拟机)交互,从而无需运行本地节点或处理不相关的组件(如共识)。这种方法纯粹侧重于测试程序逻辑和指令执行,从而提供更精简和高效的测试过程。它对于验证程序的核心功能而无需完整的网络模拟开销特别有用。示例:官方 Solana 测试套件、MolluskLiteSVM

使用本地测试验证器的测试

在进行使用本地测试验证器的集成测试时,有两个框架脱颖而出:Anchor 的 TypeScript 测试框架和 Trident。

Anchor TypeScript 测试框架

Anchor TypeScript 测试框架是 Solana 集成测试中最受欢迎和使用最广泛的工具。它的受欢迎程度归因于其广泛的文档和大量示例,使其易于上手并找到支持。许多 Solana 程序都依赖它来满足其测试需求。

优点:

  • 广泛使用: 拥有庞大的社区和许多可用的示例,更容易找到帮助和资源。

  • TypeScript 熟悉度: 使用 TypeScript 可能是一个显着的优势,特别是对于全栈工程师而言,因为它可以帮助他们理解协议以及如何与之交互。

缺点:

  • 潜在的缓慢: 测试运行可能很慢,这可能会阻碍快速开发周期。

  • TypeScript 复杂性: 虽然 TypeScript 功能强大,但定义类型有时可能很复杂且不直观,这可能会导致测试创建中的问题。

有关使用 Anchor TypeScript 测试进行测试的更多示例,请查看 Helius 的这篇 精彩文章

Trident

Trident 是一个较新的框架,允许你用 Rust 编写测试,同时它会处理启动本地验证器。对于那些喜欢 Rust 并希望获得更顺畅的集成测试体验的人来说,此设置可能非常有益。

优点:

  • 不错的 API: Trident 提供了一个简洁直观的 API。

  • 内置的 Fuzzing 和 Invariant 测试: 这些高级功能可以帮助发现极端情况,并确保你的程序在各种条件下都能正确运行。

  • 自动化测试生成: 可以为 fuzzing 和集成测试生成个性化的样板代码。

缺点:

  • 新框架: 作为一个较新的工具,Trident 的示例较少,社区支持也较少。

  • 有限的程序集成: 目前,你不能将其他程序添加到你的测试套件中。例如,如果你正在开发一个与 NFT 相关的项目,并且需要测试与 Metaplex 的交互,Trident 尚不支持此方案。

尽管存在这些限制,Trident 仍显示出巨大的潜力,并且值得关注其发展。示例可以在项目 GitHub 存储库中找到。

使用本地测试验证器的最大缺点

使用本地测试验证器的主要缺点之一是难以模拟帐户和区块链状态。虽然可以创建具有内置帐户和程序的自定义 genesis 以在你的测试环境中使用,但与本文后面介绍的方法相比,此方法受到限制。你可以从主网克隆程序和帐户,但模拟属于某些程序的特定帐户更具挑战性。如果你的程序与其他程序集成,则可能难以很好地测试该集成。

另一个重要问题是无法轻松影响验证器状态。例如,修改块时间以测试与经过时间相关的行为,使用这种方法并不简单。此限制使得难以模拟某些条件并彻底测试程序的所有方面。

值得一提的是,这两种测试框架都与 Anchor 框架无缝集成,但在使用本机 Solana 程序时会遇到挑战。

与 Solana Bank / SVM 的直接交互

直接与 Solana 的 Bank 或 Solana 虚拟机 (SVM) 交互是使用本地测试验证器的更快替代方案。这种方法抽象掉了不必要的层,仅关注 bank 或 SVM 的执行,而无需集群逻辑。因此,测试运行速度更快,并且可以并行执行,从而提高效率并缩短开发时间。

官方 Solana 测试套件

官方 Solana 测试套件提供了一个强大的框架,用于测试 Solana 程序,可以直接控制 bank,包括块时间操作和其他参数。

优点:

  • 全面的示例: 大量的示例和文档,使其成为测试 Solana 程序的标准方法。

  • 完全控制: 能够操作 bank 状态,包括块时间,从而提供精确的测试条件。

缺点:

  • 样板代码: 测试通常需要大量的样板代码,这使得编写起来很麻烦。

  • 依赖项管理: 管理依赖项可能具有挑战性,通常会导致 cargo 依赖项问题和难以找到兼容的版本。

精彩的示例可以在 Solana 程序库中找到 - 例如,Token 程序的测试

Litesvm

Litesvm 是一个快速轻量级的库,专为测试 Solana 程序而设计。它创建了一个针对开发人员优化的进程内 Solana VM,与 solana-program-test 和 solana-test-validator 等替代方案相比,显着加快了测试和编译过程。它还具有符合人体工程学的 API,具有合理的默认值和广泛的可配置性。

优点:

  • 速度: 由于其轻量级的特性,比传统方法快得多。

  • 符合人体工程学的 API: 提供了一个用户友好的 API,具有可配置的选项。

  • 完全控制: 能够操作 bank 状态,包括块时间,从而提供精确的测试条件。例如,查看 此测试 - 通过使用 warp_to_slot,可以修改执行时间(块时间)。

缺点:

  • 新框架: 作为一个较新的工具,它的示例较少,社区也较小。

  • 有限的资源: 与已建立的框架相比,没有那么多的资源或社区支持。

示例可以在 官方 repo 中找到, 还可以查看 anchor 文档

Mollusk

Mollusk 是另一种工具,它通过使用 BPF Loader 直接调用可执行程序来为 Solana 程序提供测试工具。这绕过了事务清理和运行时检查,纯粹专注于指令处理。

优点:

  • 直接调用/速度: 绕过不必要的检查,提供更直接和高效的测试过程。

  • Bencher - Mollusk 还提供了一个计算单元使用 bencher,用于分析程序的计算单元使用情况。

  • 完全控制: 能够操作 bank 状态,包括块时间,从而提供精确的测试条件。

缺点:

  • 新框架: 与 Litesvm 类似,它是一个较新的工具,示例较少,社区支持也较少。除了项目存储库之外,没有找到任何示例。

总的来说,直接与 Solana 的 Bank 或 SVM 交互提供了一个更简化和更快的测试过程。虽然这些方法有其自身的挑战,例如管理依赖项或处理更少的示例,但它们在速度、效率以及能够更好地控制测试环境(如创建模拟帐户或修改时间等测试条件)方面提供了显着的优势。

保持联系

目前,我们有各种可用于测试 Solana 程序的工具,但实际上,实现全面有效的测试仍然具有挑战性。例如,在 EVM 世界中,Foundry 是一个有据可查且非常受欢迎的工具,可以显着简化测试过程。我们认为 Solana 应该拥有一套类似强大且用户友好的工具套件。虽然有一些有希望的候选者出现,但我们将不得不看看这些工具如何发展以满足 Solana 开发人员社区日益增长的需求。

你最喜欢的测试 Solana 程序的方式是什么?在评论中回复。

感谢你的阅读!要及时了解我们的最新见解、研究和安全提示,请在 X 上关注我们并 访问我们的网站。如果你需要帮助或有任何疑问,请随时与我们联系。

这里是你获取有关 Solana 安全和开发所有信息的首选资源。在这里,我们深入研究 Solana 安全研究,提供细致的代码审查(审计),并分享我们对 Solana 和更广泛的区块链生态系统的见解、研究成果和观察。

  • 原文链接: toriisecurity.substack.c...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
toriisecurity
toriisecurity
江湖只有他的大名,没有他的介绍。