Files
jcl-cobol-data-create/docs/superpowers/specs/2026-07-12-testdata-agent-design.md
T
2026-07-12 14:54:50 +08:00

8.9 KiB
Raw Blame History

COBOL 测试数据生成 Agent 设计文档

背景

旧 COBOL 项目通过 Java 重写。需要基于 Python 新建一个测试数据生成 Agent,根据详细设计书自动生成 COBOL 程序的测试数据(JSON/SQL),通过 DeepSeek v4 Flash API 由 AI 生成具体数据内容。


架构概览

采用线性管道架构,模块化设计,便于后续追加规则和维护:

InputParser → RuleLoader → PromptBuilder → APIClient → OutputWriter
  • Python 侧:负责解析结构化信息、建立映射关系、组装 prompt
  • AI 侧:接收 prompt,根据规则生成具体的测试数据 JSON/SQL

目录结构

D:\jcl-cobol-data-create/
├── agent/
│   ├── __init__.py
│   ├── input_parser.py      # 输入解析器
│   ├── rule_loader.py       # 规则加载器
│   ├── prompt_builder.py    # Prompt 构建器
│   ├── api_client.py        # API 客户端(DeepSeek
│   └── output_writer.py     # 输出写入器
├── rules/
│   ├── pgm_pattern/         # PGM模式规则 .md
│   │   ├── マッチング(1-1).md
│   │   ├── マッチング(1-N).md
│   │   └── ...(后续追加,无需改代码)
│   └── special_feature/     # 特殊功能规则 .md
│       └── 条件分支.md
├── layout/                  # 文档模板(参考用)
│   └── JSON格式说明v2.0.md
├── output/                  # 生成输出(运行时自动创建)
│   └── {プログラムID}/
│       ├── g1/
│       └── g2/
├── main.py                  # CLI 入口 + generate() 库函数
├── requirements.txt
└── README.md

模块详细设计

1. InputParser(输入解析器)

职责:解析所有输入文件,提取结构化数据。

输入

  • a 詳細設計書 .md
  • b ソース .cbl 文本文件
  • c 文件/DB 构造 .md(文件定義書 + COPY句定義書)
  • d COPY 存放路径
  • e DB 结构 .md

输出:结构化的程序元数据对象,包含:

1.1 基本情報

  • プログラムID, プログラム名, PGMタイプ(メイン/サブ), PGMパターン
  • 解析方法:定位 # 行 列 = PGMパターン 的行,取 内容 列的值

1.2 使用ファイル一覧

  • 每个文件的:識別子, DD名, I/O, COPY群, 媒体(PS=文件, DB=DB
  • 判定输入类型:遍历 I/O="I" 的行,根据 媒体 列判定
    • 全是 PS → 文件输入
    • 包含 DB → DB 输入
    • 都有 → 混合输入

1.3 COPYBOOK 解析 + REPLACING 映射

  • 从 .cbl 源码的 FD 块中提取 COPY xxx REPLACING ==(A)== BY ==識別子==
  • 建立映射:識別子(R01) → COPY名(ZAN01REC) → 替换前缀(R01-)
  • 读取 COPYBOOK 文件,应用 (A) → 前缀替换,得到实际字段名和 PIC 定义
  • 输出示例:R01-APPL-ID | X(8) | 8

1.4 キー項目一覧

  • 排序条件、匹配键信息

1.5 処理詳細

  • 完整原文(不做解析,保留原样)

1.6 出力レコード定義

  • 输出文件的项目定义和设定元信息

1.7 DB 定义(如涉及)

  • 从 DB 定义书 .md 中提取表的字段定义、类型、PK 信息

2. RuleLoader(规则加载器)

职责:根据程序特征匹配对应的数据生成规则。

2.1 PGM 模式规则匹配

PGMパターン 值到规则文件名的映射:

PGMパターン 规则文件
マッチング(1:1) マッチング(1-1).md
マッチング(1:N) マッチング(1-N).md
マッチング(M:N) (待添加)
レイアウト編集のみ(GETPUT) (待添加)
項目チェック (待添加)
振り分け (待添加)
キーブレイク (待添加)
キーブレイク(集計、集約) (待添加)
DB更新 (待添加)
  • 未找到对应规则 → 报错并列出缺失的模式名
  • 读取匹配到的 .md 全文
  • 从规则中解析:组数、每组用途、每组的数据生成方法

2.2 特殊功能检测

扫描 処理詳細 文本,根据预设关键词自动检测:

特殊功能 检测关键词 规则文件
条件分支 場合, EVALUATE, IF 条件分支.md
  • 扩展方式:在检测表中追加行,同时在 rules/special_feature/ 下添加对应 .md

3. PromptBuilderPrompt 构建器)

职责:将前两个模块的所有信息组装成结构化 API prompt。

Prompt 结构

## 程序基本情報
- 程序ID: ZAN04MAT
- 程序名: 取消マッチング処理
- PGMパターン: マッチング(1:1)
- 输入类型: 文件

## 処理詳細
(詳細設計書の処理詳細全文)

## 入力ファイル/DB 構造
### 文件R01 (DD名: ZAN04R01, COPY: ZAN01REC)
| 字段名 | PIC | 字节数 |
| R01-APPL-ID | X(8) | 8 |
| R01-EMP-ID | X(8) | 8 |
...

## DBテーブル構造(如有)
### 表名: LEAVE_RECORDS
| 字段名 | 类型 | 最大长 | KEY |
...
- 主键: APPLICATION_ID

## 出力レコード定義
(詳細設計書の出力レコード定義全文)

## データ生成ルール
(匹配到的PGM模式规则 .md 全文)

## 特殊機能ルール(如有)
(条件分支.md 全文)

## 出力形式
- 文件输入类型 → JSON格式(遵循以下规则)
- DB输入类型 → SQL INSERT语句

### 字段值规则(PIC → JSON表示)
| PIC | JSON表示 | 例 |
|-----|---------|-----|
| PIC X(n) | 左对齐 + 空格填充 | "A0000001" |
| PIC 9(n) | 右对齐 + 前补零 | "00000101" |
| PIC S9(n) COMP-3 | 十进制数字 | "1234" |
| PIC S9(n) COMP | 十进制数字 | "300" |
| FILLER(纯保留) | 有辨识性模式 | "D000...001" |
| FILLER(业务保留) | 全空格或全零 | |

- COMP/COMP-3 类型字段输出**普通十进制数字符串**,不做特殊转换
- 字段名含语义关键词时(如 DATE="日期"、NAME="姓名")生成符合实际含义的值

## 生成指示
- 需要生成的グループ数: 3
- 各グループの内容:
  - g1: 两端不匹配
  - g2: 反向两端不匹配
  - g3: 中间不匹配
- 出力: JSON(文件输入)

4. APIClientAPI 客户端)

职责:调用 DeepSeek API,含重试逻辑。

API 配置

请求结构

{
  "model": "deepseek-v4-flash",
  "messages": [
    {
      "role": "system",
      "content": "你是COBOL程序测试数据生成专家。请严格按照规则生成测试数据。输出必须是可直接解析的JSON,不要包在markdown代码块中。"
    },
    {
      "role": "user",
      "content": "<PromptBuilder生成的完整prompt>"
    }
  ],
  "temperature": 0.3,
  "max_tokens": 8192
}

重试逻辑(最多 3 次):

for i in 1..3:
    发送请求
    if 网络错误 || API返回错误:
        continue  # 重试
    if JSON解析失败:
        将错误信息追加到prompt中,重试
    if 成功:
        break
  • 3 次全部失败 → 报错退出

5. OutputWriter(输出写入器)

职责:将 AI 返回的 JSON/SQL 保存为文件。

输出规则

  • 文件输入 → output/{プログラムID}/g{组号}/{プログラムID}_g{组号}.json
  • DB 输入 → output/{プログラムID}/g{组号}/{プログラムID}_g{组号}.sql
  • 混合输入 → 同文件夹下同时输出 .json.sql

输出格式

  • JSON:遵循 JSON格式说明v2.0.md 规范,每个文件内含 records 数组
  • SQL:标准 INSERT 语句
output/ZAN04MAT/
├── g1/
│   └── ZAN04MAT_g1.json
├── g2/
│   └── ZAN04MAT_g2.json
└── g3/
    └── ZAN04MAT_g3.json

验证:写入前校验 JSON 合法性,不合法时返回错误给 APIClient 触发重试。


6. main.py(入口)

CLI 调用

python main.py \
  --design "詳細設計書_ZAN04MAT.md" \
  --source "src/ZAN04MAT.cbl" \
  --cpy "cpy/" \
  --db-def "DB定義書.md" \
  --output "output/"

库调用

from agent import generate

result = generate(
    design_md="詳細設計書_ZAN04MAT.md",
    source_cbl="src/ZAN04MAT.cbl",
    cpy_dir="cpy/",
    db_def_md="DB定義書.md",
    output_dir="output/"
)

依赖

  • Python 3.9+
  • requests — HTTP 客户端
  • openai 或直接用 requests 调用 DeepSeek 兼容 API
requests>=2.28.0

扩展指南

追加 PGM 模式规则

  1. rules/pgm_pattern/ 下创建新的 .md 文件
  2. 文件名与 PGMパターン 值按约定匹配
  3. 无需修改 Python 代码

追加特殊功能检测

  1. 在 RuleLoader 的检测映射表中追加一行 (关键词列表, 对应规则文件)
  2. rules/special_feature/ 下创建对应 .md
  3. 需要改一行 Python 代码(添加映射条目)