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

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

最終更新:
💡 「こうなるはず」という性質から、反例を探す

コードが満たすべき性質を決め、生成したさまざまな入力で確かめるテスト手法です。失敗する入力を探し、小さくして原因を調べやすくする機能もあります。

📌 このページのポイント
具体例を確かめる/性質で反例を探す例ベース[3, 1, 2] をソート↓[1, 2, 3] になる?✓ 選んだ例を確認プロパティベース入力を自動生成↓昇順 + 要素を保つ?✓ 性質を確認失敗したら、入力を縮小例:長い配列 → [0, −1]両方を使う。全入力の証明ではない
ソートのテスト例。失敗した入力を小さくして調べますが、必ず全体の最小反例を得られるとは限りません。
ひよこ ひよこ
普通のテストと何が違うの?
ペンギン先生 ペンギン先生
例ベースなら「[3,1,2]をソートすると[1,2,3]」と確かめるよね。プロパティベースでは「結果が昇順」「元と同じ要素が同じ個数ある」という性質を決めて、生成したいろいろな配列で確かめるんだ。
ひよこ ひよこ
データは、ただでたらめに作るの?
ペンギン先生 ペンギン先生
整数だけ、文字列、配列など、入力の形や範囲を指定するよ。空の配列や重複を含む値も試せる。想定外のケースを見つける助けになるけれど、指定しなかった入力やすべての組み合わせまで調べるわけではないんだ。
ひよこ ひよこ
失敗した入力が長かったら、調べにくそう。
ペンギン先生 ペンギン先生
シュリンクという縮小機能が、失敗する条件を残しながら入力を小さくしようとするよ。たとえば長い配列から[0,-1]まで減ることがある。ただし、あらゆる反例の中で最小のものが必ず得られるという意味ではないんだ。
ひよこ ひよこ
どんな性質を書けばいいの?
ペンギン先生 ペンギン先生
保存して読み直すと元に戻る、同じ処理を2回しても結果が変わらない、単純な参照実装と一致する、などだよ。ソートなら「昇順」だけでは、いつも空配列を返すバグを見逃す。何を守るべきかを考えるのが大切だね。
ひよこ ひよこ
JavaScriptでも使える?例のテストは残す?
ペンギン先生 ペンギン先生
fast-checkをJestやVitestなどと組み合わせられるよ。生成条件と実行回数を調整し、失敗時のseedなどを残すと再現しやすい。大事な具体例や直したバグのテストも残して、両方を使おう。合格しただけでバグがないと証明されるわけではないよ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「プロパティベーステスト」って出てきたら「性質を決めて、生成した入力で反例を探すテスト」と思えばだいたいOK!
📖 おまけ:英語の意味
「Property-Based Testing」 = 性質に基づくテスト
💬 propertyは、ここではコードが満たすべき性質のこと。入出力の関係などをテストにするんだ。

参考資料

← 用語集にもどる