Files
cobol-java-v3/docs/changelog-test-flow.md
NB-076 50995d3335 chore: SETUP.md + 测试报告脚本 + 文档更新
- SETUP.md: 完整环境搭建指南(同事用)
- SETUP_QUICK.md: 快速搭环境(4步)
- s22~s26: TNA端到端、覆盖率报告、回归检查
- procedure_grammar.lark: 实验性Lark语法

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-25 08:50:17 +08:00

11 KiB
Raw Permalink Blame History

测试流程更新与程序分类追加 变更报告

基于 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 Agent33+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% → 阻断,要求人工指定类型

分类策略模板映射

每种类型对应一组必须覆盖的测试项。以匹配系为例:

"マッチング(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 行