Property based testing
自動テストの手法の1つ
「システムのあるべき挙動を満たす条件」を満たすであろう入力をランダムに自動生成し実行することで、想定していない挙動をしないかどうか検証する手法
条件をプロパティと呼ぶ
従来の「明示的に入力例を与えて挙動を検証する手法」はExample based testingという
メリット (Example based testingとの比較)
テストケースの肥大化を防げる
テストケースの取りこぼしが発生しにくい
fuzzingとは違うのか?
プロパティベースドテスティングとは何か
原文: https://hypothesis.works/articles/what-is-property-based-testing/
ファジングとプロパティベースドテスティングが異なる特性を持っているように感じられるからです。プロパティベースドテスティングでは、プログラムがどのように振る舞うべきかについての推論が必要ですが、ファジングはプログラムの振る舞いを深く理解することなく任意のプログラムに適用できます
プロパティベースドテスティングとは、テストがファジングされた際に、そのテストの失敗がシステムの問題を明らかにするようなテストの構築です。特に、これらの問題はシステムの直接的なファジングでは明らかにならないものです。
https://medium.com/criteo-engineering/introduction-to-property-based-testing-f5236229d237
コードの正しさ検証する既存手法。右上に隙間がある
https://scrapbox.io/files/65fda899d10cf700250ed0e4.webp
It is also important to note that it does not — by any means — replace unit testing. It only provides an additional layer of tests that might prove very efficient to reduce some boilerplate tests.
既存テストを置き換えるものではなく、効率的なテストを追加する層
Rubyでの実績は?
ruby organizationで検索した結果
https://github.com/ruby/ruby/pull/5379#pullrequestreview-842291971
https://github.com/ruby/rbs/pull/1687#issuecomment-1862121351
RustとHaskellの比較
https://zenn.dev/jij_inc/articles/2024-12-18-pure-haskeller-writing-rust#性質ベーステスト
各言語の対応状況
Haskell
QuickCheck
これが元祖という説がある
私とテストと自動化と
Haskellを雑に使う
Elixir
PropCheck
Erlang
PropEr
JavaScript, TypeScript
fast-check
プロパティベーステストをやってみよう
Go
rapid
gopter
プロパティベーステストをGolangでやってみた 2023
Goにproperty based testingを布教したい 2021
Ruby
ruby-prop_check
rantly
プロパティベーステスト (Property Based Testing) を Ruby で書き雰囲気を味わう 2023
Rust
proptest