【ぷろぱてぃべーすてすと】

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

💡 「こういう性質を満たすはず」と宣言したら、反例を自動で探してくれるテスト
📌 このページのポイント
プロパティベーステスト — ランダム入力で性質を検証 従来のテスト(Example-based) 入力: 2, 3 → 期待値: 5 入力: 0, 0 → 期待値: 0 入力: -1, 1 → 期待値: 0 人が選んだ数例のみ プロパティベーステスト 性質: add(a,b) == add(b,a) ランダムに100回以上検証 失敗時は最小反例を報告 自動生成で網羅的にチェック 性質を定義 「常に成り立つ条件」 ランダム生成 大量の入力データ 性質を検証 全件チェック Shrink 失敗の最小反例 よく使うプロパティの例 可換性 / 結合性 / 冪等性 / ラウンドトリップ(encode→decode=元の値)
プロパティベーステスト — ランダム入力による性質の検証
ひよこ ひよこ

普通のテストと何が違うの?

ペンギン先生 ペンギン先生

普通のテスト(例ベーステスト)は「sort([3,1,2])が[1,2,3]になる」みたいに具体例で確認するよね。プロパティベーステストは「どんな配列をソートしても、結果は昇順になる」「要素数は変わらない」という性質を定義して、大量のランダム配列で検証するんだ。

ひよこ ひよこ

ランダムって信頼できるの?

ペンギン先生 ペンギン先生

1回のテスト実行で100〜1000個のランダムデータを生成するから、人間が思いつかないエッジケースを発見できるんだ。空配列、巨大な数値、負の数、特殊文字…手動では書ききれないケースをカバーできるよ。

ひよこ ひよこ

失敗したらどうなるの?

ペンギン先生 ペンギン先生

ここが賢いところで、「シュリンク」という機能が動くんだ。失敗した入力データを少しずつ小さくして、性質が破れる最小の反例を見つけてくれる。「1000要素の配列で失敗」→「実は[0, -1]の2要素で再現する」みたいに絞り込んでくれるよ。

ひよこ ひよこ

どんなプロパティを書けばいいの?

ペンギン先生 ペンギン先生

代表的なパターンがあるよ。「往復テスト」はエンコード→デコードで元に戻ること。「冪等性」は同じ操作を2回やっても結果が変わらないこと。「モデルベース」は単純な参照実装と同じ結果になること。これらをテンプレートとして使うと書きやすいんだ。

ひよこ ひよこ

JavaScriptでもできる?

ペンギン先生 ペンギン先生

fast-checkというライブラリが有名だよ。JestVitestと組み合わせて使える。Pythonならhypothesis、RustならpropTestがある。どの言語でもだいたいプロパティベーステストのライブラリがあるから、すぐに始められるよ。

ひよこ ひよこ

例ベーステストはもう要らない?

ペンギン先生 ペンギン先生

両方使うのがベストだよ。例ベーステストはドキュメントとしてわかりやすいし、ビジネスロジックの具体的な振る舞いを確認するのに向いている。プロパティベーステストは網羅性を高めるのに向いている。組み合わせることでテストの信頼性が格段に上がるんだ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「プロパティベーステスト」って出てきたら「ランダムデータで性質を検証するテスト」と思えればだいたいOK!
📖 おまけ:英語の意味
「Property-Based Testing」 = 性質ベーステスト
💬 2000年にHaskellのQuickCheckライブラリとして登場したのが始まりだよ
← 用語集にもどる