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 |
|
在 #depending 中排名 10
每月下载量 777
用于 4 个 crate(其中 3 个直接使用)
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