284 lines
12 KiB
Markdown
284 lines
12 KiB
Markdown
# 增强测试系统 — 全面测试计划 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%** |
|