# COBOL テストデータ生成 Agent COBOL プログラムの詳細設計書・COPYBOOK・ソースコードを解析し、DeepSeek v4 Flash API を使ってテストデータ(JSON/SQL)を自動生成する Python ツール。 ## クイックスタート ```bash # インストール pip install -r requirements.txt # テスト実行 python -m pytest tests/ -v # 単一プログラムのテストデータ生成 python main.py \ --design "D:\cobol-tna-system\詳細設計書\詳細設計書_ZAN04MAT.md" \ --source "D:\cobol-tna-system\src\ZAN04MAT.cbl" \ --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" \ --cpy "D:\cobol-tna-system\cpy" \ --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" \ --output "output" ``` | 引数 | 必須 | 説明 | |------|------|------| | `--design` | ✓ | 詳細設計書 .md のパス | | `--source` | ✓ | COBOL ソース .cbl のパス | | `--file-db-md` | ✓ | ファイル/DB 構造定義 .md のパス | | `--cpy` | ✓ | COPYBOOK 格納ディレクトリ | | `--db-md` | ✓ | DB 定義書 .md のパス | | `--output` | | 出力ディレクトリ(デフォルト: `output`) | | `--api-key` | | DeepSeek API Key | | `--model` | | モデル名(デフォルト: `deepseek-v4-flash`) | | `--rules` | | ルール格納ディレクトリ(デフォルト: `rules`) | ### ライブラリとしての利用 ```python from agent import generate result = generate( design_md="詳細設計書_ZAN04MAT.md", source_cbl="src/ZAN04MAT.cbl", file_db_md="COPY句定義書.md", cpy_dir="cpy/", db_md="DB定義書.md", output_dir="output/" ) # result = {"output_files": {...}, "program_id": "ZAN04MAT", "groups": 5, "input_type": "file"} ``` ## プロジェクト構造 ``` ├── agent/ # コアモジュール │ ├── __init__.py # generate() エントリポイント + 全エクスポート │ ├── models.py # データクラス定義(ProgramMeta, FileInfo, CopyField 等) │ ├── markdown_utils.py # Markdown テーブル解析ユーティリティ │ ├── input_parser.py # 設計書・COPYBOOK・DB定義の解析 │ ├── rule_loader.py # PGMパターン→ルールファイルのマッチング │ ├── prompt_builder.py # DeepSeek API プロンプト組立 │ ├── api_client.py # API 呼出 + 3回リトライ + JSON パース │ └── output_writer.py # JSON / SQL ファイル出力 ├── rules/ # データ生成ルール(.md ファイル) │ ├── pgm_pattern/ # PGMパターン別ルール │ │ ├── マッチング(1-1).md │ │ ├── マッチング(1-N).md │ │ ├── マッチング(N-1).md │ │ ├── DB更新.md │ │ ├── 振り分け.md │ │ ├── 項目チェック.md │ │ ├── レイアウト編集のみ(GETPUT).md │ │ ├── キーブレイク(集計).md │ │ ├── キーブレイク(集約).md │ │ ├── キーブレイク(集計、集約).md │ │ ├── SELECT処理.md │ │ ├── MERGE.md │ │ ├── 50分割.md │ │ ├── CSV→FB変換.md │ │ └── GETPUT(編集出力).md │ └── special_feature/ # 特殊機能ルール │ └── 条件分支.md ├── layout/ # ドキュメントテンプレート(参考) ├── tests/ # テストコード (48 tests) │ └── test_data/ # テストフィクスチャ ├── main.py # CLI エントリポイント ├── requirements.txt # 依存関係 ├── AGENTS.md # AI エージェント向け指示書 └── README.md ``` ## 処理フロー ``` [詳細設計書.md] ──┐ [ソース.cbl] ────┤ [COPYBOOK .cpy] ─┤ [DB定義書.md] ───┘ │ ▼ InputParser ──→ ProgramMeta(全メタデータ) │ ▼ RuleLoader ───→ ルール.md + 条件分支.md(該当時) │ ▼ PromptBuilder ─→ API プロンプト │ ▼ APIClient ────→ DeepSeek API(最大3回リトライ) │ ▼ OutputWriter ──→ output/{プログラムID}/g{N}/{プログラムID}_g{N}.json output/{プログラムID}/g{N}/{プログラムID}_g{N}.sql ``` ## 出力形式 ### 入力元がファイルの場合(JSON) ```json { "program": "ZAN04MAT", "records": [ { "input": { "ZAN04R01": { "R01-APPL-ID": "A0000001", "R01-EMP-ID": "00000001", "R01-APPL-DATE": "20250101", "R01-START-TIME": "0800", "R01-END-TIME": "1700", "R01-STATUS": "1", "R01-OVT-TYPE": "O", "R01-FILLER": " " }, "ZAN04R02": { "R02-APPL-ID": "A0000002", ... } } } ] } ``` ### 入力元が DB の場合(SQL) ```sql -- Group: 1 -- 用途: 正常INSERT + 多keyテスト INSERT INTO LEAVE_RECORDS (EMP_ID, LEAVE_TYPE, START_DATE, ...) VALUES ('00000001', '01', '20260101', ...), ('00000002', '02', '20260102', ...); ``` ### 出力ディレクトリ構成 ``` output/ └── ZAN04MAT/ ├── g1/ │ └── ZAN04MAT_g1.json ├── g2/ │ └── ZAN04MAT_g2.json └── g3/ └── ZAN04MAT_g3.json ``` ## 対応 PGM パターン | パターン | ルールファイル | カバー数 | 多keyテスト | |----------|---------------|----------|-------------| | マッチング(1:1) | マッチング(1-1).md | 1 | ✓ | | マッチング(1:N) | マッチング(1-N).md | 2 | ✓ | | マッチング(N:1) | マッチング(N-1).md | 1 | ✓ | | DB更新 | DB更新.md | 5 | ✓ | | 振り分け | 振り分け.md | 2 | — | | 項目チェック | 項目チェック.md | 2 | — | | GETPUT | レイアウト編集のみ(GETPUT).md | 3 | — | | キーブレイク(集計) | キーブレイク(集計).md | 2 | ✓ | | キーブレイク(集約) | キーブレイク(集約).md | 1 | ✓ | | キーブレイク(集計、集約) | キーブレイク(集計、集約).md | 1 | ✓ | | SELECT処理 | SELECT処理.md | 1 | ✓ | | MERGE | MERGE.md | 1 | ✓ | | 50分割 | 50分割.md | 1 | — | | CSV→FB変換 | CSV→FB変換.md | 1 | — | **合計: 24 プログラム対応** ### 多keyテストとは キーが複数項目(例: A001, A002, A003)で構成される場合、基準データの各キー項目を 1 つだけ変えた N 件の追加データを各グループ末尾に生成する。これにより COBOL プログラムが正しい全キー項目で比較していることを検証する。 ## ルール追加方法 1. `rules/pgm_pattern/` に新しい `.md` ファイルを作成 2. `agent/rule_loader.py` の `PGM_PATTERN_MAP` にエントリを追加 3. コード変更不要、ルール .md ファイル追加のみで拡張可能 ルールマッチング: まず `PGM_PATTERN_MAP` 完全一致 → なければルールファイル名(.md 除く)が PGM パターン文字列内に含まれるかチェック。 ## 全プログラム実行コマンド ```bash # マッチング(1:1) python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_ZAN04MAT.md" --source "D:\cobol-tna-system\src\ZAN04MAT.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output" # マッチング(1:N) python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_KIN05MAT.md" --source "D:\cobol-tna-system\src\KIN05MAT.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output" python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_KIN07DAI.md" --source "D:\cobol-tna-system\src\KIN07DAI.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output" # マッチング(N:1) python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_ZAN03CHK.md" --source "D:\cobol-tna-system\src\ZAN03CHK.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output" # DB更新 python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_KIN02UPD.md" --source "D:\cobol-tna-system\src\KIN02UPD.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output" python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_KIN08DBU.md" --source "D:\cobol-tna-system\src\KIN08DBU.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output" python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_KYU02REG.md" --source "D:\cobol-tna-system\src\KYU02REG.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output" python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_KYU06UPD.md" --source "D:\cobol-tna-system\src\KYU06UPD.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output" python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_ZAN06UPD.md" --source "D:\cobol-tna-system\src\ZAN06UPD.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output" # 振り分け python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_KIN01INP.md" --source "D:\cobol-tna-system\src\KIN01INP.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output" python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_ZAN01CHK.md" --source "D:\cobol-tna-system\src\ZAN01CHK.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output" # 項目チェック python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_ZAN02CHK.md" --source "D:\cobol-tna-system\src\ZAN02CHK.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output" python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_KIN04CHK.md" --source "D:\cobol-tna-system\src\KIN04CHK.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output" # GETPUT python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_KIN06CLD.md" --source "D:\cobol-tna-system\src\KIN06CLD.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output" python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_KYU08PRI.md" --source "D:\cobol-tna-system\src\KYU08PRI.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output" python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_KIN09CSV.md" --source "D:\cobol-tna-system\src\KIN09CSV.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output" # キーブレイク(集計) python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_KIN03EXP.md" --source "D:\cobol-tna-system\src\KIN03EXP.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output" python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_ZAN05CAL.md" --source "D:\cobol-tna-system\src\ZAN05CAL.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output" # キーブレイク(集約) python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_KYU03AGG.md" --source "D:\cobol-tna-system\src\KYU03AGG.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output" python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_KYU04CAL.md" --source "D:\cobol-tna-system\src\KYU04CAL.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output" # その他 python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_KYU05DED.md" --source "D:\cobol-tna-system\src\KYU05DED.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output" python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_KYU07DIV.md" --source "D:\cobol-tna-system\src\KYU07DIV.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output" python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_KYU09MRG.md" --source "D:\cobol-tna-system\src\KYU09MRG.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output" python main.py --design "D:\cobol-tna-system\詳細設計書\詳細設計書_KYU01CVT.md" --source "D:\cobol-tna-system\src\KYU01CVT.cbl" --file-db-md "D:\cobol-tna-system\詳細設計書\COPY句定義書.md" --cpy "D:\cobol-tna-system\cpy" --db-md "D:\cobol-tna-system\詳細設計書\DB定義書.md" --output "output" ``` ## 注意事項 - **API Key**: DeepSeek API キーは `agent/__init__.py` にハードコードされています。本番利用時は環境変数などに変更してください。 - **サブプログラム**: `PGMタイプ = サブ` のプログラムは処理対象外です。 - **全角/半角**: 詳細設計書内の PGMパターン表記には全角括弧 `()` と半角括弧 `()` のバリエーションがあります。`rule_loader.py` で両方対応済みです。 - **テスト**: 全 48 テストが `tests/test_data/` のフィクスチャを使って API を mock して動作します。 - **所要時間**: 24 プログラム全実行で約 26 分(DeepSeek API 応答速度に依存)。