50995d3335
- SETUP.md: 完整环境搭建指南(同事用) - SETUP_QUICK.md: 快速搭环境(4步) - s22~s26: TNA端到端、覆盖率报告、回归检查 - procedure_grammar.lark: 实验性Lark语法 Co-Authored-By: Claude <noreply@anthropic.com>
235 lines
11 KiB
Markdown
235 lines
11 KiB
Markdown
# 测试流程更新与程序分类追加 变更报告
|
||
|
||
> 基于 `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 行 |
|