Files
cobol-java-v3/docs/changelog-test-flow.md
T
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

235 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 测试流程更新与程序分类追加 变更报告
> 基于 `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% → 阻断,要求人工指定类型
```
### 分类策略模板映射
每种类型对应一组必须覆盖的测试项。以匹配系为例:
```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 行 |