diff --git a/.claude/rules/testing.md b/.claude/rules/testing.md index 3356866..7a500cf 100644 --- a/.claude/rules/testing.md +++ b/.claude/rules/testing.md @@ -101,7 +101,7 @@ 層②のテストは,カメラの代わりに偽カメラ(`SelfTest/SelfTestCamera`.`CameraBase` の派生)を,フォームの代わりにヘッドレス `Form1`(`Form1.SelfTest.cs`)を使う.どちらも `SELFTEST` フラグ(Debug 系の構成のみ)でコンパイルされるため,層②のテストも `#if SELFTEST` で囲む. -- **STA スレッドで動かす**: WinForms のコントロールと `Control.Invoke` は STA スレッドとメッセージ処理を必要とする.テストは共通ハーネス(PLAN_05 フェーズ 1 で作成)を通して,STA スレッド上でヘッドレス `Form1` を生成し,`SelfTestStart` でハンドルを作ってから使う.ハーネスを経由せずに個別のテストでスレッドやメッセージ処理を組まない +- **STA スレッドで動かす**: WinForms のコントロールと `Control.Invoke` は STA スレッドとメッセージ処理を必要とする.テストは共通ハーネス(`TIASshot.Tests/IntegrationHarness.cs`.使用例は `CameraBaseSaveIntegrationTests`)を通して,STA スレッド上でヘッドレス `Form1` を生成し,`SelfTestStart` でハンドルを作ってから使う.ハーネスを経由せずに個別のテストでスレッドやメッセージ処理を組まない - **待機には必ずタイムアウトを付ける**: 「条件が満たされるまでメッセージを処理して待つ」処理は無限待ちにしない.タイムアウトしたらテストを失敗させ,ハングで後続のテストを止めない.層②の各テストには **1 件あたり 15 秒**のタイムアウトを付ける - **実行時間の目安**: 層②のテスト全体で **30 秒以内**を目安にする.テスト用の一時設定では校正フレーム数(`Calib/Frames`)等を小さくし,1 件あたり 1 秒前後で終わるようにする.目安を超えそうなときは,テストを減らしたり `/verify` から外したりせず,テスト用設定を見直して速くする(`/auto-audit` は修正 1 件ごとにテスト一式を何度も回すため,ここが延びると全作業が遅くなる) - **観測はアクセサ経由で行う**: 結果は `Form1.SelfTest.cs` のアクセサ(`SelfTestMessage`・`SelfTestLastError`・`SelfTestShotsEnabled` 等)と,保存されたファイルで確かめる.`Form1` の private フィールドをリフレクションで読まない.足りないアクセサは `Form1.SelfTest.cs` に追加する diff --git a/CLAUDE.md b/CLAUDE.md index 7e76617..2698151 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -4,7 +4,7 @@ ## 開発進捗 -最新: /auto-audit(全観点)で見つけたバグ 7 件を再現テスト付きで修正し main に取り込んだ(要対応 26 件は報告台帳) +最新: PLAN_05 フェーズ 1 として層②テストの共通ハーネスを作り,保存失敗が成功扱いになる不具合を赤→緑で修正した ※ 本欄は**最新ステップ 1 行のみ上書き更新**.詳細な進捗履歴(動機・設計判断・失敗パターン)は [docs/PROGRESS.md](docs/PROGRESS.md) に追記する.運用ルールは `.claude/rules/progress-log.md` を参照(該当ファイル編集時に自動ロードされる). ## 必須ルール(コード実装時) diff --git "a/docs/02_ENV/ENV_04_\351\226\213\347\231\272\343\202\263\343\203\236\343\203\263\343\203\211.md" "b/docs/02_ENV/ENV_04_\351\226\213\347\231\272\343\202\263\343\203\236\343\203\263\343\203\211.md" index e277d85..c29a8e9 100644 --- "a/docs/02_ENV/ENV_04_\351\226\213\347\231\272\343\202\263\343\203\236\343\203\263\343\203\211.md" +++ "b/docs/02_ENV/ENV_04_\351\226\213\347\231\272\343\202\263\343\203\236\343\203\263\343\203\211.md" @@ -56,6 +56,17 @@ - ネイティブ DLL を x64 でロードするため `/Platform:x64` は必須. - Visual Studio 上ではテストエクスプローラーから実行できる(プラットフォームを x64 にすること). +カテゴリで絞り込んで実行する(開発中の確認用.判定には全件実行を使う). + +```powershell +# 層②(結合ロジック)のテストだけ実行する +& $vstest "TIASshot.Tests\bin\x64\Debug\TIASshot.Tests.dll" /Platform:x64 "/TestCaseFilter:TestCategory=Integration" +# メモリ量で判定するテストを除いて実行する(環境による不安定さを切り分けるとき) +& $vstest "TIASshot.Tests\bin\x64\Debug\TIASshot.Tests.dll" /Platform:x64 "/TestCaseFilter:TestCategory!=Memory" +``` + +- 層②のテストは `SELFTEST` フラグに依存するため,Debug 構成でのみコンパイル・実行される. + ## クリーン環境での検証 (Clean Verification) **ベースライン計測・マージ前検証・「テストが通ることの確認」は,必ず `bin` / `obj` を削除してから行う.** diff --git "a/docs/03_PLAN/PLAN_05_\343\203\206\343\202\271\343\203\210\347\266\262\347\276\205\346\200\247\345\220\221\344\270\212\350\250\210\347\224\273.md" "b/docs/03_PLAN/PLAN_05_\343\203\206\343\202\271\343\203\210\347\266\262\347\276\205\346\200\247\345\220\221\344\270\212\350\250\210\347\224\273.md" index 1c0b156..e181f4b 100644 --- "a/docs/03_PLAN/PLAN_05_\343\203\206\343\202\271\343\203\210\347\266\262\347\276\205\346\200\247\345\220\221\344\270\212\350\250\210\347\224\273.md" +++ "b/docs/03_PLAN/PLAN_05_\343\203\206\343\202\271\343\203\210\347\266\262\347\276\205\346\200\247\345\220\221\344\270\212\350\250\210\347\224\273.md" @@ -72,6 +72,11 @@ - ハーネスを使うテストが 3 回連続で安定して緑になる - 層②の各テストに 15 秒のタイムアウトが付いている - Release ビルドに影響しない(`SELFTEST` は Debug 系のみ) +- **状態: 完了(2026-10-06)** + - ハーネスは `TIASshot.Tests/IntegrationHarness.cs`.一時 config の作成と待機処理は `TIASshot/SelfTest/SelfTestConfig.cs`・`SelfTestPump.cs` に切り出し,セルフテストのランナーと共用する + - 試作テスト `CameraBaseSaveIntegrationTests`(保存成功・単発の保存失敗・連続撮影の途中の保存失敗)は 3 回連続で緑.保存失敗の 2 件は修正前のコードで赤になることを確認した.層② 3 件の所要時間は計約 5 秒 + - 失敗の注入は,偽カメラの派生で保存先と同名のフォルダを作り `Cv2.ImWrite` に false を返させる方法をとった(例外ではなく false になることを単体テストで固定している) + - 引き続き残る課題: `CalcTcc` の校正画像の保存失敗は「自動校正完了」と表示される(失敗時に校正済みとするかが仕様判断のため未修正) ### フェーズ 2: 層②の拡充 diff --git "a/docs/06_TEST/TEST_01_\343\203\206\343\202\271\343\203\210\344\273\225\346\247\230.md" "b/docs/06_TEST/TEST_01_\343\203\206\343\202\271\343\203\210\344\273\225\346\247\230.md" index f43d319..402c489 100644 --- "a/docs/06_TEST/TEST_01_\343\203\206\343\202\271\343\203\210\344\273\225\346\247\230.md" +++ "b/docs/06_TEST/TEST_01_\343\203\206\343\202\271\343\203\210\344\273\225\346\247\230.md" @@ -7,6 +7,7 @@ テストの種類: - ビルドテスト: コンパイルエラーがないことを確認する +- 結合ロジックテスト: 偽カメラとヘッドレス Form1 で,撮影・保存の流れと失敗時の通知を NUnit で自動確認する(`[Category("Integration")]`.方針は `.claude/rules/testing.md`,移行計画は [PLAN_05](../03_PLAN/PLAN_05_テスト網羅性向上計画.md)) - 回帰テスト: リファクタリング前後の出力が一致することを確認する - セルフテスト: 実機なしで依存ロード・プレビュー経路・校正〜保存を自動確認する(手動テストの前段) - 手動テスト: 実機を使って動作を目視確認する @@ -19,6 +20,18 @@ - **合格条件**: 終了コード 0(`deps`・`preview`・`calib-save` の 3 項目が PASS) - 代替していない範囲(実カメラ SDK との結合・実プレビュー表示・実チャートの検出性能・画像の見た目・長時間のメモリ/GDI)は,引き続き下記の手動テストで確認する +## 結合ロジックテスト (Integration Logic Tests) + +NUnit の全件実行に含まれる(ENV_04 の「テスト」.カテゴリで絞る場合は `TestCategory=Integration`).現在のケース: + +| テスト | 確認内容 | +| --- | --- | +| `CameraBaseSaveIntegrationTests`(単発・保存成功) | 撮影画像・sRGB 変換画像・Info.csv が保存され,「全ての画像保存完了」が表示され,撮影ボタンが再び有効になる | +| `CameraBaseSaveIntegrationTests`(単発・撮影画像の保存失敗) | 保存失敗が通知され,「全ての画像保存完了」が表示されず,撮影ボタンが再び有効になる | +| `CameraBaseSaveIntegrationTests`(連続 3 枚・2 枚目の保存失敗) | 同上 | + +- **合格条件**: 全件緑.新しいケースを追加したときは,取り込む前に 3 回連続で緑になることを確認する + ## ビルドテスト (Build Test) 全フェーズで実施する. diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index d3e2068..697df28 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -173,3 +173,8 @@ - 注意: 追加したリーク再現テストのうち 2 件は環境に依存しうる(OpenCV 内部の参照カウントのオフセット読み取り,プライベートメモリ増分のしきい値判定).OpenCvSharp の更新時や別マシンで落ちたら見直す(PLAN_05 で `[Category("Memory")]` に分ける予定). - 後段: 要対応のうち重大度「中」(保存失敗が成功扱い・終了時のハングや画像の取りこぼし・校正例外がコールバックへ素通り・起動時の設定エラー・光源ポート使用中)は PLAN_05 のフェーズ 1〜3 で対応する. + +- [x] **PLAN_05 フェーズ 1: 層②テストの共通ハーネスと保存失敗の修正** (2026-10-06): テストプロジェクトに WinForms 参照を足し,偽カメラ+ヘッドレス `Form1` を STA スレッドで動かす共通ハーネスを作った.最初の利用例として,画像の保存に失敗しても「全ての画像保存完了」と表示されていた不具合(`/auto-audit` 報告)を,修正前に赤になる結合テストで確認したうえで修正した. + - 設計判断: 一時 config の作成と DoEvents による待機はセルフテストのランナーから切り出し,ハーネスと共用した(2 か所で同じ待機処理を持たない).失敗の注入は,偽カメラの派生で保存先と同名のフォルダを作って `ImWrite` に false を返させる方法にした.保存フォルダ自体を消す案は Info.csv の作成も失敗させて別の経路に乗り,SaveThread との競合で結果も不安定になるため採らなかった. + - 失敗パターン: 修正を一時的に戻して赤を確認したあと,ファイルを書き戻すときに更新日時が古いまま残り,MSBuild が再コンパイルせず全体テストが誤って赤になった.ファイルを戻したら更新日時も更新するか,クリーンビルドしてから判定する. + - 後段: `CalcTcc` の校正画像の保存失敗(仕様判断待ち).tester・refactorer エージェントはこのプロジェクトの MSBuild / vstest を実行できず,ビルドとテストはオーケストレーターが代行している.