#public-key #proptest #bitcoin

bitcoin-proptest

针对比特币相关代码的Proptest策略

3个版本

0.0.1-alpha.32024年7月1日
0.0.1-alpha.22024年4月28日
0.0.1-alpha.12024年4月27日

#12 in #proptest

Download history 214/week @ 2024-04-28 2/week @ 2024-05-05 178/week @ 2024-06-30 2/week @ 2024-07-07

241 每月下载量

Apache-2.0 OR MIT

57KB
1K SLoC

Rust比特币Proptest策略

针对比特币相关代码的Proptest策略。

这个生成器集合(在proptest术语中称为“策略”)帮助Rust语言编写的比特币相关软件的开发者向基于属性的测试提供随机数据——有效和无效的数据。

访问文档获取详细信息。

示例

#[cfg(test)]
mod tests {
  proptest! {
     #[test]
     // generates valid hex-encoded public keys, both compressed and uncompressed
     fn pubkey_parsing(s in prop::secp256k1::public_key::valid::hex()) {
        prop_assert!(s.len() == 66 || s.len() == 130);
        prop_assert!(my_parser(s).is_ok());
     }
  }
}

lib.rs:

Rust比特币Proptest策略

针对比特币相关代码的Proptest策略。

这个生成器集合(在proptest术语中称为“策略”)帮助Rust语言编写的比特币相关软件的开发者向基于属性的测试提供随机数据——有效和无效的数据。

基本规则

  1. 除非文档中指定,策略将生成任何东西,即所有可能的变体,有效和无效的,只要类型允许,例如
  • “生成描述符”意味着任何类型,有效和无效的
  • “生成有效描述符”意味着任何类型,全部有效
  1. 每个策略还有一个相邻的策略,称为build,可以指定输入(以策略的形式),例如

组织

所有策略都放置在模块 prop 中,按类别排序。在每一个类别中,通常都有一个嵌套的模块集,用于进一步指定策略的属性。这些模块通常组织为 prop::category::what::what::what::how(),其中 how() 是返回特定格式的 what 的策略,例如:prop::secp256k1::public_key::invalid::compressed::vec()

如果一个策略(以函数的形式)与其他模块放置在同一级别,它们通常会产生该级别所有模块的混合。例如 prop::secp256k1::public_key::valid::vec() 将生成压缩和非压缩公钥的字节向量,而 prop::secp256k1::public_key::vec() 将生成有效和无效的、压缩以及非压缩的公钥。

示例

#[cfg(test)]
mod tests {
proptest! {
#[test]
// generates valid hex-encoded public keys, both compressed and uncompressed
fn pubkey_parsing(s in prop::secp256k1::public_key::valid::hex()) {
prop_assert!(s.len() == 66 || s.len() == 130);
prop_assert!(my_parser(s).is_ok());
}
}
}

二进制

一个伴随的二进制(以示例的形式)允许打印具有文本输出的策略的样本。默认情况下打印10个样本,可以通过传递参数 -n 来修改样本的数量。使用 --help 可以显示所有参数的描述。

$> cargo run --example samples -- --list

bitcoin/address
bitcoin/address/p2pkh
bitcoin/address/p2wpkh
bitcoin/address/p2sh
bitcoin/address/p2shwpkh
bitcoin/bip32/xpriv
bitcoin/bip32/xpub
bitcoin/descriptor/pkh
bitcoin/descriptor/pkh/valid
bitcoin/descriptor/pkh/invalid
[…]

$> cargo run --example samples -- bitcoin/address

mgV22Th8EoBjK3F8gkq12darpYKfZhRVVC
2N4H6BHitgp1X3XxBJchXDC7Js8vuwn9nLR
2NEWWVbyXiFEJy1rijrqWAYWsKuPfgq4iSG
2MwBxE5uhRjMn6oQCVDCibtxgLq5eYmai4Y
1FS9MqvDR5e23TmmkG3UgxWhHwmxChkTAd
3AmhvjgGiqpUX8bDNGiv75cr1oF9j5sEp1
2MvdWb16UVVzJg1BatV7UHR1paKH2TVdX79
mhss96DFw9FsdqBx2kWN4w1irRixh1f2Me
mtodi2dJnPP4GBbTqsbRD9Z4JdHc9mMwMW
19WsVuhxY2h9czLcgrhvW5a5hUAUsDNjB6

依赖项

~16MB
~219K SLoC