40 个版本 (14 个稳定版)

1.5.0 2024 年 8 月 12 日
1.4.2 2024 年 7 月 2 日
1.4.1 2024 年 5 月 13 日
1.1.1 2024 年 2 月 12 日
0.0.0 2022 年 10 月 5 日

#depending 中排名 10

Download history 527/week @ 2024-04-22 19/week @ 2024-04-29 261/week @ 2024-05-06 167/week @ 2024-05-13 53/week @ 2024-05-20 12/week @ 2024-05-27 13/week @ 2024-06-03 10/week @ 2024-06-10 3/week @ 2024-06-17 15/week @ 2024-06-24 224/week @ 2024-07-01 227/week @ 2024-07-08 227/week @ 2024-07-15 222/week @ 2024-07-22 162/week @ 2024-07-29 153/week @ 2024-08-05

每月下载量 777
用于 4 crate(其中 3 个直接使用)

GPL-3.0 许可

1MB
22K SLoC

用于编写 Gear 程序端到端测试的实用库。

当需要使用测试覆盖程序代码时,可以将此 crate 视为 gtest 的补充。当 gtest 最适合单元和集成测试时,gclient 更适合高级调试。

gclient 用于测试与真实区块链网络交互的 Gear 程序。它允许您通过连接到网络来发送外联和 RPC。

需要强调的是,使用 gclient 进行测试需要运行节点作为测试套件的第二部分。 gclient 通过 WebSocket 协议与节点交互。根据测试目的,gclient 可以与本地或远程节点通信。最佳选择是在初始调试和持续集成中使用 开发者模式下的本地节点

使用 gclient 进行测试比使用 gtest 慢,并产生更多的构建工件,因此它更适合作为质量控制的最后一环。然而,gclient 提供了最准确测试结果。

使用方法

要使用 gclient 库,您必须在 Cargo.toml 文件的 [dev-dependencies] 块中导入它。此外,您还需要添加一些与 gclient 一起使用的外部 crate。

# ...

[dev-dependencies]
gclient = { git = "https://github.com/gear-tech/gear.git" }
tokio = { version = "1.23.0", features = ["full"] }

[patch.crates-io]
sp-core = { git = "https://github.com/gear-tech/substrate.git", branch = "gear-stable" }
sp-runtime = { git = "https://github.com/gear-tech/substrate.git", branch = "gear-stable" }

https://get.gear.rs 下载您操作系统的最新 node 二进制文件。然后解压缩包并运行 node。这里我们假设 node 以开发者模式运行

./gear --dev

最后一步是在单独的 tests 目录中编写测试,并使用 cargo 来执行它们

cargo test

示例

一个简单的测试示例,上传程序并发送 PING 消息。

use gclient::{EventProcessor, GearApi, Result};

const WASM_PATH: &str = "./target/wasm32-unknown-unknown/release/first_gear_app.opt.wasm";

#[tokio::test]
async fn test_example() -> Result<()> {
    // Create API instance
    let api = GearApi::dev().await?;

    // Subscribe to events
    let mut listener = api.subscribe().await?;

    // Check that blocks are still running
    assert!(listener.blocks_running().await?);

    // Calculate gas amount needed for initialization
    let gas_info = api
        .calculate_upload_gas(None, gclient::code_from_os(WASM_PATH)?, vec![], 0, true)
        .await?;

    // Upload and init the program
    let (message_id, program_id, _hash) = api
        .upload_program_bytes_by_path(
            WASM_PATH,
            gclient::now_micros().to_le_bytes(),
            vec![],
            gas_info.min_limit,
            0,
        )
        .await?;

    assert!(listener.message_processed(message_id).await?.succeed());

    let payload = b"PING".to_vec();

    // Calculate gas amount needed for handling the message
    let gas_info = api
        .calculate_handle_gas(None, program_id, payload.clone(), 0, true)
        .await?;

    // Send the PING message
    let (message_id, _hash) = api
        .send_message_bytes(program_id, payload, gas_info.min_limit, 0)
        .await?;

    assert!(listener.message_processed(message_id).await?.succeed());

    Ok(())
}

依赖关系

~75MB
~1M SLoC