核心亮点
- 协议设计: 服务端/客户端架构,服务端处理数据生成和shrink
- 语言无关: 协议设计不依赖特定编程语言
- 传输层: 当前使用Unix sockets,可扩展
- 基于Hypothesis: 建立在成熟的属性测试库之上
- 解决重复实现: 不再需要为每种语言重复实现PBT核心
工作原理
服务器实现属性测试的核心功能:数据生成、shrink等。客户端实现用户面向的语法和生成器,通过协议向服务器请求生成数据。
示例 (hegel-rust):
use hegel::{TestCase}
use hegel::generators::{integers}
#[hegel::test(test_cases = 200)]
fn test_a(tc: TestCase) {
let n: i32 = tc.draw(integers().min_value(100))
}
执行流程:
- 首次运行测试时,客户端spawn服务器子进程并握手
- 客户端告诉服务器有新测试和设置 (test_cases=200)
- 当tc.draw被调用时,客户端发送generator schema给服务器
- 服务器生成匹配的值并返回
- 测试失败时,服务器执行shrink并返回最小失败用例