# V3系统总体设计 > 版本: v1.1 | 日期: 2026-08-24 > 本文档描述COBOL迁移验证平台V3的总体架构和模块设计。 --- ## 一、系统概述 ### 1.1 系统定位 COBOL迁移验证平台V3是一个AI辅助的自动化测试工具,用于验证COBOL程序向Java/Spark迁移的正确性。通过**白盒+黑盒双管道**自动生成测试数据,实现全分支路径覆盖验证。 ### 1.2 核心能力 | 能力 | 说明 | |------|------| | 白盒分析 | 静态解析COBOL源码,自动识别分支路径,生成覆盖全路径的测试数据 | | 黑盒生成 | 解析設計書自动识别程序模式(16种PGMパターン),LLM生成テストデータ | | 双管道验证 | 白盒+黑盒并行运行,分别验证COBOL和Java/Spark输出 | | 覆盖率分析 | 静态分支覆盖 + 动态gcov覆盖 | | 多KEY测试 | 自动验证复合KEY的比较正确性 | ### 1.3 技术栈 | 组件 | 技术 | |------|------| | 语言 | Python 3.12+ | | 解析器 | Lark (Earley parser) | | COBOL编译 | GnuCOBOL 3.2.0 | | DB管道 | gixsql + SQLite | | AI模型 | DeepSeek | | 测试框架 | pytest | --- ## 二、系统架构 ### 2.1 架构图 ``` ┌─────────────────────────────────────────────────────────────────┐ │ V3系统架构 │ ├─────────────────────────────────────────────────────────────────┤ │ │ │ ┌──────────────────────────────────────────────────────────┐ │ │ │ 统一入口 (run.py) │ │ │ │ 白盒 cobol_testgen → 黑盒 black-box-data-create │ │ │ └──────────────────────────────────────────────────────────┘ │ │ │ │ │ ┌────────────────────┴────────────────────┐ │ │ │ │ │ │ ▼ ▼ │ │ ┌──────────────────────────┐ ┌──────────────────────────┐ │ │ │ 白盒管道 │ │ 黑盒管道 │ │ │ │ cobol_testgen │ │ black-box-data-create │ │ │ │ (静态分析+测试数据) │ │ (設計書解析+LLM生成) │ │ │ └──────────────────────────┘ └──────────────────────────┘ │ │ │ │ │ │ ▼ ▼ │ │ ┌──────────────────────────┐ ┌──────────────────────────┐ │ │ │ 编排层 │ │ 规则层 │ │ │ │ orchestrator_db.py │ │ rules/pgm_pattern/ │ │ │ └──────────────────────────┘ └──────────────────────────┘ │ │ │ │ │ │ ▼ ▼ │ │ ┌──────────────────────────┐ ┌──────────────────────────┐ │ │ │ 运行引擎 │ │ LLM引擎 │ │ │ │ runners/gixsql_runner │ │ DeepSeek API │ │ │ └──────────────────────────┘ └──────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────────┘ ``` ### 2.2 分层架构 | 层级 | 模块 | 职责 | |------|------|------| | **L1 数据层** | data/ | 共享数据模型 | | **L2 核心层** | cobol_testgen/, config/ | COBOL解析、配置管理 | | **L3 业务层** | hina/, agents/, comparator/, black-box-data-create/ | 分类、AI代理、比对、黑盒生成 | | **L4 编排层** | orchestrator*, runners/ | 流程编排、执行 | | **L5 接口层** | main.py, run.py, web/, __init__.py | 用户接口 | --- ## 二-B、黑盒模块设计 ### 2B.1 模块概述 black-box-data-create 是基于詳細設計書的LLM数据生成模块,通过解析設計書/COPY句定義書/DB定義書,自动生成テストデータ。 ### 2B.2 处理流程 ``` 詳細設計書 + COPY句定義書 + DB定義書 + COBOL源码 │ ▼ InputParser: 解析設計書中的入出力定義、処理内容 │ ▼ RuleLoader: 按PGMパターン匹配规则文件 │ ▼ PromptBuilder: 组装DeepSeek API提示词 │ ▼ APIClient: 调用DeepSeek API生成テストデータ │ ▼ OutputWriter: 输出JSON/SQL文件 ``` ### 2B.3 PGMパターン | パターン | 说明 | 对应程序 | |----------|------|----------| | マッチング(1:1) | 1对1匹配 | KIN01INP, KIN02UPD | | マッチング(1:N) | 1对多匹配 | KIN03EXP | | マッチング(N:1) | 多对1匹配 | KIN04CHK | | DB更新 | 数据库更新 | KIN08DBU | | 振り分け(IF) | IF条件分支 | KIN05MAT | | 振り分け(EVALUATE) | EVALUATE分支 | KIN07DAI | | 項目チェック | 字段校验 | ZAN01CHK, ZAN02CHK | | キーブレイク(集計) | KEY-break汇总 | SHA01SIF | | キーブレイク(集約) | KEY-break聚合 | SHA02MNC | | SELECT処理 | SELECT查询 | KYU04CAL | | MERGE | 合并处理 | KIN06CLD | | CSV→FB変換 | CSV转flat file | KIN09CSV | ### 2B.4 多KEY测试 对于复合KEY程序(如 A001+A002+A003),自动生成各KEY变形的追加データ: | 变形类型 | 说明 | |----------|------| | KEY1変更 | 仅改变KEY1,验证KEY1比较正确性 | | KEY2変更 | 仅改变KEY2,验证KEY2比较正确性 | | KEY3変更 | 仅改变KEY3,验证KEY3比较正确性 | ### 2B.5 模块文件 | 文件 | 职责 | |------|------| | agent/__init__.py | generate() 入口 | | agent/models.py | 数据クラス定義 | | agent/input_parser.py | 設計書 + COPYBOOK + DB定義解析 | | agent/rule_loader.py | PGMパターン→ルール匹配 | | agent/prompt_builder.py | API提示词组装 | | agent/api_client.py | DeepSeek API调用(3回重试) | | agent/output_writer.py | JSON/SQL文件输出 | | main.py | CLI入口 | --- ## 三、模块清单 ### 3.1 核心模块 | 模块 | 文件数 | 行数 | 职责 | |------|--------|------|------| | cobol_testgen/ | 22 | ~8000 | COBOL解析、白盒测试数据生成 | | black-box-data-create/ | 8 | ~5000 | 設計書解析、黑盒LLM数据生成 | | orchestrator_db.py | 1 | 1334 | DB管道6步编排 | | runners/ | 8 | ~600 | 编译运行引擎 | | hina/ | 11 | ~2000 | HINA程序分类 | | agents/ | 6 | ~800 | LLM代理 | | comparator/ | 6 | ~400 | 字段比对 | | config/ | 5 | ~300 | 配置管理 | | report/ | 1 | ~200 | 报告生成 | | run.py | 1 | 86 | 全流程统一入口 | ### 3.2 模块依赖关系 ``` models.py (零依赖) │ ├── read.py (lark) ├── cond.py (stdlib) ├── core.py (cond) ├── design.py (models, cond, core) ├── coverage.py (models, cond) ├── output.py (file_io) ├── to_sql.py (stdlib) ├── runner.py (file_io) ├── flatfile.py (read, file_io) │ └── __init__.py (所有上层模块) black-box-data-create/ │ ├── models.py (零依赖) ├── markdown_utils.py (stdlib) ├── input_parser.py (models, markdown_utils) ├── rule_loader.py (models) ├── prompt_builder.py (models) ├── api_client.py (requests) ├── output_writer.py (models) │ └── __init__.py (所有上层模块) ``` --- ## 四、数据流 ### 4.1 非DB管道数据流 ``` COBOL源码 │ ▼ read.py: preprocess() + parse_data_division() │ ▼ core.py: build_branch_tree() │ ▼ design.py: enum_paths() + generate_records() │ ▼ output.py: output_json() + output_input_files() │ ▼ runners/cobol_runner.py: compile() + run() │ ▼ comparator/: compare_field() │ ▼ report/generator.py: generate_report() ``` ### 4.2 DB管道数据流 ``` COBOL源码 (含EXEC SQL) │ ▼ gixsql_runner.py: preprocess() + compile() │ ▼ orchestrator_db.py: step2_generate_inputs() │ ├── cobol_testgen: extract_structure + generate_data ├── to_sql.py: build_db_input() └── flatfile.py: write_all_files() │ ▼ orchestrator_db.py: step3_run_cobol() │ ▼ orchestrator_db.py: step4_extract_intermediate() │ ▼ orchestrator_db.py: step5_run_java() (可选) │ ▼ orchestrator_db.py: step6_verify() ``` ### 4.3 黑盒管道数据流 ``` 詳細設計書.md │ ▼ input_parser.py: 解析設計書 + COPY句定義書 + DB定義書 │ ▼ rule_loader.py: PGMパターン匹配 → 选择规则文件 │ ▼ prompt_builder.py: 组装API提示词 │ ▼ api_client.py: DeepSeek API调用(3回重试) │ ▼ output_writer.py: 输出JSON/SQL文件 │ ▼ output/{プログラムID}/g{N}/{プログラムID}_g{N}.json output/{プログラムID}/g{N}/{プログラムID}_g{N}.sql ``` ### 4.4 全流程数据流(run.py) ``` run.py │ ├── 步骤1: cobol_testgen(白盒) │ ├── 静态分析 + 测试数据生成 │ ├── 编译运行 COBOL 程序 │ └── gcov 覆盖率收集 │ └── 步骤2: black-box-data-create(黑盒) ├── 解析設計書 + COPY + DB定義 ├── LLM 生成 JSON/SQL └── 输出到 output/{程序ID}/g{N}/ ``` --- ## 五、接口设计 ### 5.1 公开API ```python # cobol_testgen/__init__.py def extract_structure( cobol_source: str, copybook_dirs: list[str] = None ) -> dict: """解析COBOL源码,返回结构信息""" pass def generate_data( cobol_source: str, structure: dict, copybook_dirs: list[str] = None ) -> list[dict]: """生成分支覆盖测试数据""" pass def main(): """CLI入口""" pass ``` ```python # black-box-data-create/agent/__init__.py def generate( design_md: str, source_cbl: str, file_db_md: str, cpy_dir: str, db_md: str, output_dir: str = "output", api_key: str = None, model: str = None, rules_dir: str = None, ) -> dict: """黑盒数据生成入口""" pass ``` ### 5.2 配置接口 ```python # config/__init__.py @dataclass class Config: """全局配置""" project_name: str copybook_paths: list[str] dialect: str llm_model: str gcov_enabled: bool # ... 更多字段 ``` --- ## 六、错误处理 ### 6.1 错误分类 | 类别 | 示例 | 处理策略 | |------|------|----------| | 解析错误 | COBOL语法不合法 | 抛出异常,返回错误信息 | | 编译错误 | cobc编译失败 | 记录日志,跳过该程序 | | 运行错误 | 程序执行异常 | 捕获异常,标记失败 | | 超时错误 | 执行超时 | 强制终止,记录超时 | | API错误 | DeepSeek API调用失败 | 3回重试,失败后跳过 | | 設計書解析错误 | 設計書格式不正确 | 记录警告,使用默认值 | ### 6.2 容错机制 - **解析器超时**:pipeline_bridge 3秒超时回退 - **LLM失败**:回退到规则引擎 - **gcov失败**:跳过覆盖率收集 - **DB连接失败**:重试或跳过 - **API重试**:DeepSeek API 3回重试机制 - **JSON解析容错**:支持非标准JSON格式 --- ## 七、性能设计 ### 7.1 性能指标 | 指标 | 目标 | |------|------| | 单程序解析 | < 5秒 | | 测试数据生成 | < 30秒 | | 编译运行 | < 60秒 | | 覆盖率报告 | < 10秒 | | 黑盒数据生成 | < 120秒(含API调用) | ### 7.2 优化策略 - **路径枚举**:O(N)线性算法替代O(2^N) - **并行执行**:多场景gcov并行收集 - **缓存机制**:LLM结果缓存 - **增量补充**:质量门循环最多4次 - **API重试**:3回重试机制,避免单次失败 --- ## 八、安全设计 ### 8.1 输入验证 - COBOL源码:长度限制、编码检查 - 配置文件:YAML schema验证 - 文件路径:路径遍历防护 - 設計書:格式验证、大小写检查 ### 8.2 资源限制 - LLM调用:最大成本限制 - 执行时间:超时强制终止 - 内存使用:大文件分块处理 - API限流:避免超过API配额 --- ## 九、测试策略 ### 9.1 测试层次 | 层次 | 覆盖率目标 | 工具 | |------|------------|------| | 单元测试 | ≥ 90% | pytest | | 集成测试 | ≥ 80% | pytest | | 端到端测试 | 100%通过 | 自定义脚本 | ### 9.2 测试数据 - 43个COBOL基准程序 - 33+2种程序类型 - 58个电信测试程序 - 16种PGMパターン - 24个黑盒测试程序 --- ## 十、部署设计 ### 10.1 运行环境 | 组件 | 要求 | |------|------| | OS | Windows 10/11 | | Python | 3.12+ | | GnuCOBOL | 3.2.0 | | 磁盘 | ≥ 500MB | ### 10.2 安装步骤 ```bash # 1. 安装Python依赖 pip install lark pathlib pyyaml requests # 2. 安装GnuCOBOL # 下载GC32-BDB-SP1,添加到PATH # 3. 验证安装 python -c "from cobol_testgen import extract_structure; print('OK')" python -c "from blackbox.agent import generate; print('OK')" ```