# 增强测试系统 — 全面测试计划 v1.0 > 日期: 2026-06-17 | 対象: feat/enhanced-test-phase1 > 測試范围: cobol_testgen API / HINA分类 / 质量门禁 / 分层重试 / 增强报告 --- ## 测试策略 ### 测试层次 ``` L1: ユニットテスト ─ 各関数の単体動作 (pytest, ~50 tests) ├── cobol_testgen API ├── HINA classifier ├── HINA strategy ├── quality gate ├── retry handler └── report generator L2: 結合テスト ─ モジュール間連携 (pytest, ~20 tests) ├── extract_structure → generate_data の一貫性 ├── generate_data → DataWriter の型整合 ├── HINA 分類 → 戦略テンプレート のマッピング └── quality gate → orchestrator のループ制御 L3: 統合テスト ─ パイプライン全体 (test-data/ 10 programs, ~10 tests) ├── HINA001: 1:1 マッチング ├── HINA005: IF条件分岐 ├── HINA025: CALL └── HINA101: EXEC SQL L4: 実COBOLプログラム (jcl-cobol-git/ 4 programs, ~4 tests) ├── CRDVAL / CRDCALC / CRDRPT / GENDATA └── 実際の金銭計算との一致確認 L5: レグレッションテスト ─ 既存42テストの完全通過 ``` ### テスト手法 | 手法 | 適用レベル | 説明 | |:-----|:----------|:------| | TDD (レッド・グリーン) | L1 | テストを先に書き、実装で通す | | ゴールデンテスト | L3-L4 | 既知の正解値との一致確認 | | ファジング | L2 | 不正なCOBOL入力に対する耐性 | | 境界値分析 | L1-L2 | PIC 桁数境界、空値、極大値 | | エラー注入 | L2 | LLM timeout/malformed response の動作確認 | | デグレードテスト | L2 | gcov failure/absence 時の降格確認 | | 静的カバレッジ | L1-L2 | cobol_testgen の静的パス網羅率 | --- ## L1: ユニットテスト ### 1.1 cobol_testgen API | # | テスト名 | 内容 | 入力 | 期待出力 | |:-:|:---------|:-----|:-----|:---------| | UT-01 | extract_structure: 空プログラム | 空文字列 | `{"total_branches": 0}` | | UT-02 | extract_structure: IF 1個 | `IF A > B ... ELSE ...` | branches=2, decisions=1 | | UT-03 | extract_structure: EVALUATE | `EVALUATE X WHEN 1 ... WHEN OTHER` | decisions=1, WHEN数確認 | | UT-04 | extract_structure: 複数ファイル | 3ファイルのプログラム | file_count=3 open_directions確認 | | UT-05 | extract_structure: CALL文 | `CALL 'SUBPGM'` | has_call=True | | UT-06 | extract_structure: SEARCH ALL | OCCURS+SEARCH ALL | has_search_all=True | | UT-07 | extract_structure: 固定形式 | 7桁目からコードの固定形式 | 正常解析(段落数>0) | | UT-08 | generate_data: 正常生成 | IFプログラム | 2件以上のデータ | | UT-09 | generate_data: 空プログラム | 分岐なし | 0件または1件 | | UT-10 | incremental_supplement: 差分生成 | 未カバーID指定 | IDに対応するデータのみ | | UT-11 | incremental_supplement: 存在しないID | [-1] | 空リスト | | UT-12 | check_coverage: 静的報告 | structureのみ | "note"に静的限界の記述 | | UT-13 | _cobol_testgen_to_testcases: 型変換 | list[dict] | list[TestCase] | ### 1.2 HINA Classifier | # | テスト名 | 内容 | 入力 | 期待出力 | |:-:|:---------|:-----|:-----|:---------| | HC-01 | L1: DB操作 | `EXEC SQL SELECT` | category="DB操作" ≥90% | | HC-02 | L1: 子程序调用 | `CALL 'SUBPGM' ... LINKAGE SECTION` | category="子程序调用" ≥90% | | HC-03 | L1: SORT | `SORT WORK-FILE ON KEY` | category="SORT" ≥90% | | HC-04 | L1: IS INITIAL | `PROGRAM-ID. X IS INITIAL.` | category="IS INITIAL" ≥90% | | HC-05 | L1: 编辑输出 | `WRITE AFTER ADVANCING` | category="编辑输出" ≥80% | | HC-06 | L1: 文件编成 | `ORGANIZATION IS` | category="文件编成" ≥90% | | HC-07 | L1: キーワード重複 | DB操作+CALL両方 | 最大確信度のキーワード勝ち | | HC-08 | compute_confidence: L1≥90% | L1のみ | method="keyword" | | HC-09 | compute_confidence: LLM結果 | LLM result | method="hybrid" | | HC-10 | compute_confidence: 両方なし | キーワード無し+LLM無し | category="unknown" confidence=0 | ### 1.3 HINA Strategy | # | テスト名 | 内容 | 期待出力 | |:-:|:---------|:-----|:---------| | HS-01 | get_strategy: マッチング | 9 required items | | HS-02 | get_strategy: キーブレイク | 6 required items | | HS-03 | get_strategy: 条件分岐 | 4 required items | | HS-04 | get_strategy: 未知のタイプ | 空テンプレート | | HS-05 | supplement: マーカー追加 | マーカーレコード含むlist | | HS-06 | supplement_only: 特定ギャップ | 指定IDのみのマーカー | ### 1.4 Quality Gate | # | テスト名 | 内容 | 入力 | 期待 | |:-:|:---------|:-----|:-----|:------| | QG-01 | 全通過 | branch≥95%, paragraph=100% | passed=True | | QG-02 | 分岐不足 | branch=80% | passed=False, decision_gaps有 | | QG-03 | 段落不足 | paragraph=0.5 | passed=False | | QG-04 | データ無し | empty list | passed=False, no_data=True | | QG-05 | スコア計算 | branch=0.92, para=1.0 | score=0.976 | 例: (1.0×0.5+0.92×0.5)×0.6+1.0×0.4=0.976 | ### 1.5 Retry Handler | # | テスト名 | 内容 | 期待 | |:-:|:---------|:-----|:------| | RH-01 | 即時PASS | 1回目でPASS | heal=0, simple=0 | | RH-02 | heal回復 | BLOCKED→環境修正→PASS | heal=1, simple=0 | | RH-03 | simple回復 | BLOCKED→リトライ→PASS | heal=0, simple=1 | | RH-04 | 上限超過 | 全てFAIL | status=FATAL | | RH-05 | QUALITY_WARNはリトライ不要 | QUALITY_WARN→即戻り | heal=0, simple=0 | ### 1.6 Report Generator | # | テスト名 | 内容 | 期待 | |:-:|:---------|:-----|:------| | RG-01 | generate_json: 新フィールド | VerificationRun全フィールド | JSONに全フィールド含む | | RG-02 | generate_html: カバレッジ表示 | paragraph_rate>0 | "段落覆盖率"表示 | | RG-03 | generate_html: HINA表示 | hina_type設定 | "判定类型"表示 | | RG-04 | generate_html: HINA非表示 | hina_type="" | HINAセクション無し | | RG-05 | generate_html: 品質スコア表示 | quality_score>0 | "质量评分"表示 | | RG-06 | generate_html: 品質スコア非表示 | quality_score=0 | 品質セクション無し | | RG-07 | generate_html: 警告表示 | quality_warn設定 | 警告バナー表示 | | RG-08 | generate_machine_json: 全フィールド | VerificationRun | branch_rate等を含む | | RG-09 | generate_json: 後方互換 | 新フィールド未設定 | 既存JSONと同じ構造 | --- ## L2: 結合テスト | # | テスト名 | シナリオ | 期待 | |:-:|:---------|:---------|:------| | CT-01 | extract→generate 一貫性 | 同一ソースでextract→generate | generate_dataがデータ生成可能 | | CT-02 | HINA→Strategy マッピング | マッチング分類→全マーカー生成 | 9個のマーカー | | CT-03 | QG→incremental ループ制御 | 分岐不足→supplement→再検査 | passed=Trueになる | | CT-04 | strategy→TestCase 型整合 | supplement出力→TestCase変換 | TestCaseオブジェクトとして利用可 | | CT-05 | orchestrator: 正常系 | cobol_testgen→HINA→QG→DataWriter | complete_testsがDataWriterに渡る | | CT-06 | orchestrator: LLM例外 | HINA Agentが例外発生 | エラーログ出力、パイプライン継続 | | CT-07 | orchestrator: gcov無効 | gcov_enabled=False | 動的カバレッジスキップ | | CT-08 | gcov_collector: 非インストール | gcovコマンド不在 | available=False | | CT-09 | gcov_collector: 正常 | .gcda/.gcno存在 | available=True, line_rate計算 | | CT-10 | Config: 品質ゲート設定 | aurak.toml変更→from_toml | quality_gate_mode=warn | --- ## L3: HINA 統合テスト test-data/cobol/HINA*.cbl の10プログラムを使用: | # | プログラム | 検証項目 | 期待 | |:-:|:----------|:---------|:------| | IT-01 | HINA001 | マッチング構造解析 | 段落≥8, ファイル≥2 | | IT-02 | HINA005 | IF分岐カバレッジ | 分岐≥6, 決定点≥3 | | IT-03 | HINA006 | EVALUATEカバレッジ | 分岐≥6, 決定点≥3 | | IT-04 | HINA007 | キーブレイク解析 | 段落≥3, ファイル≥2 | | IT-05 | HINA013 | 項目チェック解析 | 分岐≥6, 決定点≥3 | | IT-06 | HINA025 | L1分類+CALL解析 | HINA="子程序调用", confidence≥90% | | IT-07 | HINA101 | L1分類+SQL解析 | HINA="DB操作", confidence≥95% | | IT-08 | run_validation.py全実行 | 全HINAプログラム | 8/10 pass (既知制限2件) | --- ## L4: 実COBOLプログラム統合 jcl-cobol-git/ の4プログラムを使用: | # | プログラム | 検証項目 | 期待 | |:-:|:----------|:---------|:------| | RT-01 | CRDVAL | COPYBOOK展開+全パイプライン | エラー無し | | RT-02 | CRDCALC | 同上 | 同上 | | RT-03 | CRDRPT | 同上 | 同上 | | RT-04 | GENDATA | 同上 | 同上 | --- ## L5: レグレッションテスト | # | テスト | コマンド | 期待 | |:-:|:-------|:---------|:------| | RG-01 | comparator 全テスト | `pytest tests/comparator/ -v` | 22 passed | | RG-02 | report 全テスト | `pytest tests/report/ -v` | 3 passed | | RG-03 | golden 全テスト | `pytest tests/test_golden.py -v` | 11 passed | | RG-04 | e2e imports | `pytest tests/test_e2e.py -v` | 1 passed | | RG-05 | 全ユニット | `pytest tests/ --ignore=e2e/ --ignore=test_web_e2e.py --ignore=test_biz_e2e.py -v` | 42 passed | --- ## エッジケーステスト | # | シナリオ | 入力 | 期待 | |:-:|:---------|:-----|:------| | EC-01 | 空COBOL | `IDENTIFICATION DIVISION. PROGRAM-ID. X.` | エラー無し | | EC-02 | 巨大プログラム | 1万行レベル | タイムアウト無し(30秒以内) | | EC-03 | 日本語文字列 | PIC N 全角データ | extract正常 | | EC-04 | REDEFINES | REDEFINES使用プログラム | 正常解析 | | EC-05 | OCCURS DEPENDING | ODO使用 | 正常解析 | | EC-06 | 88-level値 | 88-level多数 | is_88=Trueで認識 | | EC-07 | コメントのみ | 全行コメント | エラー無し | | EC-08 | 不正PIC | `PIC X`の代わりに`PIC XXX` | 正常 | | EC-09 | 空ファイルパス | --cobol-srcで存在しないファイル | BLOCKED | | EC-10 | Lark文法エラー | 予期しない文字列 | 空構造、エラーログ出力 | --- ## エラー注入テスト | # | シナリオ | 注入方法 | 期待 | |:-:|:---------|:---------|:------| | EI-01 | LLMタイムアウト | LLMClient.call でtimeout | フォールバック実行、ログ出力 | | EI-02 | LLM不正JSON | 応答が無効JSON | _fallback_classification 使用 | | EI-03 | LLM空文字 | 応答が空文字 | 同上 | | EI-04 | gcovコマンド不在 | gcov利用不可 | available=False reason=gcov_not_installed | | EI-05 | gcov出力異常 | 不正な.gcovファイル | available=False reason=gcov_failed | | EI-06 | extract_structure 解析失敗 | Larkがパースできない入力 | 空構造返却、ログ出力 | | EI-07 | generate_data 空結果 | 分岐0のプログラム | 空リスト返却 | --- ## カバレッジ計測 ``` 目標カバレッジ (pytest --cov): cobol_testgen API: ≥ 80% (主要3関数) hina/classifier.py: ≥ 90% (L1ルール全カバー) hina/gate.py: ≥ 95% (全分岐) hina/retry.py: ≥ 90% (全リトライパス) report/generator.py: ≥ 70% (HTMLテンプレート網羅) ``` --- ## テスト実行計画 ### Phase A: ユニットテスト (並列実行可、~5分) ```bash # 1. 全ユニット pytest tests/ -v --ignore=tests/e2e/ --ignore=tests/test_web_e2e.py --ignore=tests/test_biz_e2e.py # 2. カバレッジ計測 pytest --cov=cobol_testgen --cov=hina --cov=report --cov=data tests/ -v ``` ### Phase B: HINA統合テスト (~2分) ```bash python test-data/run_validation.py ``` ### Phase C: レグレッション (~1分) ```bash python -m pytest tests/comparator/ tests/report/ tests/test_golden.py tests/test_e2e.py -v ``` ### Phase D: 実COBOLテスト (~5分、WSL + GnuCOBOL必要) ```bash # WSL側で実行 python3 -m pytest tests/test_golden.py -v ``` --- ## 期待結果サマリー | テスト種別 | 予定数 | 最低合格数 | 合格率目標 | |:----------|:------:|:----------:|:---------:| | L1 ユニット | ~45 | 45 | 100% | | L2 結合 | ~10 | 10 | 100% | | L3 HINA統合 | 8 | 8 | 100% | | L4 実COBOL | 4 | 4 | 100% | | L5 レグレッション | 42 | 42 | 100% | | エッジケース | 10 | 10 | 100% | | エラー注入 | 7 | 7 | 100% | | **総計** | **~126** | **126** | **100%** |