16 KiB
16 KiB
COBOL テストデータ生成 Agent
COBOL プログラムの詳細設計書・COPYBOOK・ソースコードを解析し、DeepSeek v4 Flash API を使ってテストデータ(JSON/SQL)を自動生成する Python ツール。
クイックスタート
# インストール
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) |
ライブラリとしての利用
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)
{
"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)
-- 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 プログラムが正しい全キー項目で比較していることを検証する。
ルール追加方法
rules/pgm_pattern/に新しい.mdファイルを作成agent/rule_loader.pyのPGM_PATTERN_MAPにエントリを追加- コード変更不要、ルール .md ファイル追加のみで拡張可能
ルールマッチング: まず PGM_PATTERN_MAP 完全一致 → なければルールファイル名(.md 除く)が PGM パターン文字列内に含まれるかチェック。
全プログラム実行コマンド
# マッチング(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 応答速度に依存)。