PHPUnit テスト「再現しない」「原因が追えない」「修正が怖い」を解消。
症状・ログ・環境・関連コードを入力するだけで、最小再現ケース/原因分析/修正パッチ(diff)/自動テスト/検証手順/リスク評価/再発防止策を一気通貫で生成します。
現場の時間と手戻りを最小化する、プロダクション運用向けテンプレです。
できること
-
最小再現の自動作成(データ・コード・実行コマンド)
-
根本原因(Root Cause)と誘因の切り分け
-
修正パッチ(unified diff 形式 or 変更前後の比較)
-
回帰テストの自動生成と検証手順の提示
-
副作用・互換性・性能のリスク評価
-
再発防止(Lint/型/CI/監視ルール)を具体化
こんな人向け
-
SRE/アプリ開発者/QA:障害対応の初動を高速化したい方
-
テックリード/EM:変更の安全性と再発防止を標準化したい方
-
副業/個人開発:既存コードの原因究明から修正までを最短化したい方
対応スタック(例)
-
言語:Python / TypeScript(Node.js) / Go(他言語にも応用可)
-
テスト:pytest / Jest / Go test
-
環境:Linux / Docker / CI(GitHub Actions想定)
使い方(3ステップ)
-
入力テンプレに症状・ログ・環境・関連コードを貼付
-
完成形プロンプトをモデルに投入
-
提案されたパッチとテストを適用→CIで成功を確認
短縮運用のコツ
導入メリット
よくある質問(FAQ)
Q1. どのモデルで使えますか?
A. GPT / Claude / Geminiで動作を想定。長文・構造化出力に強いモデルが最適です。
Q2. ログが少ない場合は?
A. 入手可能な範囲で投入し、計測ポイントの追加案も本プロンプトが提示します。
Q3. 大規模変更になりそうで不安です。
A. まず最小差分パッチを提案し、必要時に代替案を併記します。
Q4. セキュリティ上の配慮は?
A. 機微情報はマスクし、再現データは疑似化して投入してください。
出力例
以下は、提示されたログ・コード・要件に基づいた不具合解析および修正提案の完全版です。
1. 事象サマリ
画像ロード処理 LoadImageAction において、resizeAndCrop() 呼び出し時に $origW に null が渡され、PHP 8 以降の厳格型宣言により TypeError が発生。結果として 500 エラーが返却される。特定の条件(例: 不正画像・メタ情報欠落)で再現し、画像アップロード機能全体に影響する可能性がある。
2. 最小再現ケース
再現用コード
// tests/Feature/ImageResizeTest.php
public function testResizeAndCropWithNullWidth()
{
$action = new \App\UseCases\Front\AttachmentFile\LoadImageAction();
$reflection = new \ReflectionClass($action);
$method = $reflection->getMethod('resizeAndCrop');
$method->setAccessible(true);
$tmpFile = tempnam(sys_get_temp_dir(), 'img');
imagejpeg(imagecreatetruecolor(100, 100), $tmpFile);
// 故意に $origW = null を渡す
$this->expectException(\TypeError::class);
$method->invoke($action, $tmpFile, null, 100, 50, IMAGETYPE_JPEG);
}
実行コマンド
php artisan test --filter=ImageResizeTest
期待ログ
失敗例(現状):
Argument #2 ($origW) must be of type int, null given
成功例(修正後):
例外発生せず、null または \GdImage が返却される。
3. 原因分析
一次原因
$origW に null が渡されるケースを考慮していない。
PHP 8+ では int 型指定が厳格にチェックされるため、型不一致で致命的エラー。
誘因
画像読み込み元 $imgTemp のメタデータ取得に失敗(例: getimagesize() が false を返す)が未検知のまま進行。
再現根拠
ログメッセージ:
Argument #2 ($origW) must be of type int, null given
該当コード:
$scaled = $this->resizeAndCrop($imgTemp, $origW, intval($origH), intval($width), $type);
この $origW が null であったことを示している。
4. 修正パッチ
unified diff
--- a/src/app/UseCases/Front/AttachmentFile/LoadImageAction.php
+++ b/src/app/UseCases/Front/AttachmentFile/LoadImageAction.php
@@ -110,7 +110,12 @@
$scaled = $this->resizeAndCrop($imgTemp, $origW, intval($origH), intval($width), $type);
private function resizeAndCrop(string $path, int $origW, int $origH, int $targetW, int $type): ?\GdImage
{
- $scale = $origW / $targetW;
+ // 型安全チェック(nullガード)
+ if ($origW <= 0 || $origH <= 0) {
+ \Log::warning(__METHOD__ . " invalid original size: W=$origW H=$origH path=$path");
+ return null;
+ }
+
+ $scale = $origW / $targetW;
$newH = intval($origH / $scale);
代替案
- 代替1: 型宣言を ?int に変更し null 許容 → 柔軟だが、呼び出し側の責任が不明確になるため非推奨。
- 代替2: $origW/$origH の取得関数で厳格検証 → 安全だが、呼び出し側修正範囲が拡大。
5. テスト追加
PHPUnit テスト
public function testResizeAndCropHandlesInvalidOriginalSizeGracefully()
{
$action = new \App\UseCases\Front\AttachmentFile\LoadImageAction();
$reflection = new \ReflectionClass($action);
$method = $reflection->getMethod('resizeAndCrop');
$method->setAccessible(true);
$tmpFile = tempnam(sys_get_temp_dir(), 'img');
imagejpeg(imagecreatetruecolor(100, 100), $tmpFile);
$result = $method->invoke($action, $tmpFile, 0, 0, 50, IMAGETYPE_JPEG);
$this->assertNull($result, 'Invalid original size should return null');
}
6. 検証手順
ローカル検証
php artisan test --filter=ImageResize
tail -n 10 storage/logs/laravel.log
CI確認
GitHub Actions / GitLab CI の PHPUnit ステップで追加テストが成功することを確認。
(必要に応じ laravel.log に warning 出力が追加されていることも確認)
7. リスク評価
| 項目 | 内容 |
|---|
| 副作用 | なし。nullを早期returnするのみ。 |
| 互換性 | 呼び出し側で null が返る可能性増加(要nullチェック)。 |
| 性能影響 | 無視できるレベル(単一条件分岐の追加のみ)。 |
| ロールバック方針 | エラー発生箇所特定済みのため単一ファイル差し戻しで復旧可。 |
8. 再発防止策
-
型検証CIルール
PHPStan/Psalmで「strict typeチェック」をCI必須化(例:psalm --taint-analysis)。
-
フェイルセーフ追加
getimagesize() 失敗時は $origW/$origH にデフォルト値を設定しログ記録。
-
例外監視
LaravelのApp\Exceptions\HandlerにてTypeError発生時の警告アラート(Slack/Datadog連携)。
-
入力検証ルール
ファイルアップロード直後にメタ情報の存在を検証するValidatorルール追加。
-
エラー分類ログ
warning ログに「画像メタ不整合」のカテゴリタグを付与し再発傾向を分析可能にする。
9. 変更サマリ(コミットメッセージ草案)
fix: handle null original image width in LoadImageAction::resizeAndCrop
- Added guard clause for invalid origW/origH
- Prevent TypeError when metadata missing
- Added warning log for traceability
- PHPUnit test verifying safe null return
以上の修正で、実行時に $origW が null の場合でも 500 エラーを防ぎ、安全にフェイルバック可能になります。