# 测试流程更新与程序分类追加 变更报告 > 基于 `docs/enhanced-test-design.md` v3 > 对比基准: 当前 `v3-gstack-code-gen` 管线的实际行为 --- ## 一、测试流程更新 ### 变更前 ``` COPYBOOK → Agent1(COPYBOOK解析) → Agent2(LLM盲生成测试数据) ← 不知道分支结构,随机生成5-10条边界值 → DataWriter(写入文件) → Runners(编译运行 COBOL + Java) → Comparator(逐字段比对) → Agent3(差异诊断) → Report(仅字段比对结果) ``` **PASS 的含义**: COBOL 和 Java 对这 5-10 条数据的输出一致。 **不知道的事**: 分支覆盖率 0%、HINA 类型未识别、程序是否有未测试路径。 ### 变更后 ``` ┌── 新增: 结构提取 ─────────┐ │ cobol_testgen.extract │ │ _structure() │ │ → 分支树 + 结构摘要 │ └──────────┬─────────────────┘ │ ┌── 新增: 类型判定 ─────────┐ │ HINA Agent │ │ → HINA类型 + 確信度 │ │ + 策略参数 │ └──────────┬─────────────────┘ │ ┌── 原有的 ──────────┐ ┌── 替换: 数据生成 ───────┐ │ Agent1(COPYBOOK) │ │ cobol_testgen │ │ → FieldTree │ │ .generate_data(分支树) │ └────────────────────┘ │ → 路径覆盖的基础数据 │ │ │ ├── 策略 Agent(补充) ──────┤ │ → 语义化 + 边界 + 必须项 │ └──────────┬─────────────────┘ │ ┌── 新增: 质量门禁 ───────┐ │ 决策点≥95%? │ │ 段落=100%? │ │ HINA必须项=100%? │ │ 不通过→增量补充(最多4次) │ └──────────┬─────────────────┘ │ ┌── 原有的 ──────────┐ ┌── 新增: 动态覆盖 ───────┐ │ DataWriter │ │ gcov采集 │ │ Runners │ │ 交叉验证(静态vs动态) │ │ Comparator │ └──────────┬─────────────────┘ │ Agent3 │ │ └────────────────────┘ ┌── 增强: 报告 ──────────┐ │ 字段比对(原有) │ │ 覆盖率(新增) │ │ HINA情報(新增) │ │ 质量评分(新增) │ │ 重试历史(新增) │ └──────────────────────────┘ ``` ### 流程变化对照表 | 环节 | 变更前 | 变更后 | 变化类型 | |:-----|:-------|:-------|:---------| | **结构分析** | 无 | cobol_testgen.extract_structure() | **新增** | | **类型判定** | 无(所有程序统一处理) | HINA Agent(33+2种类型) | **新增** | | **测试数据生成** | Agent2(LLM) 盲生成5-10条 | cobol_testgen 规则枚举路径 + 策略Agent语义补充 | **替换** | | **数据质量检查** | 无 | 质量门禁(覆盖率/HINA/边界) | **新增** | | **退回机制** | 无(线性流程,失败即阻断) | 增量补充循环(最多4次) | **新增** | | **编译运行** | cobc + javac | 同左 + 可选 `-fprofile-arcs` | **增强** | | **覆盖率** | 无 | 静态分析(cobol_testgen) + 动态(gcov) + 交叉验证 | **新增** | | **字段比对** | Comparator | 同左 | **不变** | | **差异诊断** | Agent3 | 同左 | **不变** | | **报告** | 仅字段比对 | 字段比对 + 覆盖率 + HINA + 质量评分 + 重试历史 | **增强** | | **重试** | 简单重试(仅Agent) | 分层重试(heal_retry / simple_retry) | **增强** | ### 阶段引入计划 | Phase | 引入的变更 | 优先级 | |:------|:-----------|:------:| | **Phase 1** | cobol_testgen 集成、静态覆盖率门禁、分层重试 | P0 | | **Phase 2** | HINA Agent、策略 Agent、质量门禁全维度 | P1 | | **Phase 3** | gcov 动态覆盖、交叉验证 | P2 | | **Phase 4** | 增强报告(HINA/质量评分/重试历史) | P2 | --- ## 二、程序分类追加(HINA 分类) ### 变更前 **无程序分类。** 管线不识别程序类型。Agent2(LLM) 收到 FieldTree 后对所有程序使用同一套"生成边界值"的策略,不知道这个程序是匹配系还是键中断系还是条件分支系。 ### 变更后 **新增完整的 HINA 程序分类体系,33+2 种类型覆盖所有 COBOL 批处理程序模式。** ### 分类体系 | 大分類 | 包含类型数 | 包含的 HINA 编号 | |:-------|:---------:|:----------------| | マッチング系(匹配逻辑) | 9 | 001-003, 016-020, 022 | | キーブレイク系(键中断) | 5 | 007-008, 110, 112-113 | | 条件分岐系(条件分支) | 2 | 005-006 | | 編集処理系(编辑处理) | 3 | 004, 015, 021 | | データベース系(数据库) | 3 | 009, 101, 104 | | データ分割系(数据切分) | 3 | 010-012 | | 項目チェック系(字段校验) | 3 | 013, 105, 111 | | 内部処理系(内部处理) | 4 | 102-103, 108-109 | | オンライン系(联机程序) | 1 | 014 | | **追加: SORT/MERGE** | 2 | (HINA未覆盖但实务必须) | | **合计** | **35** | | ### 判定方式 | 判定层 | 方法 | 覆盖类型数 | 確信度 | |:-------|:-----|:----------:|:------:| | **L1 关键字识别** | 正则匹配独占关键字 | 11类 | 90-99% | | **L2 结构提取** | 从 cobol_testgen 输出提取特征 | (为L3提供输入) | — | | **L3 混淆组判定** | Agent(LLM) 解决8个混淆组 | 剩余类型 | 70-95% | ### L1 关键字识别的 11 类 | 类型 | 判定关键字 | 確信度 | |:-----|:----------|:------:| | DB操作 | `EXEC SQL` | 95% | | 子程序调用 | `CALL` + `LINKAGE SECTION` | 90% | | IS INITIAL | `IS INITIAL` | 99% | | SYSIN | `SYSIN` | 90% | | 编码转换 | `ALPHABETIC`/`ASCII`/`EBCDIC` | 85% | | online | `DFHCOMMAREA`/`MAP` | 95% | | SORT | `SORT ON KEY` | 95% | | MERGE | `MERGE ON KEY` | 95% | | 编辑输出 | `WRITE AFTER/BEFORE` | 80% | | 文件编成 | `ORGANIZATION IS` | 99% | | 替代索引 | `ALTERNATE RECORD KEY` | 99% | ### Agent 解决的 8 个混淆组 | 混淆组 | 共同关键字 | Agent 判定依据 | |:-------|:----------|:--------------| | 匹配 vs key切 | `IF KEY =` | SELECT数≥2 → 匹配;有WS-PREV-KEY+累加器 → key切 | | 校验(含重复) vs 不含重复 | `IF` + 字段检查 | WS-PREV-KEY存在 → 含重复;无 → 不含重复 | | 校验(含重复) vs key切 | WS-PREV-KEY | 后续MOVE错误消息 → 校验;ADD/COMPUTE → key切 | | CSV→FB(无换行) vs 有换行 | INSPECT/STRING | STRING合并 → 无换行;INSPECT REPLACING改行 → 有换行 | | 纯匹配 vs 二级匹配 | 匹配结构 | OPEN→CLOSE→再OPEN的中间文件 → 二级 | | 纯匹配 vs 混合 | 3路IF | 匹配分支内有额外键比较 → 混合 | | 分割(50/25/100) | DIVIDE/MULTIPLY | 被除数=50/25/100 判定 | | M:N 子模式(M/N/M×N) | 3路IF+2输入 | 代码静态只能判定"M:N结构存在",子模式需测试验证 | ### 判定确信度计算 ``` 確信度 = 基礎確信度 × 上下文因子 × 一致性因子 × 構造一致性因子 阈值: ≥90% → 自动判定,进入管线 70-89% → 自动判定 + 报告标记"需确认" <70% → 阻断,要求人工指定类型 ``` ### 分类策略模板映射 每种类型对应一组必须覆盖的测试项。以匹配系为例: ```python "マッチング(1:N)": { "required": [ "MT-N001: 1:1 主键完全匹配", "MT-N002: 1:N 主1件从N件", "MT-N004: 主件有剩余键", "MT-N005: 从件有剩余键", "MT-N006: 主键值重复", "MT-N007: 键值未排序", "COM-N001: 最小数据1条", "COM-N002: 标准数据多条", "COM-A002: 全部0件", "COM-A003: 部分0件", ], "special_boundaries": [ "不平衡: 主1件从100万件", "不平衡: 主100万件从1件", ], } ``` ### Phase 2 优先覆盖的类型 按 jcl-cobol-git(信用卡月结系统)的实际程序需求排列: | 优先順位 | 类型 | 涉及的程序 | |:--------:|:-----|:----------| | **1** | マッチング系(M:N) | GENDATA, CRDVAL, CRDCALC | | **2** | キーブレイク系 | CRDCALC, CRDRPT | | **3** | 内部表検索 | CRDVAL, CRDCALC | | **4** | 条件分岐系 | 全プログラム | | **5** | 項目チェック系 | CRDVAL | --- ## 三、变更的影响 ### 对用户(迁移工程师)的影响 | 用户感知 | 变更前 | 变更后 | |:---------|:-------|:-------| | 报告的通过条件 | 字段全部一致 → PASS | 字段一致 + 覆盖率达标 → PASS | | 覆盖率信息 | 无 | 段落/分支/决策点覆盖率(数字+未覆盖清单)| | 程序分类信息 | 无 | HINA 类型 + 確信度 | | 质量评分 | 无 | 0-100 综合评分 | | 失败时的信息 | 仅编译错误或 mismatch | 覆盖率不足/类型判定低确信等具体原因 | | 等待时间 | ~1分钟 | 约 1-2 分钟(增加结构分析+Agent判定) | ### 对系统内部的影响 | 组件 | 影响 | 代码变更量 | |:-----|:-----|:----------| | `orchestrator.py` | 替换 Agent2 一步为多步循环流程 | ~30 行 | | `cobol_testgen/` | 封装为 API,暴露 3 个入口 | ~50 行(新增函数) | | `agents/agent2_data.py` | Phase 2 替换为策略 Agent | 新增 `hina/` 包 | | `runners/cobol_runner.py` | 新增可选编译参数 | ~2 行 | | `report/generator.py` | 新增 3 个报告维度 | ~80 行 | | 新增 `hina/` 包 | 5 个新模块 | ~1500 行 | | 其他(runners/comparator/web/worker) | **不变** | 0 行 |