8.9 KiB
8.9 KiB
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詳細設計書 .mdbソース .cbl 文本文件c文件/DB 构造 .md(文件定義書 + COPY句定義書)dCOPY 存放路径eDB 结构 .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. PromptBuilder(Prompt 构建器)
职责:将前两个模块的所有信息组装成结构化 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. APIClient(API 客户端)
职责:调用 DeepSeek API,含重试逻辑。
API 配置:
- 地址:https://api.deepseek.com/chat/completions
- 模型:
deepseek-v4-flash - API Key:
sk-6156cccdc9c14d949cf5bfc5afc67a03 - timeout:120 秒
请求结构:
{
"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 模式规则
- 在
rules/pgm_pattern/下创建新的 .md 文件 - 文件名与 PGMパターン 值按约定匹配
- 无需修改 Python 代码
追加特殊功能检测
- 在 RuleLoader 的检测映射表中追加一行
(关键词列表, 对应规则文件) - 在
rules/special_feature/下创建对应 .md - 需要改一行 Python 代码(添加映射条目)