2 个版本

0.1.3 2022年3月16日
0.1.1 2022年3月16日

#4 in #terra

Apache-2.0

255KB
972

PFC-Tester

测试多个智能合约很困难。特别是当多个合约相互交互时。这个工具集旨在使集成测试更容易,并补充单元测试。它假定您正在使用 terra-rust 在本地创建钱包/密钥。

包含两个组件。PFC-Loader 和 PFC-Replayer

PFC-loader

将尝试在指定的目录(默认为 ./resources)中存储和实例化 WASM 文件(默认为 resources 目录)

对于它找到的每个 WASM 文件,它将使用模式 &<;&>;.xyz.wasm -> &<;&>;*.init.json&<;&>;*.migrate.json 查找相应的 'json' 文件集,并尝试实例化它们。此模式允许您使用相同的 WASM 文件实例化多个合约。

它将生成 2 个文件 'code_id.env' 和 'contracts.env',其中包含与文件名及其相关合约地址匹配的名称值对。

例如

CW20_LEGACY=terra1....
CW20_LEGACY_2=terra1....

cw20_legacy_2_CONTRACT_CODE=52902
cw20_legacy_2=terra1c74qfh0z3zrh9kkxs5c29dtm33p5zj5ttjjpw9
cw20_legacy_CONTRACT_CODE=52902
cw20_legacy=terra13fccf5mdrrmta5ln22ca4w3patd2v34g6l927a
terra_peep721_CONTRACT_CODE=52901
terra_peep721=terra1ypknwvsjvrcvju38ydtqf0dygvlzccv0mf788j

这些文件可以手动修改,并且也被 replayer 读取,其值准备好集成到 replayer 请求中

用法

大多数项目可以从环境或 '.env' 文件中读取,如果存在的话

 $ pfc-loader --help

将显示参数和用法。一个示例运行,使用资源/init 目录中的 WASM 文件

 $ pfc-loader --sender test --test_directory resources/init

[2022-03-16T01:01:40Z INFO  terra_rust_cli::cli_helpers] Using Gas price of 0.01133uluna
[2022-03-16T01:01:42Z INFO  terra_rust_api::client::tx] TX broadcast #messages =1
[2022-03-16T01:01:56Z INFO  terra_rust_api::client::tx] TX broadcast #messages =1
[2022-03-16T01:02:08Z INFO  terra_rust_api::client::tx] TX broadcast #messages =1
[2022-03-16T01:02:17Z INFO  pfc_loader] code_id.env stored
[2022-03-16T01:02:17Z INFO  pfc_loader] WASMs ["terra_peep721", "cw20_legacy", "pfc_XXXXXXX"]
[2022-03-16T01:02:17Z INFO  terra_rust_api::client::tx] TX broadcast #messages =1
[2022-03-16T01:02:22Z INFO  terra_rust_api::client::tx] TX broadcast #messages =1
[2022-03-16T01:02:30Z INFO  terra_rust_api::client::tx] TX broadcast #messages =1
[2022-03-16T01:02:34Z INFO  terra_rust_api::client::tx] TX broadcast #messages =1
[2022-03-16T01:02:41Z INFO  pfc_loader] contracts.env stored

$ cat code_id.env
# Generated 2022-03-16T01:02:17.092602700+00:00
# To force re-storage, remove the line. This will re-store the code, and do migrate
#
#
terra_peep721_CODE=53088
cw20_legacy_CODE=53089
pfc_XXXXXX_CODE=53087
$ cat contracts.env
# Generated 2022-03-16T01:02:41.753588900+00:00
# To force re-instantiation, remove the line. This will re-instantiation the code
#
#
pfc_XXXXXX_CONTRACT_CODE=53087
pfc_XXXXXX=terra1pje3hw3cufl3t6ayuu0xn827xcy783tr7248df
cw20_legacy_CONTRACT_CODE=53089
cw20_legacy=terra12m8wthgl9wjk90kx8gukrn4m7hsdrj07q4qk8c
terra_peep721_CONTRACT_CODE=53088
terra_peep721=terra1crc8ctl5fvtv9yqs4n7de9qz5y2qm37yle6fux
cw20_legacy_2_CONTRACT_CODE=53089
cw20_legacy_2=terra1xjg8nrj2qt9cykne5l3pa208tj0x69xk7cm9ld

如果您觉得太简略,请将您的 RUST_LOG 环境变量更改为 'info' 或 'debug'

PFC-replayer

replayer 从目录中读取以 *.test.json 结尾的输入文件 示例 并尝试执行这些命令并验证输出是否匹配。

目前有3种类型的命令。

  • 查询 ... 对合约运行查询,并验证JSON响应
  • 执行 ... 执行智能合约操作,并验证其返回的属性
  • 发送 ... 向个人/合约发送一些原生币

json替换代码

在json文件中,PFC-replayer将尝试扩展某些可能出现在消息中的常见变量

  • ###SENDER### - 初始化动作的账户
  • ###CODE_ID### - WASM的代码ID(仅实例化消息)
  • ###ADMIN### - 管理员账户(仅实例化/迁移消息)
  • ###CONTRACT### - 合约地址(仅迁移消息)
  • ###NEW_CODE_ID### - 新WASM的代码ID(仅迁移消息)
  • ###E:XXXX### - 环境变量'XXXX'的内容
  • ###V:XXXX### - 变量'XXXX'的内容。 (例如随机数)
  • ###A:XXXX### - 钱包中私钥'XXXX'的账户地址
  • ###O:XXXX### - 钱包中私钥'XXXX'的操作地址

测试文件有2个参数,

  • random_per_file - 将指示生成器为文件生命周期创建N个名为RAND_FILE_1 -> N的随机变量
  • random_per_command - 将指示生成器为命令生命周期创建N个名为RAND_CMD_1 -> N的随机变量

目的是能够随机生成如NFT代币名称/ID等独特的东西。

用法

大多数项目可以从环境或 '.env' 文件中读取,如果存在的话

$ pfc-replayer --help

将显示参数和用法。一个示例运行,在资源目录中的测试脚本。当前工具将运行所有以*.test.json结尾的文件。

[2022-03-16T01:10:15Z INFO  terra_rust_cli::cli_helpers] Using Gas price of 0.01133uluna
[2022-03-16T01:10:15Z INFO  pfc_replayer] resources\cw20_load.test.json
[2022-03-16T01:10:16Z INFO  pfc_replayer] OK: Query - terra12m8wthgl9wjk90kx8gukrn4m7hsdrj07q4qk8c
[2022-03-16T01:10:16Z INFO  pfc_replayer] OK: Query test minter terra12m8wthgl9wjk90kx8gukrn4m7hsdrj07q4qk8c
[2022-03-16T01:10:16Z INFO  pfc_replayer] OK: Query balance terra12m8wthgl9wjk90kx8gukrn4m7hsdrj07q4qk8c
[2022-03-16T01:10:16Z INFO  pfc_replayer] OK: Query NFT tokens should be empty terra1crc8ctl5fvtv9yqs4n7de9qz5y2qm37yle6fux
[2022-03-16T01:10:17Z INFO  terra_rust_api::client::tx] TX broadcast #messages =1
[2022-03-16T01:10:27Z INFO  pfc_replayer] OK Bank Send send funds terra1n3g37dsdlv7ryqftlkef8mhgqj4ny7p8v78lg7-> terra1hlxy5gduv0mvm2kks0eamymuzm4c9xmmjklavj # 20uluna
[2022-03-16T01:10:28Z INFO  pfc_replayer] OK: Exec NFT config terra1crc8ctl5fvtv9yqs4n7de9qz5y2qm37yle6fux -- Error
[2022-03-16T01:10:29Z INFO  terra_rust_api::client::tx] TX broadcast #messages =1
[2022-03-16T01:10:45Z ERROR pfc_replayer] Transaction 34DBFB6C0C3EFFB19556D0399F2825526CA7C3B229CFF3840086DAA5201F7BFE not found after 5 attempts

在这种情况下,测试失败,因为链花费了太长时间返回交易。使用'retries 10'重新运行解决了问题

$ pfc-replayer --sender test --retries 10
[2022-03-16T01:12:27Z INFO  terra_rust_cli::cli_helpers] Using Gas price of 0.01133uluna
[2022-03-16T01:12:27Z INFO  pfc_replayer] resources\cw20_load.test.json
[2022-03-16T01:12:28Z INFO  pfc_replayer] OK: Query - terra12m8wthgl9wjk90kx8gukrn4m7hsdrj07q4qk8c
[2022-03-16T01:12:28Z INFO  pfc_replayer] OK: Query test minter terra12m8wthgl9wjk90kx8gukrn4m7hsdrj07q4qk8c
[2022-03-16T01:12:29Z INFO  pfc_replayer] OK: Query balance terra12m8wthgl9wjk90kx8gukrn4m7hsdrj07q4qk8c
[2022-03-16T01:12:29Z INFO  pfc_replayer] OK: Query NFT tokens should be empty terra1crc8ctl5fvtv9yqs4n7de9qz5y2qm37yle6fux
[2022-03-16T01:12:29Z INFO  terra_rust_api::client::tx] TX broadcast #messages =1
[2022-03-16T01:12:37Z INFO  pfc_replayer] OK Bank Send send funds terra1n3g37dsdlv7ryqftlkef8mhgqj4ny7p8v78lg7-> terra1hlxy5gduv0mvm2kks0eamymuzm4c9xmmjklavj # 20uluna
[2022-03-16T01:12:37Z INFO  pfc_replayer] OK: Exec NFT config terra1crc8ctl5fvtv9yqs4n7de9qz5y2qm37yle6fux -- Error
[2022-03-16T01:12:38Z INFO  terra_rust_api::client::tx] TX broadcast #messages =1
[2022-03-16T01:12:48Z INFO  pfc_replayer] OK: Exec NFT config terra1crc8ctl5fvtv9yqs4n7de9qz5y2qm37yle6fux

有关更多示例,请参阅资源目录

许可证

ASL 2.0 - 查看LICENSE

PFC

如果您认为这很有用,请随时委托给PFC验证器。这将有助于分担费用。

PFC - 如同Terra完全是关于珍贵分数选择一样...请随意给我发消息

依赖项

~26–42MB
~655K SLoC