pict-test-designer について
要件やコードをもとに、PICTでペアワイズテストスイートを設計するスキルです。パラメーター、値、制約、期待結果の整理を支援し、モデルとテストケースをソフトウェアテスト向けにまとめます。
主な機能
- 01パラメーターと制約の特定
- 02PICTモデルの作成
- 03ペアワイズテストケースの生成
- 04期待結果の定義
- 05テストスイートの表形式化
- 06Pythonヘルパースクリプトの利用
活用シーン
- 01複数入力を持つ機能のテスト設計
- 02設定テストの組み合わせ削減
- 03APIやフォームのテストマトリクス作成
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ omkamal/ pypict-claude-skill --skill pict-test-designerインストール後、Claude Code で/pict-test-designerを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
.gitignoreCONTRIBUTING.mdCHANGELOG.mdLICENSESTRUCTURE.mdPUBLISHING.mdQUICKSTART.mdREADME.md.claude-plugin/plugin.jsonmarketplace.json.github/pull_request_template.mdmarkdown-link-check-config.json.github/ISSUE_TEMPLATE/feature_request.mdbug_report.md.github/workflows/ci.ymlexamples/README.mdatm-test-plan.mdgearbox-test-plan.mdatm-specification.mdgearbox-specification.mdreferences/pict_syntax.mdexamples.mdreleases/README.mdscripts/README.mdpict_helper.py詳細
PICT テスト設計
このスキルでは、PICT(ペアワイズ独立組み合わせテスト)を使用して体系的にテストケースを設計できます。要件またはコードを受け取ると、システムを分析してテストパラメーターを特定し、適切な制約を含む PICT モデルを生成し、そのモデルを実行してペアワイズテストケースを作成し、期待される出力とともに結果を整形します。
このスキルを使用するタイミング
次の場合にこのスキルを使用してください:
- 複数の入力パラメーターを持つ機能、関数、またはシステムのテストケースを設計するとき
- 組み合わせが多数ある設定向けのテストスイートを作成するとき
- 最小限のテストケースで包括的なカバレッジを実現したいとき
- テストシナリオを特定するために要件を分析するとき
- 複数の条件分岐を持つコードを扱うとき
- API エンドポイント、ウェブフォーム、またはシステム設定向けのテストマトリックスを作成するとき
ワークフロー
テストを設計するには、次の手順に従ってください。
1. 要件またはコードを分析する
ユーザーの要件またはコードから、次の項目を特定します:
- パラメーター:入力変数、設定オプション、環境要因
- 値:各パラメーターで考えられる値(同値分割を使用)
- 制約:ビジネスルール、技術的な制限、パラメーター間の依存関係
- 期待される結果:さまざまな組み合わせで想定される動作
分析例:
次の要件を持つログイン関数の場合:
- ユーザーはユーザー名とパスワードでログインできます
- 2FA(オン/オフ)に対応します
- 信頼済みデバイスでログイン状態を記憶します
- ログイン失敗が 3 回続くとレート制限を適用します
特定されたパラメーター:
- Credentials:有効、無効
- TwoFactorAuth:有効、無効
- RememberMe:チェック済み、未チェック
- PreviousFailures:0、1、2、3、4
2. PICT モデルを生成する
次の内容を含む PICT モデルを作成します:
- 明確なパラメーター名
- 適切に定義された値の集合(同値分割と境界値を使用)
- 無効な組み合わせに対する制約
- ビジネスルールを説明するコメント
モデルの構造:
# Parameter definitions
ParameterName: Value1, Value2, Value3
# Constraints (if any)
IF [Parameter1] = "Value" THEN [Parameter2] <> "OtherValue";
次の項目については、references/pict_syntax.md を参照してください:
- 完全な構文リファレンス
- 制約の文法と演算子
- 高度な機能(サブモデル、エイリアス、ネガティブテスト)
- コマンドラインオプション
- 詳細な制約パターン
次の項目については、references/examples.md を参照してください:
- 分野別の実践的な例
- ソフトウェア関数のテスト例
- ウェブアプリケーション、API、モバイルアプリのテスト例
- データベースと設定のテストパターン
- 認証、リソースアクセス、エラー処理に関する一般的なパターン
3. PICT モデルを実行する
PICT モデルのテキストを生成し、ユーザー向けに整形します。Python コードを直接使ってモデルを処理できます:
# Define parameters and constraints
parameters = {
"OS": ["Windows", "Linux", "MacOS"],
"Browser": ["Chrome", "Firefox", "Safari"],
"Memory": ["4GB", "8GB", "16GB"]
}
constraints = [
'IF [OS] = "MacOS" THEN [Browser] IN {Safari, Chrome}',
'IF [Memory] = "4GB" THEN [OS] <> "MacOS"'
]
# Generate model text
model_lines = []
for param_name, values in parameters.items():
values_str = ", ".join(values)
model_lines.append(f"{param_name}: {values_str}")
if constraints:
model_lines.append("")
for constraint in constraints:
if not constraint.endswith(';'):
constraint += ';'
model_lines.append(constraint)
model_text = "\n".join(model_lines)
print(model_text)
ヘルパースクリプトを使用する場合(任意):
Scripts/pict_helper.py スクリプトには、モデルの生成と出力の整形に使えるユーティリティが用意されています:
# Generate model from JSON config
python scripts/pict_helper.py generate config.json
# Format PICT tool output as markdown table
python scripts/pict_helper.py format output.txt
# Parse PICT output to JSON
python scripts/pict_helper.py parse output.txt
実際のテストケースを生成するには、ユーザーは次の手順を実行できます:
- PICT モデルをファイルに保存します(例:
model.txt) - 次のようなオンライン PICT ツールを使用します:
- または、PICT をローカルにインストールします(references/pict_syntax.md を参照)
4. 期待される出力を決定する
生成された各テストケースについて、次の内容に基づいて期待される結果を決定します:
- ビジネス要件
- コードのロジック
- 有効/無効な組み合わせ
各テストケースに対応する期待される出力の一覧を作成します。
5. 完全なテストスイートを整形する
次の内容をユーザーに提示します:
- PICT モデル - パラメーターと制約を含む完全なモデル
- Markdown テーブル - テスト番号付きのテストケース
- 期待される出力 - 各テストケースの期待される結果
出力形式
次の構成で結果を提示します:
## PICT Model
```
# Parameters
Parameter1: Value1, Value2, Value3
Parameter2: ValueA, ValueB
# Constraints
IF [Parameter1] = "Value1" THEN [Parameter2] = "ValueA";
```
## Generated Test Cases
| Test # | Parameter1 | Parameter2 | Expected Output |
| --- | --- | --- | --- |
| 1 | Value1 | ValueA | Success |
| 2 | Value2 | ValueB | Success |
| 3 | Value1 | ValueB | Error: Invalid combination |
...
## Test Case Summary
- Total test cases: N
- Coverage: Pairwise (all 2-way combinations)
- Constraints applied: N
ベストプラクティス
パラメーターの特定
推奨:
- 説明的な名前を使用します:
AuthMethod、UserRole、PaymentType - 同値分割を適用します:
FileSize: Small, Medium, Large(FileSize: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10ではなく) - 境界値を含めます:
Age: 0, 17, 18, 65, 66 - エラーテスト用に負の値を追加します:
Amount: ~-1, 0, 100, ~999999
避けること:
- 汎用的な名前:
Param1、Value1、V1 - 分割せずに値を増やしすぎること
- エッジケースの不足
制約の記述
推奨:
- 理由を記載します:
# Safari only available on MacOS - シンプルな状態から始め、段階的に追加します
- 制約が想定どおりに機能することをテストします
避けること:
- 制約を厳しくしすぎること(有効な組み合わせを排除しすぎます)
- 制約が不十分なこと(無効なテストケースが生成されます)
- 明確な説明のない複雑なネストロジック
期待される出力の定義
具体的に記述します:
- 「ログインに成功し、ユーザーはダッシュボードにリダイレクトされる」
- 「HTTP 400: 認証情報が無効です」
- 「2FA プロンプトが表示される」
曖昧な表現は避けます:
- 「動作する」
- 「エラー」
- 「成功」
スケーラビリティ
大規模なパラメーターセットの場合:
- 異なる次数の関連パラメーターをグループ化するには、サブモデルを使用します
- 関連のない機能には、個別のテストスイートを検討します
- 次数 2(ペアワイズ)から始め、重要な組み合わせでは次数を上げます
- 一般的に、ペアワイズテストでは全数テストに比べてテストケースを 80~90% 削減できます
よくあるパターン
Web フォームのテスト
parameters = {
"Name": ["Valid", "Empty", "TooLong"],
"Email": ["Valid", "Invalid", "Empty"],
"Password": ["Strong", "Weak", "Empty"],
"Terms": ["Accepted", "NotAccepted"]
}
constraints = [
'IF [Terms] = "NotAccepted" THEN [Name] = "Valid"', # Test validation even if terms not accepted
]
API エンドポイントのテスト
parameters = {
"HTTPMethod": ["GET", "POST", "PUT", "DELETE"],
"Authentication": ["Valid", "Invalid", "Missing"],
"ContentType": ["JSON", "XML", "FormData"],
"PayloadSize": ["Empty", "Small", "Large"]
}
constraints = [
'IF [HTTPMethod] = "GET" THEN [PayloadSize] = "Empty"',
'IF [Authentication] = "Missing" THEN [HTTPMethod] IN {GET, POST}'
]
構成のテスト
parameters = {
"Environment": ["Dev", "Staging", "Production"],
"CacheEnabled": ["True", "False"],
"LogLevel": ["Debug", "Info", "Error"],
"Database": ["SQLite", "PostgreSQL", "MySQL"]
}
constraints = [
'IF [Environment] = "Production" THEN [LogLevel] <> "Debug"',
'IF [Database] = "SQLite" THEN [Environment] = "Dev"'
]
トラブルシューティング
テストケースが生成されない
- 制約が厳しすぎないか確認します
- 制約の構文を確認します(
;で終わる必要があります) - 制約内のパラメーター名が定義と一致していることを確認します(
[ParameterName]を使用します)
テストケースが多すぎる
- 高次ではなく、次数 2(ペアワイズ)を使用していることを確認します
- サブモデルへの分割を検討します
- パラメーターを独立したテストスイートに分けられるか確認します
出力に無効な組み合わせが含まれる
- 不足している制約を追加します
- 制約ロジックが正しいことを確認します
NOTまたは<>演算子を使用する必要があるか確認します
スクリプトエラー
- pypict がインストールされていることを確認します:
pip install pypict --break-system-packages - Python のバージョンを確認します(3.7 以上)
- モデルの構文が有効であることを確認します
参考資料
- references/pict_syntax.md - 文法と演算子を含む、PICT 構文の完全なリファレンス
- references/examples.md - さまざまな分野の包括的な実例
- scripts/pict_helper.py - モデル生成と出力形式の調整に使う Python ユーティリティ
- PICT GitHub リポジトリ - PICT の公式ドキュメント
- pypict ドキュメント - Python バインディングのドキュメント
- オンライン PICT ツール - Web ベースの PICT ジェネレーター
例
例 1: シンプルな関数のテスト
ユーザーのリクエスト: 「2 つの数値を受け取り、結果を返す除算関数のテストを設計してください。」
分析:
- パラメーター: 被除数(数値)、除数(数値)
- 値: 同値分割と境界値を使用します
- 数値: 負の値、ゼロ、正の値、大きな値
- 制約: ゼロ除算は無効です
- 期待される出力: 結果またはエラー
PICT モデル:
Dividend: -10, 0, 10, 1000
Divisor: ~0, -5, 1, 5, 100
IF [Divisor] = "0" THEN [Dividend] = "10";
テストケース:
| テスト番号 | 被除数 | 除数 | 期待される出力 |
|---|---|---|---|
| 1 | 10 | 0 | エラー: ゼロ除算 |
| 2 | -10 | 1 | -10.0 |
| 3 | 0 | -5 | 0.0 |
| 4 | 1000 | 5 | 200.0 |
| 5 | 10 | 100 | 0.1 |
例 2: E コマースのチェックアウト
ユーザーのリクエスト: 「支払い方法、配送オプション、ユーザー種別を含むチェックアウトフローのテストを設計してください。」
分析:
- 支払い: クレジットカード、PayPal、銀行振込(ユーザー種別によって制限されます)
- 配送: 通常、速達、翌日
- ユーザー: ゲスト、登録ユーザー、プレミアム
- 制約: ゲストは銀行振込を使用できません。プレミアムユーザーは速達が無料です
PICT モデル:
PaymentMethod: CreditCard, PayPal, BankTransfer
ShippingMethod: Standard, Express, Overnight
UserType: Guest, Registered, Premium
IF [UserType] = "Guest" THEN [PaymentMethod] <> "BankTransfer";
IF [UserType] = "Premium" AND [ShippingMethod] = "Express" THEN [PaymentMethod] IN {CreditCard, PayPal};
出力: 有効な支払い方法、配送、ユーザーのすべての組み合わせと、想定される費用および結果を網羅する 12~15 件のテストケース。