#测试框架 #trdelnik #solana #anchor #测试 #程序 #模糊测试

bin+lib trdelnik-sandbox-cli

Trdelník 是一个基于 Rust 的测试框架,为测试使用 Anchor 编写的 Solana 程序提供了一些方便的开发者工具。

5 个版本

0.2.0 2022 年 10 月 4 日
0.1.4 2022 年 7 月 13 日
0.1.3 2022 年 6 月 25 日
0.1.2 2022 年 5 月 13 日
0.1.0 2022 年 5 月 13 日

#5 in #trdelnik

自定义许可

450KB
9K SLoC

Trdelnik Logo

Trdelník

Ackee Blockchain Discord invitation

Ackee Blockchain 开发

Crates.io Crates.io Crates.io Crates.io
lint test-examples-turnstile

Trdelník 是一个基于 Rust 的测试框架,为测试使用 Anchor 编写的 Solana 程序提供了一些方便的开发者工具。

  • Trdelnik 客户端 - 构建和部署 Anchor 程序到本地集群,并对它运行测试套件;
  • Trdelnik 控制台 - 内置控制台,为开发者提供一个命令提示符,用于快速程序交互;
  • Trdelnik 模糊测试 - 属性和状态测试;
  • Trdelnik 探索器 - 探索账本更改。
Trdelnik Demo

依赖关系

安装

cargo install trdelnik-cli

# or the specific version

cargo install --version <version> trdelnik-cli

用法

# navigate to your project root directory
trdelnik init
# it will generate `.program_client` and `trdelnik-tests` directories with all the necessary files
trdelnik test
# want more?
trdelnik --help

如何编写测试?

// <my_project>/trdelnik-tests/tests/test.rs
// TODO: do not forget to add all necessary dependencies to the generated `trdelnik-tests/Cargo.toml`
use program_client::my_instruction;
use trdelnik_client::*;
use my_program;

#[throws]
#[fixture]
async fn init_fixture() -> Fixture {
  // create a test fixture
  let mut fixture = Fixture {
    client: Client::new(system_keypair(0)),
    // make sure your program is using a correct program ID
    program: program_keypair(1),
    state: keypair(42),
  };
  // deploy a tested program
  fixture.deploy().await?;
  // call instruction init
  my_instruction::initialize(
    &fixture.client,
    fixture.state.pubkey(),
    fixture.client.payer().pubkey(),
    System::id(),
    Some(fixture.state.clone()),
  ).await?;
  fixture
}

#[trdelnik_test]
async fn test_happy_path(#[future] init_fixture: Result<Fixture>) {
  let fixture = init_fixture.await?;
  // call the instruction
  my_instruction::do_something(
    &fixture.client,
    "dummy_string".to_owned(),
    fixture.state.pubkey(),
    None,
  ).await?;
  // check the test result
  let state = fixture.get_state().await?;
  assert_eq!(state.something_changed, "yes");
}

确保您的程序在 derive_id!(...) 宏和 Anchor.toml 文件中使用了正确的程序 ID。如果没有,请获取您使用的密钥对的公钥,并在这两个地方替换它。要获取密钥对的程序 ID(密钥对的公钥),可以使用 trdelnik key-pair 命令。例如

$ trdelnik key-pair program 7

将打印从 program_keypair(7) 接收到的密钥对信息。

带有自定义结构的说明

  • 如果您想测试具有自定义结构的指令作为参数
pub struct MyStruct {
  amount: u64,
}

// ...

pub fn my_instruction(ctx: Context<Ctx>, data: MyStruct) { /* ... */ }
  • 您应该在 .program_client 链接库中添加一个导入
// .program_client/src/lib.rs

// DO NOT EDIT - automatically generated file
pub mod my_program_instruction {
  use trdelnik_client::*;
  use my_program::MyStruct; // add this import

// ...
}
  • 此文件是自动生成的,但 use 语句将不会被重新生成

跳过测试

  • 您可以通过添加 #[ignore] 宏来跳过测试。
#[trdelnik_test]
#[ignore]
async fn test() {}

测试与关联令牌账户相关的程序

  • Trdelnik 没有导出 anchor-splspl-associated-token-account,因此您需要手动添加。
# <my-project>/trdelnik-tests/Cargo.toml
# import the correct versions manually
anchor-spl = "0.24.2"
spl-associated-token-account = "1.0.3"
// <my-project>/trdelnik-tests/tests/test.rs
use anchor_spl::token::Token;
use spl_associated_token_account;

async fn init_fixture() -> Fixture {
  // ...
  let account = keypair(1);
  let mint = keypair(2);
  // constructs a token mint
  client
    .create_token_mint(&mint, mint.pubkey(), None, 0)
    .await?;
  // constructs associated token account
  let token_account = client
    .create_associated_token_account(&account, mint.pubkey())
    .await?;
  let associated_token_program = spl_associated_token_account::id();
  // derives the associated token account address for the given wallet and mint
  let associated_token_address = spl_associated_token_account::get_associated_token_address(&account.pubkey(), mint);
  Fixture {
    // ...
    token_program: Token::id(),
  }
}
  • trdelnik init 命令为您生成了一个虚拟测试套件。
  • 有关更多详细信息,请参阅完整的测试实现

支持版本

  • 我们支持以下表中指定的 AnchorSolana 版本。
Trdelnik CLI Anchor Solana
最新版本 ~0.25.* >=1.10
v0.2.0 ~0.24.* >=1.9
  • 我们正在探索Anchor的新版本,请确保您只使用支持的版本。我们正在努力中 💪

配置

配置变量可以在生成的 Trdelnik.toml 文件中进行编辑,该文件位于项目的根目录下。

名称 默认值 描述
测试.validator_startup_timeout 10 000 在失败之前等待 solana-test-validator 的时间(以毫秒为单位)

路线图

  • 2022 年 Q1/22 在索拉纳黑客屋布拉格宣布 Trdelnik
    • Trdelnik 客户端可用于测试
  • 2022 年 Q2/22 Trdelnik 探索者可用
  • 2022 年 Q2/22 在索拉纳黑客屋巴塞罗那介绍了 Trdelnik 客户端和探索者
  • 2022 年 Q3/22 Trdelnik 控制台可用
  • 2022 年 Q4/22 Trdelnik 模糊测试可用

奖项

Marinade 社区奖 - 2022 年 Solana Riptide 黑客马拉松 Marinade 奖学金 的获奖者。

贡献

感谢您对为 Trdelník 做出贡献的兴趣!请参阅 CONTRIBUTING.md 了解如何进行。

许可证

本项目采用 MIT 许可证

大学和投资伙伴

依赖关系

~85MB
~1.5M SLoC