Hegel - Universal Property-Based Testing Protocol

基于Hypothesis的通用属性测试协议和库家族

⭐⭐⭐⭐ (4星)

探索来源

来源: Lobsters社区

原文链接: Hegel Official Site

核心亮点

  • 协议设计: 服务端/客户端架构,服务端处理数据生成和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))
}

执行流程:

  1. 首次运行测试时,客户端spawn服务器子进程并握手
  2. 客户端告诉服务器有新测试和设置 (test_cases=200)
  3. 当tc.draw被调用时,客户端发送generator schema给服务器
  4. 服务器生成匹配的值并返回
  5. 测试失败时,服务器执行shrink并返回最小失败用例

分类标签

测试 PBT 协议 工具 Hegel