hegel-ruby
hegeltestv0.3.1MIT
An unofficial Ruby implementation of the Hegel protocol. Hegel is a property-based testing framework based on Hypothesis. This gem drives libhegel, the same native engine that backs the Rust, Go, TypeScript, Java, OCaml, and C++ implementations.
インストール
gem install hegeltest- GitHub のソースコード
- このツールを使っているツール: bulldogger
hegel-ruby は、Hypothesis を基にしたプロパティベーステストのフレームワーク Hegel を Ruby で使えるようにします。 手で選んだ入力でテストする代わりに、すべての入力で成り立つべき性質を書きます。 Hegel は入力を生成してその性質を破ろうとし、失敗が見つかれば最小の反例まで縮めます。 この gem は、公式の実装と同じネイティブエンジン libhegel を同じプロセス内で動かすので、サーバーも Python も要りません。 非公式のサードパーティ実装です。 Hegel と libhegel は Antithesis, LLC のもので、この gem を同社がレビューしたり推奨したりしているわけではありません。
- どのテストフレームワークでも性質を書ける。
Hegel.test { |tc| ... }は RSpec の example の中でも Minitest のテストの中でも動きます。 失敗はフレームワーク自身の失敗として投げ直すので、フレームワークがそのまま報告します。 - 縮めて名前を付けた反例。
失敗すると、まだ失敗する最小の入力を報告し、
xs = [0, 0]のように、値を取り出した行から各値に名前を付けます。 あわせて、Hegel.testに渡すreproduce_failure:の文字列も出力します。 - 25 個のジェネレーター。
arrays、integers、text、from_regex、emails、uuidsなどがあり、どれもmapとfilterで組み合わせられます。include Hegel::Syntax::Methodsで、接頭辞なしで使えるようになります。 - 状態を持つテスト。
Hegel::StateMachineにルールと不変条件を宣言し、Hegel::Stateful.run(machine, tc)で実行します。 失敗は、まだ失敗する最短のルールの並びまで縮めます。 - 実行の調整。
Hegel.testはtest_cases、seed、phasesなどのキーワードを受け取ります。database_key:を渡すと libhegel の example database が有効になり、保存した失敗例を次回の最初に再現します。 - コンパイル不要。
プラットフォームごとの gem がそれぞれの
libhegelのビルドを同梱しています。 対象は Linux、macOS の arm64、Windows です。
エージェントでの使い方
Section titled “エージェントでの使い方”- コードの性質を見つけます。 往復変換、不変条件、より単純なモデルとの一致などです。
- その性質を
Hegel.test do |tc| ... endとして書き、各入力をtc.drawで取り出します。 - テストスイートを実行します。
性質が破れたら、縮められた反例を読んでコードを直し、出力された文字列を
reproduce_failure:に渡してその入力をそのまま再現します。
リポジトリには hegel-ruby スキルも含まれていて、RSpec や Minitest などでこうしたテストを書く方法をエージェントに伝えます。
# Gemfilegem "hegeltest"すでに Gemfile.lock があるプロジェクトでは、CI で使うプラットフォームを bundle lock --add-platform x86_64-linux のように追加します。
そのうえで spec_helper.rb か test_helper.rb で require "hegel" し、テストのクラスに Hegel::Syntax::Methods を include します。