mcpField
P
property-based-testing

property-based-testing

github.com/aj-geddesテスト・品質374451 回インストール34 週間前に更新
リポジトリ

property-based-testing について

property-based-testingは、自動生成した入力を使ってコードの一般的な性質や不変条件を検証するテスト手法です。境界ケースの発見に役立ち、サンプルベースのテストを補完します。

主な機能

  1. 01テスト入力の自動生成
  2. 02一般的な性質と不変条件の検証
  3. 03境界ケースの発見
  4. 04往復変換の検証
  5. 05失敗ケースの縮小

活用シーン

  1. 01アルゴリズムの数学的性質の検証
  2. 02パーサーやシリアライザーのテスト
  3. 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.md
hypothesis-for-python.md
junit-quickcheck-for-java.md
scripts/
scaffold-tests.sh
templates/
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 向け HypothesisPython 向け Hypothesis
JavaScript/TypeScript 向け fast-checkJavaScript/TypeScript 向け fast-check
Java 向け junit-quickcheckJava 向け junit-quickcheck

ベストプラクティス

✅ DO
  • 特定のケースではなく、一般的なプロパティに焦点を当てる
  • 数学的なプロパティ(可換性、結合性)をテストする
  • 往復のエンコード/デコードを検証する
  • 縮小化を使って、失敗するケースを最小化する
  • 既知のエッジケースには、例ベースのテストを組み合わせる
  • 常に成り立つべき不変条件をテストする
  • 現実的な入力分布を生成する
❌ DON'T
  • 恒真となるプロパティをテストしない
  • 入力生成に過剰な制約を設けない
  • 縮小されたテストの失敗を無視しない
  • すべての例ベースのテストをプロパティに置き換えない
  • 実装の詳細をテストしない
  • 制約なしに無効な入力を生成しない
  • ジェネレーターでエッジケースへの対応を忘れない

コメント