Hegelとは?Hypothesisの作者が開発した多言語対応プロパティベーステストライブラリ【Rust対応・2026年最新】

元記事を読む
キュレーターコメント

Python の Hypothesis 作者が「全言語に同等品質を」という野心で作った Hegel は、プロパティベーストテスト入門としても読み応えがある。Rust でテストの質を上げたいエンジニアに強くおすすめしたい一本。

概要

プロパティベーステストの「本家」が多言語展開へ

Pythonのプロパティベーステストライブラリ Hypothesis を書いた David MacIver 氏が、2025年11月にソフトウェア信頼性テストプラットフォーム Antithesis に参加した。そして今回、その必然的な帰結として誕生したのが Hegel——あらゆる言語に Hypothesis 品質のプロパティベーステストを届けることを目指した、新しいライブラリファミリーだ。

タイトルの「Hypothesis(命題)→ Antithesis(反命題)→ Synthesis(統合)」はヘーゲル弁証法のもじり。ギャグのようでいて、コンセプトをそのまま表している。

プロパティベーステストとは何か?

通常のユニットテストは「具体的な入力値に対して期待する出力値を確認する」もの。一方、プロパティベーステストは「この性質はあらゆる入力に対して成り立つはずだ」という 性質(プロパティ) を宣言し、ライブラリが自動でランダムな入力を大量生成してテストする手法だ。

典型的なプロパティの例:

  • 「クラッシュしない」 — パーサーやデシリアライザはどんな入力でもpanicせずエラーを返すべき
  • 「ラウンドトリップ」 — シリアライズ → デシリアライズで元の値に戻るべき
  • 「冪等性」 — 同じ処理を2回適用しても結果が変わらないべき

これらは「自分で全パターンを書くのは不可能」だが、「性質なら書ける」典型例。Hegel はその性質を Rust のコードで宣言するだけで、1000通りの入力を自動生成して検証してくれる。

Hegel for Rust のコード例

#[hegel::test(test_cases = 1000)]
fn test_fraction_parse_robustness(tc: hegel::TestCase) {
    let s: String = tc.draw(generators::text());
    let _ = Fraction::from_str(&s); // パニックしてはいけない
}

これだけで fraction クレートの from_str("0/0") がエラーではなくpanicするバグを発見した。ゼロ除算という「よくある見落とし」をライブラリが自動で突いてくれる。

より高度な例として、カスタムジェネレーターを使った ラウンドトリップテスト も紹介されている。rust_decimal クレートが科学的記数法への変換でゼロを正しく扱えないバグも、同様の手法で発見された。

#[hegel::test(test_cases = 1000)]
fn test_decimal_scientific_roundtrip(tc: hegel::TestCase) {
    let d = tc.draw(decimal_gen());
    let sci = format!("{:e}", d);
    let parsed = Decimal::from_scientific(&sci)
        .expect(&format!("Failed to parse {:?} from {}", sci, d));
    assert_eq!(d, parsed);
}

Antithesis との統合が「本命」

Hegel 単体でも十分強力だが、真の強みは Antithesis プラットフォームとのシームレスな統合にある。Antithesis は決定論的シミュレーションテストを核とした分散システム信頼性テストのサービスで、Hegel と組み合わせることでバグ発見力が大幅に向上するとのこと。

現在のリリース状況と今後のロードマップ:

  • Rust: 本日リリース済み
  • Go: 1〜2週間以内にリリース予定
  • C++ / OCaml / TypeScript: 準備中、数週間〜数ヶ月以内

まとめ:「バグの3分類」と使いどころ

著者はプロパティベーステストで発見されるバグを大まかに3種類に分類している:

  1. ゼロを忘れた (上記の例がまさにこれ)
  2. そのデータ型は呪われていて、あなたは呪いに引っかかった
  3. (続きは記事で)

Hypothesis が Python エコシステムで果たした役割を、Hegel はマルチ言語で実現しようとしている。特に Rust エンジニアは今すぐ試せる状態にある。パーサー・シリアライザ・プロトコル実装を書いているなら、ライブラリページをチェックしてみる価値は十分にある。