property-based-testing について
property-based-testingは、自動生成した入力を使ってコードの一般的な性質や不変条件を検証するテスト手法です。境界ケースの発見に役立ち、サンプルベースのテストを補完します。
主な機能
- 01テスト入力の自動生成
- 02一般的な性質と不変条件の検証
- 03境界ケースの発見
- 04往復変換の検証
- 05失敗ケースの縮小
活用シーン
- 01アルゴリズムの数学的性質の検証
- 02パーサーやシリアライザーのテスト
- 03データ変換やデータ構造操作の確認
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ aj-geddes/ useful-ai-prompts --skill property-based-testingインストール後、Claude Code で/property-based-testingを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/fast-check-for-javascripttypescript.mdhypothesis-for-python.mdjunit-quickcheck-for-java.mdscripts/scaffold-tests.shtemplates/test-template.js詳細
プロパティベーステスト
目次
概要
プロパティベーステストでは、特定の例をテストするのではなく、自動生成された幅広い入力に対して、コードが一般的なプロパティや不変条件を満たすことを検証します。このアプローチにより、例ベースのテストでは見逃されがちなエッジケースやバグを発見できます。
使用する場面
- 数学的なプロパティを持つアルゴリズムのテスト
- 常に成り立つべき不変条件の検証
- エッジケースの自動的な発見
- パーサーやシリアライザーのテスト(往復のプロパティ)
- データ変換の検証
- ソート、検索、データ構造の操作のテスト
- 予期しない入力の組み合わせの発見
クイックスタート
最小限の動作例:
# test_string_operations.py
import pytest
from hypothesis import given, strategies as st, assume, example
def reverse_string(s: str) -> str:
"""Reverse a string."""
return s[::-1]
class TestStringOperations:
@given(st.text())
def test_reverse_twice_returns_original(self, s):
"""Property: Reversing twice returns the original string."""
assert reverse_string(reverse_string(s)) == s
@given(st.text())
def test_reverse_length_unchanged(self, s):
"""Property: Reverse doesn't change length."""
assert len(reverse_string(s)) == len(s)
@given(st.text(min_size=1))
def test_reverse_first_becomes_last(self, s):
"""Property: First char becomes last after reverse."""
reversed_s = reverse_string(s)
assert s[0] == reversed_s[-1]
assert s[-1] == reversed_s[0]
// ... (see reference guides for full implementation)
リファレンスガイド
references/ ディレクトリにある詳細な実装:
| ガイド | 内容 |
|---|---|
| Python 向け Hypothesis | Python 向け Hypothesis |
| JavaScript/TypeScript 向け fast-check | JavaScript/TypeScript 向け fast-check |
| Java 向け junit-quickcheck | Java 向け junit-quickcheck |
ベストプラクティス
✅ DO
- 特定のケースではなく、一般的なプロパティに焦点を当てる
- 数学的なプロパティ(可換性、結合性)をテストする
- 往復のエンコード/デコードを検証する
- 縮小化を使って、失敗するケースを最小化する
- 既知のエッジケースには、例ベースのテストを組み合わせる
- 常に成り立つべき不変条件をテストする
- 現実的な入力分布を生成する
❌ DON'T
- 恒真となるプロパティをテストしない
- 入力生成に過剰な制約を設けない
- 縮小されたテストの失敗を無視しない
- すべての例ベースのテストをプロパティに置き換えない
- 実装の詳細をテストしない
- 制約なしに無効な入力を生成しない
- ジェネレーターでエッジケースへの対応を忘れない
コメント
Markdown 対応