Mollusk
使用 Mollusk 在 Rust 中为 Solana 程序编写测试。
Mollusk 是一个轻量级的测试工具,用于 Solana 程序。它提供了一个简单的接口,用于在一个精简的 Solana 虚拟机 (SVM) 环境中测试 Solana 程序的执行。
它不会创建任何类似验证器运行时的东西,而是直接从底层的 SVM 组件提供程序执行管道。
总结一下,主要处理器 - process_instruction
- 创建了 Agave 程序缓存、交易上下文和调用上下文的精简实例。它使用这些组件直接通过 BPF Loader 执行提供的程序的 ELF。
由于它不使用 AccountsDB、Bank 或任何其他大型 Agave 组件,该工具包非常快速。然而,它确实需要用户提供一个明确的账户列表以供使用,因为它没有地方可以加载它们。
可以通过调整计算预算、功能集或系统变量来进一步配置测试环境。这些配置直接存储在测试工具包(Mollusk
结构体)上,但可以通过一些辅助工具进行操纵。
提供了四种主要的 API 方法:
process_instruction
: 处理一个指令并返回结果。process_and_validate_instruction
: 处理一个指令并对结果执行一系列检查,如果任何检查失败则 panic。process_instruction_chain
: 处理一个指令链并返回结果。process_and_validate_instruction_chain
: 处理一个指令链并对每个结果执行一系列检查,如果任何检查失败则 panic。
单指令
process_instruction
和 process_and_validate_instruction
都处理单指令。前者只是处理指令并返回结果,而后者处理指令然后对结果执行一系列检查。在这两种情况下,结果也会返回。
要通过 process_and_validate_instruction
应用检查,开发者可以使用 Check
枚举,它提供了一组常见的检查。
注意:Mollusk::default()
会创建一个新的 Mollusk
实例,而不会添加任何提供的 BPF 程序。它仍然包含一部分默认的内置程序。对于更多的内置程序,你可以自己添加它们,或者使用 all-builtins
功能。
指令链
process_instruction_chain
和 process_and_validate_instruction_chain
都处理指令链。前者处理链中的每个指令并返回最终结果,而后者处理链中的每个指令并对每个结果执行一系列检查。在这两种情况下,最终结果也会返回。
The must_pass
argument can be provided to trigger a panic if any defined benchmark tests do not pass. out_dir
specifies the directory where the markdown file will be written.
Developers can invoke this benchmark test with cargo bench
. They may need to add a bench to the project's Cargo.toml
.
The markdown file will contain entries according to the defined benchmarks.