259 lines
16 KiB
Markdown
259 lines
16 KiB
Markdown
# 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 応答速度に依存)。
|